Wiki
命令轉發與控制模式
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
命令接口定義物理語義,控制器定義目標怎樣變成接口值,硬件後端負責實際執行。
1.示例 1:位置命令轉發
ros2 topic pub --once /forward_position_controller/commands \
std_msgs/msg/Float64MultiArray "{data: [0.3, -0.2]}"
回調保存消息;update 檢查目標數量,再調用借用接口的 set_value。它沒有替每個設備自動設計 PID。
2.三種常用命令接口
| 接口 | 旋轉關節單位 | 後端通常需要完成什麼 |
|---|---|---|
| position | rad | 跟蹤位置目標 |
| velocity | rad/s | 跟蹤速度目標 |
| effort | N·m | 執行力矩目標 |
直線關節分別為 m、m/s、N。電流不等於力矩,設備協議傳電流時需要明確換算。
3.示例 2:為何只改 interface_name 不夠
TwoJointSystem 只提供 position 命令。將 YAML 改為 velocity 後,控制器無法取得不存在的資源。要支持速度模式,需要同時改變 URDF、設備實現、反饋處理和控制器配置。
完整速度模式實例見DiffBot與差速底盤控制。那裏差速控制器給輪子 velocity 命令,設備再返回位置與速度。
3.1.命令與反饋的閉環在哪裏
模擬硬件的響應來自 read 中的教學模型。位置伺服驅動器通常在設備內部閉環;effort 控制則可能要求上層根據反饋計算力矩。明確閉環位置後,才能選擇控制器。
4.示例 3:數組順序與非法輸入
Float64MultiArray 的數值順序對應 YAML 的 joints。兩個關節需要兩個目標。錯誤長度可能使控制器報告 ERROR;只能在模擬工程中做這種對照實驗,隨後檢查狀態並恢復。
自編控制器還會檢查 NaN 和範圍,見從零編寫控制器。消息類型只約束數據結構,不會自動驗證業務範圍。
源碼:ros2_controllers/forward_command_controller/src/forward_controllers_base.cpp。分別定位 on_configure、接口配置、on_activate 與 update,不把接收消息和下發設備命令混為同一步。
返回 Jazzy 總覽 · 上一篇:狀態廣播與機械人顯示 · 下一篇:Joint-Trajectory-Controller