跳到正文

Wiki

命令轉發與控制模式

約 3 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

命令介面定義物理語義,控制器定義目標怎樣變成介面值,硬體後端負責實際執行。

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