跳到正文

Wiki

DiffBot与差速底盘控制

约 5 分钟阅读

机械臂通常直接接收关节目标;差速底盘接收车体速度,再换算为左右轮目标。本节先看官方完整实例。

1.示例 1:启动官方 DiffBot

停止其它实例,打开只 source 官方 demos 的终端:

source /opt/ros/humble/setup.bash
source ~/ros2_control_demos_ws/install/setup.bash
ros2 launch ros2_control_demo_example_2 diffbot.launch.py gui:=false

另一个同样 source 的终端:

ros2 control list_controllers
ros2 control list_hardware_interfaces
ros2 topic info /cmd_vel -v
ros2 param get /diffbot_base_controller use_stamped_vel
ros2 param get /diffbot_base_controller open_loop

1.1.当前官方配置的两个重要细节

固定提交的启动文件把控制器 ~/cmd_vel 重映射到 /cmd_vel;控制器采用带时间戳的 TwistStamped 输入。配置中的 open_loop 为 true,里程计按命令积分,不是编码器闭环里程计。

教程差速底盘物理仿真会显式改为 open_loop: false,通过仿真轮子反馈计算里程计。必须先分清这两种结果来自哪里。

2.示例 2:连续发送带时间戳速度

ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/TwistStamped \
  "{header: auto, twist: {linear: {x: 0.05}, angular: {z: 0.0}}}"

header: auto 让 CLI 在发布时填写时间戳。持续发布约几秒后按 Ctrl+C,再观察超时停车。另一个终端执行:

ros2 topic echo /joint_states
ros2 topic echo /diffbot_base_controller/odom

2.1.预期现象

持续发送 0.05 m/s 的直行目标时,两轮位置应沿同一方向增加,里程计 x 应随时间增加。停止发布后,再观察命令超时和轮速变化。里程计数值取决于执行时长、限速和启动过程,验收时重点检查方向、趋势以及停车行为。

3.差速运动学怎样计算

设轮半径 r、轮距 b、车体线速度 v、角速度 w:

左轮角速度 = (v - w*b/2) / r
右轮角速度 = (v + w*b/2) / r

对下一章的 r=0.05 m、b=0.30 m:v=0.10 m/s、w=0 时两轮都是 2 rad/s;v=0、w=0.5 rad/s 时左右轮分别为 -1.5、1.5 rad/s。

这些数值只解释运动学。轮子安装方向、编码器符号和减速比不正确,真实设备仍会反向运动。

4.参数说明

参数 影响
wheel_radius 线速度与轮角速度换算,以及里程计尺度
wheel_separation 转弯与角速度计算
position_feedback 用轮位置差还是轮速度积分
open_loop 里程计取命令还是反馈
cmd_vel_timeout 命令多久后视为过期
use_stamped_vel 接收带时间戳还是无时间戳消息
enable_odom_tf 是否发布 odom 到 base 的变换

5.源码阅读路线

先看 ros2_control_demos/example_2/bringup/config/diffbot_controllers.yaml、ros2_control_demos/example_2/hardware/diffbot_system.cpp,再看 ros2_controllers/diff_drive_controller/src/diff_drive_controller.cpp 与 ros2_controllers/diff_drive_controller/src/odometry.cpp。重点定位超时处理、速度限制、左右轮换算与反馈里程计,不把每一行参数声明都当作控制算法。


返回 Humble 总览 · 上一篇:机械臂物理仿真 · 下一篇:差速底盘物理仿真