2. URDF机器人模型构建
任务目标
本案例将使用URDF(Unified Robot Description Format)创建一个三连杆机械臂模型,包含两个旋转关节和一个固定基座,并在RViz中完成可视化验证。通过本案例,你将掌握URDF中与
实现方案
我们创建一个包含3个连杆(基座、连杆1、连杆2)和2个旋转关节的简单机械臂。每个连杆通过
环境依赖
- Ubuntu 22.04 + ROS2 Humble(或更高版本)
- 安装包:
sudo apt install ros-humble-urdf-tutorial ros-humble-joint-state-publisher-gui ros-humble-rviz2 - 需要
robot_state_publisher包(ROS2基础安装通常已包含)
完整URDF代码
创建文件 simple_arm.urdf,内容如下:
<?xml version="1.0"?>
<robot name="simple_arm">
<!-- 基座:固定在地面 -->
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
</visual>
</link>
<!-- 关节1:基座与连杆1之间的旋转关节 -->
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.1" 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.03" length="0.3"/>
</geometry>
<origin xyz="0 0 0.15" rpy="0 0 0"/>
</visual>
</link>
<!-- 关节2:连杆1与连杆2之间的旋转关节 -->
<joint name="joint2" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
</joint>
<!-- 连杆2:水平柱体 -->
<link name="link2">
<visual>
<geometry>
<cylinder radius="0.02" length="0.25"/>
</geometry>
<origin xyz="0 0 0.125" rpy="0 1.5708 0"/>
</visual>
</link>
</robot>
运行与验证
按以下步骤在终端中执行:
# 1. 启动机器人状态发布器,将URDF发布到/tf和/robot_description
ros2 run robot_state_publisher robot_state_publisher simple_arm.urdf
# 2. 启动关节状态GUI(用于手动拖动关节角度)
ros2 run joint_state_publisher_gui joint_state_publisher_gui
# 3. 启动RViz
rviz2
在RViz中完成以下设置:
- 将Fixed Frame设置为
base_link。 - 点击Add,选择RobotModel,确认Description Topic为
/robot_description。 - 点击Add,选择TF,显示坐标系变换关系。
通过判定标准
- RViz中显示三个连杆的3D模型,颜色为默认灰色,无红色报错。
- TF树中显示
base_link → link1 → link2的层级关系。 - 在joint_state_publisher_gui窗口中拖动
joint1和joint2的滑块,RViz中的机械臂模型应实时跟随运动,且连杆之间无分离或错位。
关键说明
<origin>中的xyz表示子连杆坐标系原点在父连杆坐标系中的位置偏移,rpy为旋转角(弧度)。连杆2的rpy="0 1.5708 0"使其绕Y轴旋转90°,从而让圆柱体呈水平姿态。- 关节的
<limit>标签对revolute类型为必填,定义了角度范围(弧度)、最大力矩和速度。 - 若RViz中模型不显示,检查终端1是否正常输出TF信息(可用
ros2 run tf2_tools view_frames生成TF树PDF确认)。