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启动过程