Wiki
命令轉發與常用控制接口
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
position、velocity、effort 是命令的物理含義;ForwardCommandController 主要負責把消息中的值交給指定接口。
1.示例 1:位置命令怎樣進入接口
保持 mini 運行:
ros2 topic pub --once /forward_position_controller/commands \
std_msgs/msg/Float64MultiArray "{data: [0.3, -0.2]}"
ros2 topic echo /joint_states --once
1.1.對照源碼閲讀順序
on_configure 创建 ~/commands 订阅
→ 回调将消息写入 realtime buffer
command_interface_configuration 返回 joints/interface_name
on_activate 取得并整理接口
update 从 realtime buffer 取消息
→ 检查数组长度
→ 对各命令接口 set_value
它沒有在這裏比較目標與關節反饋併為所有設備實現位置 PID。MiniSystem 的緩慢響應來自硬件模擬,而不是 ForwardCommandController 計算了電機力矩。
2.示例 2:認識三種接口
| 命令接口 | 旋轉關節常用單位 | 下游通常要實現什麼 |
|---|---|---|
| position | rad | 跟蹤位置,常由驅動器內部完成 |
| velocity | rad/s | 跟蹤角速度,常由驅動器速度環完成 |
| effort | N·m | 執行力矩或與設備協議映射 |
直線關節分別使用 m、m/s、N。電流不是通用意義上的 effort 數值,若協議傳電流,需要根據電機與傳動關係進行明確換算。
2.1.為什麼不能只把 interface_name 改成 velocity
MiniSystem 只導出 position 命令接口。控制器若申請 joint1/velocity,會找不到資源。要改為速度控制,必須同時修改 URDF 聲明、硬件導出、write 的語義,以及反饋更新算法。
下面是教學偽代碼,不是可直接替換的完整插件:
velocity_command = 控制器目标角速度
write:向驱动器发送角速度
read:从编码器读 position 和 velocity
模拟时可用 position += velocity * dt
3.示例 3:用現成底盤練習速度接口
在DiffBot與差速底盤控制中運行的 DiffBot 提供輪子 velocity 命令與 position/velocity 狀態。用那個完整實例學習速度模式,避免在當前雙關節工程中只改一個字符串。
3.1.數組長度為什麼重要
控制兩個關節就需要兩個目標。固定版本的 ForwardCommandController 在 update 中校驗長度,錯誤時返回 ERROR。故意發送錯誤長度可能觸發控制器錯誤處理,因此只在模擬工程中做,觀察後查看狀態並恢復或重啓實例。
4.本節總結
選接口是在約定命令語義,選控制器是在約定目標如何變成接口值,選硬件後端是在約定接口值如何作用於設備。
源碼:ros2_controllers/forward_command_controller/src/forward_controllers_base.cpp、ros2_controllers/position_controllers/src/joint_group_position_controller.cpp。位置組控制器複用了命令轉發機制,讀源碼時留意繼承與參數設置。
返回 Humble 總覽 · 上一篇:狀態廣播與機械人顯示 · 下一篇:Joint-Trajectory-Controller