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啓動過程