跳到正文

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