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

相关推荐
风合星语2 天前
2026 具身智能技术实战(一):VLA 到底怎么控制机器人?——用 LeRobot 跑通 SmolVLA 推理
pytorch·机器人·具身智能·vla·lerobot·smolvla
鲁邦通物联网2 天前
图书馆机器人跨楼层运行,机器人梯控低噪设计与架构分析
机器人·巡检机器人·机器人梯控·agv梯控·非侵入式采集·机器人乘梯·机器人自主乘梯
PascalXie2 天前
人形机器人的“眼睛“:多目视觉方案怎么选?
计算机视觉·机器人
广州虚拟动力-动捕&虚拟主播2 天前
产教融合,具身智能数据采集实训室打造五大真实场景
机器人
微信开发api3 天前
微信iPad协议怎么用?基于协议的二次开发实践
微信·机器人·ipad
QYR-分析3 天前
机器人精密运动升级,机器人关节动态旋转密封件行业全景市场报告
人工智能·机器人
QYRdata3 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
workflower3 天前
SSH(Struts+Spring+Hibernate)
人工智能·机器学习·机器人·云计算·无人机
微信开发api3 天前
微信机器人接口:REST API vs WebSocket 选型建议
微信·机器人·ipad
别动我齐刘海3 天前
ROS2 Jazzy + C++ 实战路线——ros2_control
c++·人工智能·python·opencv·机器学习·机器人·github