Wiki
URDF與控制介面
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
本節沿用從零建立學習工作區的完整 URDF,不建立新包。重點是區分“模型關節”和“可被控制的介面”。
1.示例 1:同一個 joint 名稱為什麼出現兩次
模型層的 joint 定義父子 link、軸向、原點與運動限制;<ros2_control> 內的同名 joint 宣告硬體介面。
模型 joint1
→ 描述 base_link 与 link1 如何连接
ros2_control 中的 joint1
→ 声明 joint1/position 命令与 position、velocity 状态
名稱需要一致。框架不會根據“第一個關節”自動猜出你的 YAML 想控制誰。
2.示例 2:展開並檢查實際交給框架的 XML
source /opt/ros/humble/setup.bash
source ~/ros2_control_humble_ws/install/setup.bash
cd ~/ros2_control_humble_ws
xacro src/learn_control_hardware/urdf/mini.urdf > /tmp/mini_expanded.urdf
sed -n '1,180p' /tmp/mini_expanded.urdf
本例是普通 URDF,xacro 仍能處理。模擬章節會加入 $(find package),那時就必須先展開再交給使用 URDF 的程式。
2.1.關鍵欄位說明
| 欄位 | 意義 | 本教程示例 |
|---|---|---|
| ros2_control/name | 硬體元件名稱 | MiniSystem |
| ros2_control/type | 硬體元件類別 | system |
| hardware/plugin | pluginlib 查詢名稱 | mock_components/GenericSystem |
| joint/name | 關節名稱 | joint1 |
| command_interface/name | 要寫入的控制量 | position |
| state_interface/name | 可讀取的反饋量 | position、velocity |
MiniSystem 這個元件名稱與 joint1/position 介面名稱不是同一層概念。外掛名稱也不等於 C++ 類名:外掛 XML 建立兩者的對映。
3.示例 3:用故意寫錯的名稱認識錯誤邊界
先複製一份檔案供實驗:
cp src/learn_control_hardware/urdf/mini.urdf /tmp/mini_bad.urdf
sed -i 's/<joint name="joint1">/<joint name="missing_joint">/' /tmp/mini_bad.urdf
這裡只修改硬體標籤中的關節,模型關節仍叫 joint1。YAML與launch啟動過程學會啟動後,可以通過 model 引數載入這份檔案,觀察日誌。不要覆蓋正常模型。
錯誤可能在模型校驗或介面匹配階段出現;重點是定位失敗發生在哪一層,而不是死記某條日誌文字。
4.介面名稱是否意味著自動閉環
宣告 position 命令介面,表示控制器和硬體約定命令是位置。它不保證框架已為裝置實現位置 PID。真實驅動器可能自己閉環,也可能需要你實現控制演算法。
同樣,URDF 中 limit、介面引數 min/max 和控制器限速屬於不同配置位置。不能因為模型中寫了 limit,就認定每一種控制器、每一個硬體外掛都會自動執行相同限幅。後面的自編外掛會明確檢查和限制命令。
5.對應底層原始碼
閱讀 ros2_control/hardware_interface/src/component_parser.cpp 中 parse_control_resources_from_urdf() 及相關解析函式,再檢視 hardware_interface/hardware_info.hpp。觀察 XML 如何變成 HardwareInfo、關節列表和引數 map。
6.本節總結
控制器最終申請的是完整介面名,例如 joint1/position。URDF、硬體外掛匯出內容、控制器配置三者要一致,單獨把某一份檔案寫對還不夠。
返回 Humble 總覽 · 上一篇:從零建立學習工作區 · 下一篇:YAML與launch啟動過程