跳到正文

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