机器人模型至少服务于三件事:解释运动关系、判断碰撞、预测动力学。这些用途对数据精度的要求不同。显示出漂亮网格并不代表碰撞几何正确,碰撞检查通过也不代表惯量与执行器能力足以完成运动。
模型中的三套几何
URDF用link与joint构造机器人树,joint定义父子关系、轴向、原点和限位。visual用于显示,collision用于碰撞,inertial提供质量、质心与惯量。网格资源的尺度、轴向和原点错误,可能只在其中一条通路暴露。
随附one_joint.urdf描述一根长0.4米、宽高0.1米、质量1千克的均匀箱形连杆,绕z轴转动。质心位于连杆局部x=0.2米。绕质心的惯量按长方体公式计算:Ixx=(0.1²+0.1²)/12≈0.001667 kg·m²,Iyy=Izz≈0.014167 kg·m²。不能把绕关节轴的惯量直接填到质心惯量字段,必要时应使用平行轴定理转换。
模型定义正方向后,测试正关节角对应的实际运动方向。度/弧度、毫米/米混用,会让几何与控制同时失真。URDF教学与格式说明见ROS官方URDF教程源码。
从状态到TF
robot_state_publisher利用机器人描述和关节状态发布连杆之间的变换;关节状态需要来自仿真、驱动或明确标记的测试源。模型中的joint名称、JointState中的名称和控制器配置必须一致。
对于移动底盘,URDF内部的base_link→sensor只解决机身几何,map→odom→base_link还需要定位与里程计。不要让两个节点同时声称拥有同一条动态TF边。TF关系有多重来源、时间不一致时,图看起来连通也可能产生跳变。
ros2_control如何连接控制器与设备
controller manager按周期读取硬件状态、更新控制器、写入命令。硬件插件提供state interfaces和command interfaces;控制器申请所需接口,再把轨迹或参考值转换成这些接口上的命令。对同一个命令接口的资源占用需要管理,不能让两个控制器任意同时写。官方架构说明解释了controller manager、resource manager和硬件组件。
随附controllers.yaml申请joint1的位置命令、位置/速度状态,并声明关节状态广播器与轨迹控制器。update_rate: 100是配置目标,真实周期还取决于系统调度、驱动阻塞与计算耗时;它不是硬实时保证。
URDF使用mock_components/GenericSystem,它主要把命令镜像到状态,适合验证名称、资源与接口管线。它没有电机、电流、惯性、摩擦或接触物理,不能通过“mock中无误差”证明控制器性能。官方mock组件说明列出其能力与限制。
本页验证范围与练习
示例文件按Jazzy文档编写,只完成XML结构、名称及字段的静态检查;未运行ROS 2、未加载插件、未连接硬件。读者在相应环境中应先加载robot description,再配置controller manager、广播器和控制器,检查interface是否被正确申请,最后发送小幅目标。不同发行版的启动接口按该版本文档核对。
练习:把关节名只在YAML中改成joint2,预测失败发生在接口申请还是运动学计算;再把质心错设为原点,说明哪些显示结果可能仍正常、哪些动力学结果会错误。实际总线和固件实现属于硬件路线,本页只规定机器人侧的接口。