ROS2 + Gazebo 移动机器人仿真学习笔记

环境:WSL2 (Ubuntu 22.04) + ROS2 Humble + Gazebo Fortress (Ignition 6.18) + TurtleBot3 Burger + Terminator


一、环境搭建核心命令

1.1 安装 ROS2 Humble

# 添加源
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装完整版
sudo apt update
sudo apt install ros-humble-desktop

# 配置环境变量(写入 .bashrc,永久生效)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

1.2 安装 Gazebo + TurtleBot3

# Gazebo Fortress
sudo apt install ros-humble-ros-gz
ign gazebo --versions   # 验证,应输出 6.x.x

# TurtleBot3 全套
sudo apt install ros-humble-turtlebot3 ros-humble-turtlebot3-simulations \
                 ros-humble-turtlebot3-navigation2 ros-humble-turtlebot3-cartographer

# 设置机器人型号(写入 .bashrc)
echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc

1.3 WSL2 下 Gazebo 渲染问题

# Intel 核显崩溃时,强制软件渲染
export LIBGL_ALWAYS_SOFTWARE=1
# 永久生效:
echo 'export LIBGL_ALWAYS_SOFTWARE=1' >> ~/.bashrc

二、SLAM 建图完整流程

2.1 三个终端分工

终端命令作用
终端 1ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py启动 Gazebo 仿真
终端 2ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True启动 SLAM 建图
终端 3ros2 run turtlebot3_teleop teleop_keyboard键盘遥控

2.2 键盘遥控键位

按键动作
w前进(加速到 0.22 m/s 封顶)
x后退
a左转(角速度增大)
d右转(角速度减小)
空格 / s急停
Ctrl+C退出

重要:松手不会减速,速度保持。退出前先按空格,再 Ctrl+C。

2.3 保存地图

mkdir -p ~/maps
ros2 run nav2_map_server map_saver_cli -f ~/maps/my_map

生成两个文件:

  • my_map.pgm — 栅格地图图像
  • my_map.yaml — 地图元数据(分辨率、原点、阈值)

三、Nav2 自主导航流程

# 终端 1:启动 Gazebo
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

# 终端 2:启动 Nav2,加载地图
ros2 launch turtlebot3_navigation2 navigation2.launch.py \
    use_sim_time:=True map:=$HOME/maps/my_map.yaml

RViz2 里的两步操作:

  1. 2D Pose Estimate — 告诉系统小车在地图的哪里,拖动指定朝向
  2. Nav2 Goal — 在地图上点目标点,小车自动规划路径并前往

四、常用调试命令速查

4.1 查看系统状态

ros2 node list              # 列出所有节点
ros2 topic list             # 列出所有话题
ros2 topic info /cmd_vel    # 查看话题的发布者/订阅者数量
ros2 topic echo /cmd_vel    # 实时查看话题内容
ros2 topic hz /scan         # 查看话题发布频率
ros2 interface show geometry_msgs/msg/Twist   # 查看消息类型定义

4.2 手动发速度命令(绕过键盘遥控)

# 只发一次,让小车停下
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
    "{linear: {x: 0.0}, angular: {z: 0.0}}"

# 直行
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
    "{linear: {x: 0.2}, angular: {z: 0.0}}"

# 原地旋转
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
    "{linear: {x: 0.0}, angular: {z: 0.5}}"

# 后退(用于脱困)
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
    "{linear: {x: -0.15}, angular: {z: 0.0}}"

4.3 进程管理

# 杀 Gazebo(注意进程名是 gzserver / gzclient,不是 ign gazebo)
pkill -9 -f "gzserver"
pkill -9 -f "gzclient"

# 确认进程是否清干净
ps aux | grep -i "gzserver\|gazebo"

# 极端情况:重启整个 WSL(在 Windows PowerShell 执行)
wsl --shutdown

4.4 文件与路径

which ros2                  # 查看命令位置
echo $ROS_DISTRO            # 查看 ROS 版本(humble)
echo $TURTLEBOT3_MODEL      # 查看当前机器人型号
ls /opt/ros/humble/         # ROS2 安装目录
dpkg -L ros-humble-ros-gz   # 查看某个包安装了哪些文件

五、关键概念理解

5.1 ROS1 vs ROS2 命令对照

功能ROS1ROS2
启动核心roscore不需要
运行节点rosrun pkg noderos2 run pkg node
启动 launchroslaunchros2 launch
列出节点rosnode listros2 node list
列出话题rostopic listros2 topic list

核心差异:ROS2 没有中心节点(roscore),节点通过 DDS 自动发现。

5.2 source setup.bash 的作用

  • 不是启动 ROS,只是配置环境变量(PATH、LD_LIBRARY_PATH 等)
  • 让 ros2 命令能被找到
  • 写入 .bashrc 后,每次新开终端自动生效

5.3 Gazebo 世界 vs RViz2 地图

概念含义
Gazebo 六边形场地仿真世界(“真实世界”)
激光雷达 /scan采集的传感器数据
CartographerSLAM 算法
RViz2 地图俯视 2D 栅格地图(抽象表示)

关系:Gazebo 是真实世界,RViz2 地图是 SLAM 从激光数据重建的抽象。走遍整个场地后,地图会呈现六边形轮廓,但墙变细、圆柱变点、边缘有噪声。

5.4 差速驱动(Differential Drive)

TurtleBot3 靠两个轮子速度差转向:

  • 左轮快、右轮慢 → 右转
  • 一正一反 → 原地打转
  • angular velocity 是目标角速度,底层控制器自动分配两轮速度

5.5 SLAM 地图的"未知区域"

  • 白色/浅灰 = 可通行
  • 黑色/深灰 = 障碍物
  • 灰色/空白 = 未探索(雷达没扫到)

六、踩过的坑与解决方法

问题原因解决
roscore: command not found装的是 ROS2,没有 roscore用 ros2 run / ros2 launch
ros2: command not found环境变量没生效source /opt/ros/humble/setup.bash
Gazebo 启动崩溃(LLVM 报错)Intel 核显 D3D12 驱动冲突export LIBGL_ALWAYS_SOFTWARE=1
'TURTLEBOT3_MODEL' 报错当前终端未加载新环境变量新开终端,或手动 export
遥控没反应终端焦点不在遥控窗口点一下遥控终端再按键
小车一直转圈退出遥控时速度未归零先按空格再 Ctrl+C
小车不动但 Sim Time 在走Gazebo 物理引擎卡住检查 /cmd_vel 订阅,重启 Gazebo
小车翻车速度太快 / 急转弯重启 Gazebo,发近目标点
重启后还是翻车状态gzserver 进程没杀干净pkill -9 -f "gzserver"
Nav2 “Failed to make progress”定位不准 / 物理卡住重新 2D Pose Estimate,或脱困
RViz2 面板加载失败可选插件缺失忽略,不影响导航

七、面试可能被问到的问题

7.1 概念类

Q1:ROS1 和 ROS2 的核心区别是什么?

ROS1 依赖中心节点 roscore,节点通过 TCPROS 通信;ROS2 去中心化,基于 DDS 自动发现。ROS2 支持实时性、多机通信、生命周期管理,且 ROS1 Noetic 已于 2025 年 5 月 EOL。

Q2:Topic、Service、Action 的区别?

  • Topic:发布/订阅,异步,单向,适合持续数据流(如激光、速度)
  • Service:请求/响应,同步,适合短时操作(如查询参数)
  • Action:带反馈的长时任务,可取消(如导航到目标点)

Q3:TF 是什么?

TF 是坐标系变换系统,维护机器人各部件(base_link、laser、odom、map)之间的坐标关系树。SLAM 和导航依赖 TF 确定传感器数据的位置。

Q4:SLAM 是什么?常用算法有哪些?

SLAM(Simultaneous Localization and Mapping)是同时定位与建图。常见算法:

  • Cartographer(Google,基于图优化,支持 2D/3D)
  • Gmapping(基于粒子滤波,ROS1 常用)
  • ORB-SLAM(视觉 SLAM)
  • LOAM / LIO-SAM(激光雷达 SLAM)

Q5:差速驱动机器人如何转弯?

通过左右轮速度差。角速度 = (v_right - v_left) / 轮距。同速直行,差速转向,一正一反原地打转。

Q6:Nav2 的架构是怎样的?

Nav2 是 ROS2 的导航框架,核心组件:

  • AMCL:粒子滤波定位
  • Planner Server:全局路径规划(A*、Dijkstra)
  • Controller Server:局部路径跟踪(DWB、TEB)
  • Costmap:代价地图(全局 + 局部)
  • Behavior Tree:行为树决策(恢复行为)

7.2 项目类

Q7:你做过什么 ROS 项目?

参考回答:
“我在 ROS2 Humble + Gazebo 环境下,用 TurtleBot3 完成了移动机器人 SLAM 建图和自主导航。建图用 Cartographer,通过遥控小车探索环境,保存栅格地图;导航用 Nav2,加载地图后通过 RViz2 设置目标点,小车自动规划路径并避障。过程中遇到定位漂移、小车卡墙、翻车等问题,通过重新定位、调整目标点、重启仿真解决。”

Q8:建图时遇到过什么问题?

常见回答方向:

  • 走太快导致地图重影 → 降低速度
  • 定位丢失导致地图错乱 → 重新初始化
  • 激光被遮挡导致地图缺口 → 调整路径覆盖
  • 闭环没做好 → 走回起点让图优化

Q9:Nav2 导航失败怎么排查?

排查顺序:

  1. 看 RViz2 里小车位置和 Gazebo 是否一致(定位问题)
  2. 看 /cmd_vel 有没有输出(控制问题)
  3. 看代价地图是否和实际环境一致(地图问题)
  4. 看终端有没有 Failed to make progress(物理卡住)
  5. 检查目标点是否在障碍物内

7.3 工具类

Q10:Sim2Real 是什么?

Sim2Real 指把仿真环境训练的策略迁移到真实机器人。难点在于仿真与现实的差异(摩擦、噪声、延迟、光照)。常用方法:域随机化(Domain Randomization)、系统辨识、渐进式迁移。

Q11:Gazebo、MuJoCo、Isaac Sim 的区别?

  • Gazebo:ROS 生态标配,功能全面,物理精度中等
  • MuJoCo:物理精度高,速度快,强化学习常用,2021 年开源
  • Isaac Sim:NVIDIA 出品,GPU 加速,视觉逼真,适合大规模 AI 训练,硬件要求高

Q12:TurtleBot3 有哪几个型号?

  • Burger:最小最便宜,激光雷达,最大速度 0.22 m/s
  • Waffle / Waffle Pi:更大,带深度相机,最大速度 0.26 m/s

八、下一步学习方向

阶段目标
短期写一个自己的 ROS2 节点(发布/订阅),理解 TF
中期Nav2 参数调优,Cartographer 原理,复杂环境建图
长期MoveIt(机械臂)、Isaac Sim、强化学习、真机部署

九、目录结构约定

/home/shuang2204/
├── .bashrc              # 环境变量配置
├── ros2_ws/             # ROS2 工作空间(放代码)
│   └── src/
└── maps/                # 地图文件(放数据)
    ├── my_map.pgm
    └── my_map.yaml

原则:

  • 代码放 ~/ros2_ws/src/
  • 数据放 ~/maps/
  • 不要放 /mnt/d/(WSL2 访问 Windows 盘慢、权限乱)

十、Terminator 多终端管理

环境:WSL2 (Ubuntu 22.04) + ROS2 Humble
用途:在一个窗口里管理多个终端面板,方便跑 Gazebo / Cartographer / 遥控 / Nav2


10.1 安装与启动

sudo apt install terminator
terminator

注意:Terminator 是独立程序,运行 terminator 会弹出一个新窗口,所有分屏操作都在那个新窗口里进行。


10.2 核心快捷键

快捷键作用
Ctrl+Shift+O水平分割(上下分)
Ctrl+Shift+E垂直分割(左右分)
Ctrl+Shift+W关闭当前面板
Ctrl+Shift+T新建标签页
Alt+方向键在面板间切换
Ctrl+Shift+X当前面板最大化 / 还原

快捷键失效时:

  • 在 Terminator 终端区域右键,菜单里有 Split Horizontally / Split Vertically
  • 如果被 IBus 占用,运行 ibus-setup,在 Emoji 标签页检查 Emoji annotation 的绑定

10.3 推荐布局(跑 SLAM 时)

┌─────────────────┬─────────────────┐
│   Gazebo        │   Cartographer  │
│   (面板 1)      │   (面板 2)      │
├─────────────────┼─────────────────┤
│   遥控          │   备用/调试     │
│   (面板 3)      │   (面板 4)      │
└─────────────────┴─────────────────┘

操作:

  1. 打开 Terminator
  2. Ctrl+Shift+E 垂直分成左右两半
  3. 点左边面板,Ctrl+Shift+O 水平分成上下
  4. 点右边面板,Ctrl+Shift+O 水平分成上下

10.4 四个面板的分工

# 面板 1:启动 Gazebo
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

# 面板 2:启动 Cartographer 建图
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True

# 面板 3:键盘遥控
ros2 run turtlebot3_teleop teleop_keyboard

# 面板 4:备用(保存地图、调试等)
ros2 run nav2_map_server map_saver_cli -f ~/maps/my_map

10.5 注意事项

  1. 环境变量自动生效:source /opt/ros/humble/setup.bash 已写入 ~/.bashrc,每个新面板自动加载。验证:echo $ROS_DISTRO 应输出 humble。

  2. 键盘遥控的焦点:teleop_keyboard 需要键盘焦点。先用鼠标点一下遥控面板,或 Alt+方向键 切到它,再按 w/a/s/d。

  3. 不要开 Broadcast input:右键 → Broadcast input → Broadcast to all 会让所有面板同时接收键盘输入,跑 ROS2 时千万别开。

  4. 保存布局:右键 → Preferences → Layouts → Add,可保存成默认布局,下次打开自动恢复。


10.6 完整工作流示例

以跑 SLAM 建图为例:

  1. terminator 打开
  2. Ctrl+Shift+E 垂直分割,左右两侧各 Ctrl+Shift+O 水平分割,得到 2×2
  3. 面板 1 跑 Gazebo
  4. 面板 2 跑 Cartographer
  5. 面板 3 跑遥控
  6. 面板 4 备用
  7. 用 Alt+方向键 在面板间切换
  8. 遥控小车走完环境后,在面板 4 保存地图
  9. 依次 Ctrl+C 关闭各面板进程

第九章整理于 2026-10-11,基于 WSL2 + ROS2 Humble + Terminator 实操

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐