Wiki
URDF与控制接口
Existing English translations were reused. 21 current source blocks remain in Simplified Chinese, without triggering paid translation.
本节沿用从零创建学习工作区的完整 URDF,不创建新包。重点是区分“模型关节”和“可被控制的接口”。
1.示例 1:同一个 joint 名称为什么出现两次
模型层的 joint 定义父子 link、轴向、原点与运动限制;<ros2_control> 内的同名 joint 声明硬件接口。
模型 joint1
→ 描述 base_link 与 link1 如何连接
ros2_control 中的 joint1
→ 声明 joint1/position 命令与 position、velocity 状态
名称需要一致。框架不会根据“第一个关节”自动猜出你的 YAML 想控制谁。
2.示例 2:展开并检查实际交给框架的 XML
source /opt/ros/humble/setup.bash
source ~/ros2_control_humble_ws/install/setup.bash
cd ~/ros2_control_humble_ws
xacro src/learn_control_hardware/urdf/mini.urdf > /tmp/mini_expanded.urdf
sed -n '1,180p' /tmp/mini_expanded.urdf
本例是普通 URDF,xacro 仍能处理。仿真章节会加入 $(find package),那时就必须先展开再交给使用 URDF 的程序。
2.1.关键字段说明
| 字段 | 意义 | 本教程示例 |
|---|---|---|
| ros2_control/name | 硬件组件名称 | MiniSystem |
| ros2_control/type | 硬件组件类别 | system |
| hardware/plugin | pluginlib 查找名称 | mock_components/GenericSystem |
| joint/name | 关节名称 | joint1 |
| command_interface/name | 要写入的控制量 | position |
| state_interface/name | 可读取的反馈量 | position、velocity |
MiniSystem 这个组件名称与 joint1/position 接口名称不是同一层概念。插件名称也不等于 C++ 类名:插件 XML 建立两者的映射。
3.示例 3:用故意写错的名称认识错误边界
先复制一份文件供实验:
cp src/learn_control_hardware/urdf/mini.urdf /tmp/mini_bad.urdf
sed -i 's/<joint name="joint1">/<joint name="missing_joint">/' /tmp/mini_bad.urdf
这里只修改硬件标签中的关节,模型关节仍叫 joint1。YAML与launch启动过程学会启动后,可以通过 model 参数加载这份文件,观察日志。不要覆盖正常模型。
错误可能在模型校验或接口匹配阶段出现;重点是定位失败发生在哪一层,而不是死记某条日志文字。
4.接口名称是否意味着自动闭环
声明 position 命令接口,表示控制器和硬件约定命令是位置。它不保证框架已为设备实现位置 PID。真实驱动器可能自己闭环,也可能需要你实现控制算法。
同样,URDF 中 limit、接口参数 min/max 和控制器限速属于不同配置位置。不能因为模型中写了 limit,就认定每一种控制器、每一个硬件插件都会自动执行相同限幅。后面的自编插件会明确检查和限制命令。
5.对应底层源码
阅读 ros2_control/hardware_interface/src/component_parser.cpp 中 parse_control_resources_from_urdf() 及相关解析函数,再查看 hardware_interface/hardware_info.hpp。观察 XML 如何变成 HardwareInfo、关节列表和参数 map。
6.Summary of this section
控制器最终申请的是完整接口名,例如 joint1/position。URDF、硬件插件导出内容、控制器配置三者要一致,单独把某一份文件写对还不够。
返回 Humble 总览 · 上一篇:从零创建学习工作区 · 下一篇:YAML与launch启动过程