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