2. URDF机器人模型构建
任务目标
使用URDF(Unified Robot Description Format)创建一个三连杆机械臂模型,包含两个旋转关节,并在RViz中正确显示。该模型将作为后续视觉抓取案例的机器人基础。
环境依赖
- Ubuntu 20.04 / 22.04 + ROS Noetic / ROS2 Humble(本案例以ROS Noetic为例)
- 安装包:
ros-noetic-urdf-tutorial、ros-noetic-joint-state-publisher-gui、ros-noetic-rviz
URDF模型文件
创建文件 simple_arm.urdf,定义基座、连杆1、连杆2三个刚体,以及两个旋转关节。每个连杆使用圆柱体+颜色可视化,关节轴分别绕Y轴旋转。
<?xml version="1.0"?>
<robot name="simple_arm">
<!-- 基座 -->
<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.1 0.05"/>
</geometry>
<origin xyz="0 0 0.025" rpy="0 0 0"/>
<material name="gray">
<color rgba="0.5 0.5 0.5 1.0"/>
</material>
</visual>
</link>
<!-- 关节1:基座与连杆1 -->
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
</joint>
<!-- 连杆1 -->
<link name="link1">
<visual>
<geometry>
<cylinder radius="0.02" length="0.2"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<material name="blue">
<color rgba="0.2 0.4 0.8 1.0"/>
</material>
</visual>
</link>
<!-- 关节2:连杆1与连杆2 -->
<joint name="joint2" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="0 0 0.2" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
</joint>
<!-- 连杆2 -->
<link name="link2">
<visual>
<geometry>
<cylinder radius="0.02" length="0.15"/>
</geometry>
<origin xyz="0 0 0.075" rpy="0 0 0"/>
<material name="red">
<color rgba="0.8 0.2 0.2 1.0"/>
</material>
</visual>
</link>
</robot>
运行与显示
启动RViz并加载URDF模型,同时启动关节状态发布器以手动调节关节角度:
# 终端1:启动RViz并加载模型
roslaunch urdf_tutorial display.launch model:=/path/to/simple_arm.urdf
# 终端2:启动关节状态GUI发布器(若未自动启动)
rosrun joint_state_publisher_gui joint_state_publisher_gui
若使用ROS2,将上述命令替换为对应的ros2 launch urdf_tutorial display.launch.py model:=...及ros2 run joint_state_publisher_gui joint_state_publisher_gui。
验证方法
- 模型完整性:RViz中应显示三个连杆(灰色基座、蓝色连杆1、红色连杆2),且连杆间通过关节正确连接,无错位或悬空。
- 关节运动:在joint_state_publisher_gui界面中拖动joint1和joint2的滑块,观察对应连杆绕Z轴旋转,且运动连续无跳变。
- TF树检查:在RViz左侧Display面板添加TF显示,应能看到base_link→link1→link2的父子变换关系。
- 无报错:终端无URDF解析错误或缺失link/joint的警告。
常见问题
- 模型不显示:检查URDF文件路径是否正确,以及
display.launch中model:=参数是否指向实际文件。 - 关节无法拖动:确认已启动
joint_state_publisher_gui,且没有其他节点抢占/joint_states话题。 - 连杆位置偏移:检查每个link的
<origin>是否与父关节的<origin>匹配,确保子link的视觉原点与关节位置一致。