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 總覽 · 上一篇:機械臂物理模擬 · 下一篇:差速底盤物理模擬