Wiki
DiffBot与差速底盘控制
机械臂通常直接接收关节目标;差速底盘接收车体速度,再换算为左右轮目标。本节先看官方完整实例。
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 总览 · 上一篇:机械臂物理仿真 · 下一篇:差速底盘物理仿真