首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >差速底盘运动控制程序实例

差速底盘运动控制程序实例

作者头像
索旭东
发布2026-01-20 14:51:23
发布2026-01-20 14:51:23
1260
举报
文章被收录于专栏:具身小站具身小站

适用于树莓派/Arduino/STM32等平台

代码语言:javascript
复制
import time
import math

class Robot:
    def __init__(self):
        # 底盘参数
        self.wheel_radius = 0.05    # 轮子半径(米)
        self.wheel_distance = 0.30      # 两轮间距(米)

        # PID参数(需要根据实际调整)
        self.kp = 1.5
        self.ki = 0.2
        self.kd = 0.1

        # 状态变量
        self.left_speed = 0
        self.right_speed = 0
        self.x = 0
        self.y = 0
        self.theta = 0

        # 初始化控制器
        self.controller = DriveController()

    def set_target_velocity(self, linear, angular):
        """设置目标线速度和角速度"""
        dt = 0.01  # 控制周期,10ms

        # 获取控制量
        pwm_left, pwm_right = self.controller.update(
            linear, angular, dt
        )

        # 发送PWM信号到电机
        self.set_motor_pwm(pwm_left, pwm_right)

        # 更新位姿
        self.update_odometry(dt)

    def set_motor_pwm(self, left_pwm, right_pwm):
        """实际控制电机(根据硬件控制器实现)"""
        # 设置PWM输出
        # GPIO输出或电机驱动器控制
        pass

    def update_odometry(self, dt):
        """更新里程计(位置估计)"""
        # 从编码器获取实际轮速
        left_actual = self.get_left_speed()
        right_actual = self.get_right_speed()

        # 计算底盘速度
        v = (right_actual + left_actual) / 2
        omega = (right_actual - left_actual) / self.wheel_distance

        # 更新位置
        self.x += v * math.cos(self.theta) * dt
        self.y += v * math.sin(self.theta) * dt
        self.theta += omega * dt

        # 角度归一化
        self.theta = math.atan2(math.sin(self.theta), math.cos(self.theta))

    def run_trajectory(self, waypoints):
        """运行轨迹跟踪"""
        for (target_x, target_y) in waypoints:
            while True:
                # 计算控制量
                v, omega = self.trajectory_controller.move_to_point(
                    target_x, target_y
                )

                # 执行控制
                self.set_target_velocity(v, omega)

                # 检查是否到达
                dx = target_x - self.x
                dy = target_y - self.y
                if math.sqrt(dx*dx + dy*dy) < 0.02:  # 2cm容差
                    break

                time.sleep(0.01)  # 控制频率100Hz

# 使用示例
if __name__ == "__main__":
    robot = DifferentialDriveRobot()

    # 示例1:简单速度控制
    robot.set_target_velocity(0.5, 0)  # 以0.5m/s直行

    # 示例2:原地旋转
    robot.set_target_velocity(0, 1.0)  # 原地旋转

    # 示例3:轨迹跟踪
    waypoints = [(1, 0), (1, 1), (0, 1), (0, 0)]  # 矩形轨迹
    robot.run_trajectory(waypoints)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 具身小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档