ROS2 URDF机器人建模初步教程

文章目录

准备工作

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,这时窗口中就会出现我们创建的哪个小车了。

相关推荐
码农5991 小时前
Fast DDS 到底怎么用?一文理清发现、传输与 QoS 配置
机器人
Rocktech_ruixun2 小时前
机器人视觉SLAM对主控硬件有哪些要求?瑞迅科技RK3588/3576/3568分级方案解析
人工智能·嵌入式硬件·机器人
xiaoduo AI2 小时前
抖音小店客服机器人哪个好?选择AI客服主要看哪些功能?
大数据·人工智能·机器人
茶栀(*´I`*)3 小时前
Python网络机器人入门:从Robots协议、网页结构到Requests库的基础实践
网络·python·机器人
xwz小王子3 小时前
Science Robotics | 从模仿到创造:BeyondMimic如何让机器人“学到”人类的敏捷与多才多艺
人工智能·机器人
2601_967659893 小时前
2026停车场巡检机器人排行:地下停车场夜间巡逻怎么选
人工智能·机器人
workflower3 小时前
TF-IDF 的基本思想
人工智能·机器学习·机器人·云计算·无人机
大唐荣华4 小时前
模型训练显卡选型深度指南:价格、数量、性能与自建租赁抉择
人工智能·机器人·模型训练·具身智能·avida·navida
TaoMetrix5 小时前
Microduck 爆火之后:TaoMetrix 如何帮助品牌抓住 AI 陪伴机器人新机会
人工智能·机器人