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 本章知识体系
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的三个核心模块串起来了。从左到右,从理论到实践,从模型描述到实际加载,再到位置调整。你跟着这个脉络走,就不会乱。
3.5 避坑总结
最后,我把自己踩过的坑总结一下,你遇到了可以直接翻回来查:
- 模型加载不出来:先检查
TURTLEBOT3_MODEL环境变量有没有设置 - 机器人位置不对:检查launch文件中的坐标参数,注意Gazebo和ROS的坐标系差异
- Gazebo启动卡死:试试先启动服务器,再启动客户端
- 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 ...
可可精品资料库