文章目录
准备工作
URDF (Unified Robot Description Format) 是 ROS 中用于描述机器人物理结构的XML文件,其核心概念有二
- Link(连杆):机器人的刚性部件,如底盘、轮子、机械臂连杆等。其属性包括几何形状、颜色、质量等。
- Joint(关节):连接两个 Link 的"铰链",用于定义了父子关系、连接位置(xyz)、旋转角度(rpy)以及运动类型(如固定、连续旋转、滑动)。
为了实现一个简单的机器人功能并进行可视化,需要安装下面两个包,分别用于读取模型文件和模拟传感器输入。
bash
sudo apt update
sudo apt install ros-lyrical-robot-state-publisher \
ros-lyrical-joint-state-publisher-gui
在开始具体的建模之前,创建工作空间
bash
# 创建工作空间
mkdir -p sim_ws/src
cd sim_ws/src
# 创建功能包(专门用于存放机器人模型描述文件)
ros2 pkg create --build-type ament_python robot_description
# 创建存放 URDF 文件和 Launch 文件的目录
cd robot_description
mkdir urdf launch
编写URDF模型文件
接下来构建一个最简单的两轮差速移动机器人,仅包括一个长方体底盘(base_link)和两个圆柱体轮子(left_wheel 和 right_wheel)。
在我们刚刚创建的urdf文件下,新建一个simple_robot.urdf文件
python
nano urdf/simple_robot.urdf
一般来说,URDF模型都是从CAD工具直接导出的,本文为了理解ROS2的工作机理,直接将其源码贴出来,内容如下
xml
<?xml version="1.0"?>
<robot name="simple_robot">
<!-- ==================== 连杆 (Link) ==================== -->
<!-- 底盘:一个 0.4m x 0.3m x 0.1m 的蓝色长方体 -->
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
<material name="blue">
<color rgba="0.2 0.2 0.8 1.0"/>
</material>
</visual>
</link>
<!-- 左轮:一个半径 0.05m、厚度 0.04m 的黑色圆柱体 -->
<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.05" length="0.04"/>
</geometry>
<material name="black">
<color rgba="0.1 0.1 0.1 1.0"/>
</material>
</visual>
</link>
<!-- 右轮:与左轮相同 -->
<link name="right_wheel">
<visual>
<geometry>
<cylinder radius="0.05" length="0.04"/>
</geometry>
<material name="black">
<color rgba="0.1 0.1 0.1 1.0"/>
</material>
</visual>
</link>
<!-- ==================== 关节 (Joint) ==================== -->
<!-- 左轮关节:continuous 表示可以无限旋转(像车轮一样) -->
<joint name="left_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="left_wheel"/>
<!-- origin: 相对于父连杆(base_link)中心的位置和旋转 -->
<!-- xyz="0 0.17 -0.03": 向Y轴正方向偏移0.17m(左侧),向下偏移0.03m -->
<!-- rpy="-1.5708 0 0": 绕X轴旋转-90度,让圆柱体横过来(像车轮) -->
<origin xyz="0 0.17 -0.03" rpy="-1.5708 0 0"/>
<!-- axis: 旋转轴,绕Z轴旋转 -->
<axis xyz="0 0 1"/>
</joint>
<!-- 右轮关节 -->
<joint name="right_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="right_wheel"/>
<!-- Y轴负方向偏移(右侧) -->
<origin xyz="0 -0.17 -0.03" rpy="-1.5708 0 0"/>
<axis xyz="0 0 1"/>
</joint>
</robot>
由于我是用ssh控制ubuntu,所以直接进VIM还不好粘贴,这里用的是cat命令,
bash
cat << 'EOF' > urdf/simple_robot.urdf
# 在这里直接使用终端的粘贴快捷键
# 粘贴完内容后,另起一行输入 EOF 并回车
EOF
编写Launch文件
我们需要启动三个核心节点来在 RViz2 中显示机器人:
- robot_state_publisher:读取 URDF 文件,将其发布到 /robot_description 话题,并根据关节状态发布 TF 坐标变换。
- joint_state_publisher_gui:弹出一个带滑块的 GUI 窗口,让你手动拖动关节(如转动轮子),并发布关节状态到 /joint_states 话题。
- rviz2:三维可视化工具,接收上述数据并渲染机器人模型。
在/robot_description/launch/ 目录下,新建文件
display_robot_launch.py
内容如下
python
import os
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
# 1. 获取功能包的 share 目录路径
pkg_share = get_package_share_directory('robot_description')
# 2. 拼接 URDF 文件的完整路径
urdf_file = os.path.join(pkg_share, 'urdf', 'simple_robot.urdf')
# 3. 读取 URDF 文件内容为字符串
with open(urdf_file, 'r') as f:
robot_desc = f.read()
return LaunchDescription([
# 节点 1:robot_state_publisher
# 将 URDF 字符串作为参数传入,它会发布 TF 和 robot_description
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'robot_description': robot_desc}],
output='screen'
),
# 节点 2:joint_state_publisher_gui
# 提供 GUI 滑块,手动控制关节角度
Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui',
output='screen'
),
# 节点 3:rviz2
# 启动三维可视化窗口
Node(
package='rviz2',
executable='rviz2',
output='screen'
),
])
修改setup.py,确保顶部导入了os和glob,没有的话就补上
python
import os
from glob import glob
修改data_files部分,添加urdf和launc目录的安装规则
python
data_files=[
# 现有内容不用动
# 安装 URDF 文件
(os.path.join('share', package_name, 'urdf'), glob(os.path.join('urdf', '*.urdf'))),
# 安装 Launch 文件
(os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*launch.[pxy][yma]*'))),
],
编译与运行
回到sim_ws目录,
bash
colcon build
source install/setup.bash
ros2 launch robot_description display_robot_launch.py
弹出rviz窗口后,将左侧面板Global Options下的Fixed Frame修改为base_link。
然后在点击下方的 Add(添加)按钮,在弹出的窗口中,在By display type选项卡中,选中RobotModel,点击 OK。
此时左侧Displays列表中会多出这个RobotModel,点击展开,确保Visual Enabled选项被勾选,然后将Discription Topic的值设为/robot_description,这时窗口中就会出现我们创建的哪个小车了。
