3、机器人模型导入:URDF与SDF格式解析、在Gazebo中加载TurtleBot3模型、配置机器人初始位姿

好,咱们进入第三章。这一章,说白了就是让机器人「住进」仿真世界。

你想想看,光有地图和传感器,没有机器人本体,那仿真就是个空壳子。所以这一章的核心任务就三个:搞懂机器人模型的两种描述格式、把TurtleBot3请进Gazebo、最后给它摆个舒服的姿势。

3.1 URDF与SDF:两种「机器人简历」

机器人模型怎么描述?就像人需要身份证一样,机器人也需要一份「简历」。在ROS和Gazebo的世界里,主流简历格式有两种:URDF和SDF。

URDF(Unified Robot Description Format),全称统一机器人描述格式。它是ROS的亲儿子,用XML写。我个人习惯用URDF做快速原型验证,因为它语法简单,上手快。

SDF(Simulation Description Format),仿真描述格式。这是Gazebo的亲儿子。功能比URDF强,能描述更复杂的物理属性、传感器、甚至整个场景。

我刚开始做仿真时,总搞不清该用哪个。后来踩了个坑——用URDF描述了一个带履带的机器人,结果在Gazebo里履带死活动不了。查了半天,发现URDF对连续闭合运动链支持不好。换成SDF,问题迎刃而解。

所以我的建议是:

  • 简单轮式机器人(比如TurtleBot3):用URDF就够了
  • 复杂结构(履带、多关节、软体):优先考虑SDF
  • 混合使用:URDF描述运动学,SDF补充物理属性

核心区别速览:

特性 URDF SDF
所属生态 ROS Gazebo
语法复杂度 简单 中等
物理属性支持 有限 丰富
场景描述 不支持 支持
多机器人支持 需手动组合 原生支持

3.2 在Gazebo中加载TurtleBot3模型

好,理论说完了,咱们动手。TurtleBot3是ROS生态里最经典的入门机器人,没有之一。我当年入门ROS时,第一个跑起来的仿真就是它。

第一步:安装依赖

嗯,这里要注意。如果你用的是ROS Noetic或Melodic,命令稍有不同。我以Noetic为例:

sudo apt install ros-noetic-turtlebot3 ros-noetic-turtlebot3-simulations ros-noetic-turtlebot3-gazebo

第二步:设置机器人型号

TurtleBot3有三个版本:Burger、Waffle、Waffle Pi。我建议新手先用Burger,结构最简单。

export TURTLEBOT3_MODEL=burger

记得把这句话加到 ~/.bashrc 里,不然每次开终端都要重新设置。我曾经因为这个忘了设置,结果加载出来一个空模型,排查了半天。

第三步:启动Gazebo并加载模型

roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

这条命令会启动一个空白世界,并在其中加载TurtleBot3。你会看到一个小机器人出现在原点位置。

小技巧:如果Gazebo启动很慢,可以试试先启动Gazebo服务器,再启动客户端:

gazebo --verbose worlds/empty.world &
roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

这样能节省不少等待时间。

3.3 配置机器人初始位姿

机器人加载出来了,但位置可能不是你想要的。比如你想让它从房间的角落出发,而不是原点。

方法一:通过launch文件参数

最直接的方法。在launch文件中指定 initial_pose_x、initial_pose_y、initial_pose_z 和 initial_pose_yaw。

<launch>
  <arg name="model" default="burger" />
  <arg name="x_pos" default="1.0" />
  <arg name="y_pos" default="2.0" />
  <arg name="z_pos" default="0.0" />
  <arg name="yaw" default="0.0" />

  <include file="$(find turtlebot3_gazebo)/launch/turtlebot3_empty_world.launch">
    <arg name="x_pos" value="$(arg x_pos)" />
    <arg name="y_pos" value="$(arg y_pos)" />
    <arg name="z_pos" value="$(arg z_pos)" />
    <arg name="yaw" value="$(arg yaw)" />
  </include>
</launch>

方法二:通过服务调用

如果你已经启动了仿真,不想重启,可以用服务来设置位姿:

rosservice call /gazebo/set_model_state "model_state:
  model_name: 'turtlebot3_burger'
  pose:
    position:
      x: 1.0
      y: 2.0
      z: 0.0
    orientation:
      x: 0.0
      y: 0.0
      z: 0.0
      w: 1.0"

注意这里的 orientation 用的是四元数。如果你不熟悉四元数,可以用 tf.transformations 工具来转换:

from tf.transformations import quaternion_from_euler
q = quaternion_from_euler(0, 0, 1.57)  # 绕Z轴旋转90度

避坑指南:我曾经在设置位姿时,把yaw写成了90度,结果机器人直接「躺」在地上了。原因是Gazebo的坐标系和ROS的坐标系有细微差别。记住:Gazebo中,Z轴朝上,Yaw绕Z轴旋转。

3.4 本章知识体系

为了让你更直观地理解本章的知识结构,我画了一张图:

机器人模型导入知识体系 URDF与SDF格式 机器人「简历」格式 加载TurtleBot3 安装→设置→启动 配置初始位姿 位置+姿态设置 XML语法 link/joint 物理属性 Burger型号 Waffle型号 launch启动 launch参数 服务调用 四元数转换 核心目标:让机器人「住进」仿真世界

这张图把本章的三个核心模块串起来了。从左到右,从理论到实践,从模型描述到实际加载,再到位置调整。你跟着这个脉络走,就不会乱。

3.5 避坑总结

最后,我把自己踩过的坑总结一下,你遇到了可以直接翻回来查:

  1. 模型加载不出来:先检查 TURTLEBOT3_MODEL 环境变量有没有设置
  2. 机器人位置不对:检查launch文件中的坐标参数,注意Gazebo和ROS的坐标系差异
  3. Gazebo启动卡死:试试先启动服务器,再启动客户端
  4. URDF转SDF报错:用 gz sdf -p model.urdf > model.sdf 命令转换,注意URDF中不能有 <gazebo> 标签

嗯,这一章的内容就到这儿。你先把TurtleBot3跑起来,感受一下机器人「活」在仿真世界里的感觉。下一章,我们会让这个机器人真正动起来。

本章核心命令速查:

# 安装
sudo apt install ros-noetic-turtlebot3*

# 设置型号
export TURTLEBOT3_MODEL=burger

# 启动仿真
roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

# 设置位姿
rosservice call /gazebo/set_model_state ...

可可精品资料库