ROS2 + Gazebo 移动机器人仿真学习笔记
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 三个终端分工
| 终端 | 命令 | 作用 |
|---|---|---|
| 终端 1 | ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py | 启动 Gazebo 仿真 |
| 终端 2 | ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True | 启动 SLAM 建图 |
| 终端 3 | ros2 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 里的两步操作:
- 2D Pose Estimate — 告诉系统小车在地图的哪里,拖动指定朝向
- 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 命令对照
| 功能 | ROS1 | ROS2 |
|---|---|---|
| 启动核心 | roscore | 不需要 |
| 运行节点 | rosrun pkg node | ros2 run pkg node |
| 启动 launch | roslaunch | ros2 launch |
| 列出节点 | rosnode list | ros2 node list |
| 列出话题 | rostopic list | ros2 topic list |
核心差异:ROS2 没有中心节点(roscore),节点通过 DDS 自动发现。
5.2 source setup.bash 的作用
- 不是启动 ROS,只是配置环境变量(PATH、LD_LIBRARY_PATH 等)
- 让
ros2命令能被找到 - 写入
.bashrc后,每次新开终端自动生效
5.3 Gazebo 世界 vs RViz2 地图
| 概念 | 含义 |
|---|---|
| Gazebo 六边形场地 | 仿真世界(“真实世界”) |
激光雷达 /scan | 采集的传感器数据 |
| Cartographer | SLAM 算法 |
| 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 导航失败怎么排查?
排查顺序:
- 看 RViz2 里小车位置和 Gazebo 是否一致(定位问题)
- 看
/cmd_vel有没有输出(控制问题)- 看代价地图是否和实际环境一致(地图问题)
- 看终端有没有
Failed to make progress(物理卡住)- 检查目标点是否在障碍物内
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) │
└─────────────────┴─────────────────┘
操作:
- 打开 Terminator
Ctrl+Shift+E垂直分成左右两半- 点左边面板,
Ctrl+Shift+O水平分成上下 - 点右边面板,
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 注意事项
-
环境变量自动生效:
source /opt/ros/humble/setup.bash已写入~/.bashrc,每个新面板自动加载。验证:echo $ROS_DISTRO应输出humble。 -
键盘遥控的焦点:
teleop_keyboard需要键盘焦点。先用鼠标点一下遥控面板,或Alt+方向键切到它,再按w/a/s/d。 -
不要开 Broadcast input:右键 → Broadcast input → Broadcast to all 会让所有面板同时接收键盘输入,跑 ROS2 时千万别开。
-
保存布局:右键 → Preferences → Layouts → Add,可保存成默认布局,下次打开自动恢复。
10.6 完整工作流示例
以跑 SLAM 建图为例:
terminator打开Ctrl+Shift+E垂直分割,左右两侧各Ctrl+Shift+O水平分割,得到 2×2- 面板 1 跑 Gazebo
- 面板 2 跑 Cartographer
- 面板 3 跑遥控
- 面板 4 备用
- 用
Alt+方向键在面板间切换 - 遥控小车走完环境后,在面板 4 保存地图
- 依次
Ctrl+C关闭各面板进程
第九章整理于 2026-10-11,基于 WSL2 + ROS2 Humble + Terminator 实操
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)