Wiki
URDF與控制介面
約 4 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
模型中的 joint 定義連線關係,ros2_control 標籤中的同名 joint 宣告控制介面。兩者要對應,但承擔不同職責。
1.示例 1:逐項閱讀硬體標籤
沿用從零建立學習工作區的完整模型:
| 欄位 | 本例 | 解釋 |
|---|---|---|
| ros2_control/name | MiniSystem | 元件名稱,供硬體生命週期命令使用 |
| ros2_control/type | system | 元件類別 |
| hardware/plugin | mock_components/GenericSystem | pluginlib 查詢名稱 |
| joint/name | joint1、joint2 | 與模型關節對應 |
| command_interface | position | 控制器可寫的目標 |
| state_interface | position、velocity | 控制器與廣播器可讀的狀態 |
完整介面名為 joint1/position,而不是隻有 position。硬體元件名、外掛查詢名、C++ 類名和關節介面名是不同層次的名稱。
2.示例 2:檢視展開結果
source /opt/ros/jazzy/setup.bash
source ~/ros2_control_jazzy_ws/install/setup.bash
cd ~/ros2_control_jazzy_ws
xacro src/jazzy_control_hardware/urdf/two_joint.urdf > /tmp/two_joint_expanded.urdf
sed -n '1,180p' /tmp/two_joint_expanded.urdf
當前是普通 URDF,xacro 仍可處理。模擬章節會加入包路徑替換,此時需要先展開。
2.1.解析過程
XML 字符串
→ parse_control_resources_from_urdf
→ HardwareInfo、关节列表、接口描述与参数
→ 创建硬件组件
→ 根据描述创建接口
Jazzy 會檢查控制標籤中的關節是否存在於機器人模型中。名稱錯誤可能在模型校驗階段就被拒絕,而不是等到傳送命令才出問題。
3.示例 3:引數和限制的邊界
hardware 下的 param 是給裝置後端的配置;YAML 中的控制器引數是給控制器的配置。兩者不能因為名稱相同就互相替代。
URDF 的 joint limit、控制器的限速引數和裝置限幅也不等同。後端應明確自己接受什麼命令,不能只寫上模型限制就假定任意裝置都被保護。
原始碼:ros2_control/hardware_interface/src/component_parser.cpp和ros2_control/hardware_interface/include/hardware_interface/hardware_info.hpp。重點觀察 InterfaceDescription 怎樣保留完整名字與配置。
返回 Jazzy 總覽 · 上一篇:從零建立學習工作區 · 下一篇:YAML與spawner啟動過程