2. URDF机器人模型构建
任务目标
使用URDF(Unified Robot Description Format)定义一个三自由度机械臂模型,包含基座、三个连杆和三个旋转关节,并在RViz中正确显示该模型。
环境依赖
- Ubuntu 20.04 + ROS Noetic(或Ubuntu 22.04 + ROS 2 Humble,本案例以ROS Noetic为例)
- 安装包:
ros-noetic-urdf-tutorial、ros-noetic-joint-state-publisher-gui、ros-noetic-rviz
实现步骤
创建ROS功能包并编写URDF文件。URDF使用XML格式描述机器人的运动学树:<link>定义刚体(含视觉/碰撞几何),<joint>定义连杆间的连接关系与运动类型。
完整URDF代码
创建文件 arm.urdf,内容如下:
<?xml version="1.0"?>
<robot name="three_dof_arm">
<!-- 基座 -->
<link name="base_link">
<visual>
<geometry><box size="0.1 0.1 0.05"/></geometry>
<origin xyz="0 0 0.025"/>
</visual>
</link>
<!-- 关节1:基座到连杆1,绕Z轴旋转 -->
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.05"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
</joint>
<link name="link1">
<visual>
<geometry><cylinder radius="0.02" length="0.2"/></geometry>
<origin xyz="0 0 0.1"/>
</visual>
</link>
<!-- 关节2:连杆1到连杆2,绕Y轴旋转 -->
<joint name="joint2" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="0 0 0.2"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
</joint>
<link name="link2">
<visual>
<geometry><cylinder radius="0.02" length="0.2"/></geometry>
<origin xyz="0 0 0.1"/>
</visual>
</link>
<!-- 关节3:连杆2到连杆3,绕Y轴旋转 -->
<joint name="joint3" type="revolute">
<parent link="link2"/>
<child link="link3"/>
<origin xyz="0 0 0.2"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
</joint>
<link name="link3">
<visual>
<geometry><sphere radius="0.03"/></geometry>
<origin xyz="0 0 0.03"/>
</visual>
</link>
</robot>
运行与验证
在终端中依次执行以下命令(需先 source /opt/ros/noetic/setup.bash):
# 启动URDF模型显示(自动加载RViz)
roslaunch urdf_tutorial display.launch model:=arm.urdf
若需手动调整关节角度,另开终端运行:
rosrun joint_state_publisher_gui joint_state_publisher_gui
通过条件
- RViz窗口中出现机械臂模型,基座为长方体,连杆1/2为圆柱体,末端为球体。
- 拖动GUI中的关节滑条(joint1~joint3),机械臂各连杆应绕对应轴实时转动,且连杆间无分离或错位。
- RViz左侧的
RobotModel显示绿色(表示URDF解析成功,无缺失link/joint)。
常见问题
- 模型不显示:检查终端是否有URDF解析报错,确认
model:=后路径正确。 - 关节无法转动:确认
joint_state_publisher_gui已启动,且RViz中Fixed Frame设为base_link。 - 连杆错位:检查
<origin>的xyz值是否与父子link的几何尺寸匹配(子link的origin是相对父link的偏移)。