Gazebo 机器人实操:驱动一辆差速小车

第 7 章 Gazebo 机器人实操:驱动一辆差速小车

学习目标

  • 启动官方差分驱动机器人演示世界
  • 发布 /cmd_vel 速度指令驱动机器人
  • 观察里程计、TF、激光话题
  • 在 RViz 中可视化机器人模型和激光数据
  • 理解 URDF/SDF 中连杆与关节的基本概念

1. 启动演示世界

上一章安装的 ros-gz-sim-demos 自带一个差速驱动机器人演示(一辆蓝色小车,带激光雷达):

bash 复制代码
ros2 launch ros_gz_sim_demos diff_drive.launch.py

弹出两个窗口:

  • Gazebo 窗口:蓝色小车停在地面上(如果不动,先点播放按钮)
  • RViz 窗口:可视化机器人模型

如果仿真暂停,点 Gazebo 窗口底部的播放按钮。

2. 用话题驱动机器人

新开终端,查看话题:

bash 复制代码
ros2 topic list

重点看这几个话题:

text 复制代码
/model/vehicle_blue/cmd_vel    # 小车速度指令(输入)
/model/vehicle_blue/odom       # 里程计(输出)
/model/vehicle_blue/scan       # 激光雷达数据(输出,若有)

让小车一边前进一边转弯:

bash 复制代码
ros2 topic pub -r 10 /model/vehicle_blue/cmd_vel geometry_msgs/msg/Twist \
  "{linear: {x: 2.0}, angular: {z: 0.5}}"

参数含义:

  • -r 10:以 10 Hz 持续发布
  • linear.x:前进速度 2 m/s
  • angular.z:旋转角速度 0.5 rad/s

在 Gazebo 窗口里可以看到小车开始移动并在地面上转弯。

观察里程计数据(另一个终端):

bash 复制代码
ros2 topic echo /model/vehicle_blue/odom

输出里的 pose.pose.position 是小车在仿真世界里的坐标,twist 是当前速度------这就是"传感器"给 ROS 的反馈。

停止小车:

bash 复制代码
ros2 topic pub -r 10 /model/vehicle_blue/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.0}}"

注意:不同版本/世界的话题名可能略有差异。动手前先 ros2 topic list 确认实际名称,这是所有 ROS 2 调试的第一步。

3. 查看 TF 坐标变换

TF(Transform)描述机器人各部件之间的坐标关系,例如"激光雷达装在底盘上方 0.3 米"。查看当前存在的坐标变换:

bash 复制代码
ros2 run tf2_tools view_frames

会在当前目录生成 frames.pdf,也可以实时打印两个坐标系之间的变换:

bash 复制代码
ros2 run tf2_ros tf2_echo <父坐标系> <子坐标系>

先在 RViz 左侧 Fixed Frame 里填 odom(或 world),添加 TF 显示,就能看到坐标系之间的连线。TF 是机器人开发的重要基础,本章先会观察即可。

4. 在 RViz 里看激光雷达

演示启动时已经打开了 RViz。如果激光话题存在,可以手动添加显示:

  1. 确认话题:ros2 topic list | grep scan(容器内 bash)
  2. 在 RViz 左侧点击 AddBy topic → 选中激光话题(如 /model/vehicle_blue/scan,类型 sensor_msgs/msg/LaserScan)→ OK
  3. 确保 Fixed Frameodomworld
  4. RViz 中会出现一圈点云,就是激光雷达"看到"的周围障碍物

把小车开到墙边,可以实时看到激光点云贴近墙面。

5. URDF/SDF 基础:连杆与关节

机器人在仿真和 ROS 里长什么样,由模型文件描述。URDF(ROS 原生)和 SDF(Gazebo 原生)都是 XML 格式,核心概念一致:

  • 连杆(Link):刚体部件,如底盘、轮子、激光雷达,有质量和惯性
  • 关节(Joint):连接连杆并定义相对运动,如轮子的转动关节

一个最简单的"方块机器人" URDF 示意:

xml 复制代码
<robot name="box_robot">
  <!-- 底盘:一个 0.5m 的立方体 -->
  <link name="base_link">
    <visual>
      <geometry><box size="0.5 0.5 0.1"/></geometry>
    </visual>
    <collision>
      <geometry><box size="0.5 0.5 0.1"/></geometry>
    </collision>
  </link>
</robot>

这个模型没有关节,只是一个静止的方块。真实的差速小车还需要轮子、转向/转动关节和驱动插件------官方演示世界里的 vehicle_blue 模型就是完整例子,其 SDF 文件里包含差速驱动系统插件,负责把 /cmd_vel 变成轮子转动。

本教程不要求手写完整 URDF(那是进阶章节的内容),但理解"连杆 + 关节 + 插件"这个骨架,后续看任何机器人模型都能看懂。

6. 把话题数据和仿真时间记下来(预告)

仿真期间,/clock/model/vehicle_blue/odom/scan 都是真实可用的 ROS 话题,可以随时 ros2 topic echo。下一章的 MoveIt 会用到同样的"话题通信"思想;第 9 章会教你用 rosbag 把仿真数据录下来回放。

常见问题

现象 原因与解决办法
小车不动 仿真暂停(点播放按钮);或 cmd_vel 话题名不对(用 ros2 topic list 确认)
RViz 里看不到模型 检查 Fixed Frame 是否设置为 odom/world,并确认 RViz 与 Gazebo 同时运行
找不到 tf2_tools 命令 执行 sudo apt install -y ros-jazzy-tf2-tools
激光点云是空的 激光话题名可能不同,`ros2 topic list
RViz 报 No transform 等待几秒让 TF 数据到达,或重启 RViz

练习题

  1. 让小车先直行 3 秒再原地旋转 90 度,再直行 3 秒,观察它的轨迹(用 /odom 验证最终位置)。
  2. ros2 topic hz /model/vehicle_blue/odom 测量数据频率,想想激光雷达数据该用什么频率。
  3. 在 RViz 中同时显示 TF 和 LaserScan,移动小车,观察坐标系随小车运动的变化。
  4. /cmd_vel 改成一个持续发布正弦速度的 ros2 topic pub 命令(提示:--rate 与固定值配合即可),观察小车蛇形前进。
相关推荐
robottt6664 小时前
30KG重载协作机器人差异:柔性力控与恒力打磨,越疆领全域落地
机器人
w3296362715 小时前
ros2命令行工具与 turtlesim
机器人
w3296362716 小时前
ros2环境准备
机器人
HyperAI超神经17 小时前
15亿参数挑战机器人控制,MiniCPM-RobotManip正式开源;覆盖文本/图/视频/动作序列,英伟达发布全模态模型Cosmos3-Edge
人工智能·深度学习·机器人·多模态·图像生成·具身智能·智能体
zdl6861 天前
EasyMarkets:“机器人商业化仍待验证”
数据库·机器人
深圳慧闻智造技术有限公司1 天前
机器人本体结构件精密加工难点拆解:薄壁变形控制与五轴量产工艺方案
机器人·机器人零件加工·五轴cnc加工
ergevv1 天前
从大模型到空间智能:未来机器人的终极架构畅想
机器人·vla·世界模型·空间智能·认知地图
iiiiii111 天前
【论文阅读笔记】Reparameterization Proximal Policy Optimization (RPO):将PPO的稳定性引入可微分强化学习
论文阅读·人工智能·笔记·深度学习·机器学习·机器人·具身智能
四方云2 天前
录音转文字完整技术原理(ASR自动语音识别)技术文档
人工智能·机器人·语音识别·外呼系统·销售成长·拓客