ROS2 仿真环境搭建

机器人

Posted by LXG on May 14, 2026

动手学ROS2-鱼香

ROS2中文教程

架构


Ubuntu 22.04
    │
    ├── ROS2 Humble
    │       │
    │       ├── RViz2(可视化)
    │       ├── Nav2(导航)
    │       ├── SLAM Toolbox
    │       ├── MoveIt2(机械臂)
    │       └── rosbag
    │
    ├── Gazebo Sim
    │       │
    │       ├── 小车仿真
    │       ├── 激光雷达
    │       ├── 摄像头
    │       └── IMU
    │
    ├── OpenCV / YOLO
    │
    ├── CUDA
    │
    └── Isaac Sim(后期)

安装 ROS2 Humble

设置 locale


sudo apt update
sudo apt install locales

sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

export LANG=en_US.UTF-8

添加源


sudo apt install software-properties-common
sudo add-apt-repository universe

添加 ROS key


sudo apt update && sudo apt install curl -y

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 \
$(. /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 -y

环境变量


echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc

source ~/.bashrc

测试 ROS2


ros2 run demo_nodes_cpp talker

另开终端:

ros2 run demo_nodes_py listener

能通信说明 OK。

安装 Gazebo 仿真


sudo apt install ros-humble-gazebo-* -y

测试 Gazebo


gazebo

gazebo

安装 TurtleBot3

这是 ROS 世界 Hello World。

TurtleBot3

安装


sudo apt install ros-humble-turtlebot3* -y

设置型号


echo 'export TURTLEBOT3_MODEL=burger' >> ~/.bashrc

source ~/.bashrc

清理环境


执行:

pkill -9 gzserver
pkill -9 gzclient
pkill -9 ros2

然后:

ps -ef | grep gz

确保没有:

gzserver

启动仿真


ros2 launch turtlebot3_gazebo empty_world.launch.py

启动直接报错了,显卡驱动不兼容, 上述方案已经不可行

新老架构仿真

Gazebo Classic Gazebo Harmonic
gzserver gz sim
gzclient 内置GUI
OGRE1 OGRE2
ROS插件 ros_gz_bridge
容易崩 稳很多

切换到新架构

移除旧架构


sudo apt remove gazebo* libgazebo* -y

安装 Harmonic


sudo apt update
sudo apt install gz-harmonic -y

测试


gz sim

gazebo_harmonic

安装 ROS2 Bridge


sudo apt install ros-humble-ros-gzharmonic -y

Webots

Webots-官网

维度 Webots Gazebo Harmonic Isaac Sim
上手难度 ⭐ 最容易 中等 最难
安装体验 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
稳定性 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐
ROS2集成 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
学习ROS友好 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐
GUI体验 ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
RTX利用 一般 一般 ⭐⭐⭐⭐⭐
视觉仿真 中等 中等 ⭐⭐⭐⭐⭐
物理精度 中等 较强 ⭐⭐⭐⭐⭐
AI训练 一般 一般 ⭐⭐⭐⭐⭐
自动驾驶 一般 ⭐⭐⭐⭐⭐
工业趋势 中等 ⭐⭐⭐⭐⭐
文档友好 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
环境踩坑 很少 中等 非常多
硬件要求
适合初学者 ⭐⭐⭐⭐⭐ ⭐⭐⭐

安装


sudo snap install webots

sudo apt install ros-humble-webots-ros2

Webots 是谁维护的?

瑞士机器人仿真公司: Cyberbotics

时间 事件
1996 在 EPFL 开始研发
1998 Cyberbotics 商业化维护
2018 开源(Apache 2)
现在 ROS2 官方支持之一

为什么中国没有这种仿真平台

像 Webots、Gazebo、Isaac Sim 这种平台,本质上已经不是普通软件了,而是:

  • 机器人操作系统生态的一部分
  • AI 数据生成平台
  • 自动驾驶验证平台
  • 数字孪生平台
  • 学术标准平台

这背后需要非常长时间的生态积累。

做仿真平台比做机器人还难

模块 难度
3D 引擎 极高
物理引擎 极高
传感器模拟 极高
ROS 接口 极高
时间同步 极高
GPU 渲染 极高
多机器人调度 极高
AI 数据生成 极高
跨平台 GUI 极高

中国长期更偏“工程落地”

欧美机器人:

  • 强调研究平台
  • 强调通用性
  • 强调标准化
  • 强调开源生态

中国过去更偏:

  • 能跑就行
  • 快速交付
  • 项目制
  • 客户定制

于是大量公司:自己魔改一个内部仿真器

而不是:做一个全球开发者都能用的平台

这和中国软件行业很多领域类似

官方推荐

ROS2版本 官方推荐
Humble gazebo11
Jazzy Harmonic
Kilted Harmonic

新版本

老时代 新时代
ROS1 ROS2
gazebo11 Harmonic
gazebo_ros ros_gz
OGRE1 OGRE2
Ubuntu 20.04 Ubuntu 24.04

注意: 安装Jazzy新版本必须是ubuntu 24.04

启动仿真

由于 Humble + Gazebo Harmonic 采用了全新的架构,启动仿真的逻辑与传统的 Gazebo 11 完全不同。你不再通过 gazebo_ros 插件直接通信,而是通过 ros_gz 桥接器。

以下是启动一个无人车(以官方示例为例)并进行控制的完整流程:

在新时代架构中,ROS 2 和 Gazebo 是平级的,它们之间靠一个“翻译官”(Bridge)传递消息。

  • Gazebo Harmonic: 负责物理计算和渲染。
  • ros_gz_bridge: 负责把 Gazebo 的 gz.msgs 翻译成 ROS 2 的 geometry_msgs 等。
  • ROS 2: 负责发送控制指令(如键盘控制)。

第一步:启动仿真世界

打开第一个终端,启动一个带有无人车的演示世界。Gazebo Harmonic 内置了一个名为 diff_drive.sdf 的简单差速小车示例:

# 启动 Gazebo 并加载差速小车模型
gz sim -r diff_drive.sdf

gazebo_sim

第二步:建立消息桥接(关键点)


# 创建桥接:将 ROS 2 的 /cmd_vel 转发给 Gazebo 小车

ros2 run ros_gz_bridge parameter_bridge /model/vehicle_blue/cmd_vel@geometry_msgs/msg/Twist]gz.msgs.Twist

这个命令的意思是:监听 ROS 2 的 /model/diff_drive/cmd_vel 话题,并将其翻译为 Gazebo 能懂的 Twist 消息。

第三步:发布控制命令

打开第三个终端,你可以直接用键盘控制小车移动:


# 安装并运行键盘控制节点
sudo apt install ros-humble-teleop-twist-keyboard

ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r /cmd_vel:=/model/vehicle_blue/cmd_vel

# 模拟键盘发个手动指令
ros2 topic pub --once /model/vehicle_blue/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"

查看topic


lxg@lxg:~$ gz topic -l
/clock
/gazebo/resource_paths
/gui/camera/pose
/gui/currently_tracked
/gui/track
/model/vehicle_blue/odometry
/model/vehicle_blue/tf
/model/vehicle_green/odometry
/model/vehicle_green/tf
/stats
/world/diff_drive/clock
/world/diff_drive/dynamic_pose/info
/world/diff_drive/pose/info
/world/diff_drive/scene/deletion
/world/diff_drive/scene/info
/world/diff_drive/state
/world/diff_drive/stats
/world/shapes/clock
/world/shapes/dynamic_pose/info
/world/shapes/pose/info
/world/shapes/scene/deletion
/world/shapes/scene/info
/world/shapes/state
/world/shapes/stats
/world/sonoma/clock
/world/sonoma/stats
/model/vehicle_blue/cmd_vel
/model/vehicle_blue/enable
/model/vehicle_green/cmd_vel
/model/vehicle_green/enable
/world/diff_drive/light_config
/world/diff_drive/material_color
/world/shapes/light_config
/world/shapes/material_color

仿真

ros_gazebo

Topic

ros_topic

键盘控制

ros_keyboard

官方模型库

fuel-models

bcr_bot

bcr_bot-github

一个“完整的 ROS2 无人车仿真参考项目”

  • 机器人模型
  • Gazebo 仿真
  • 深度相机
  • 激光雷达
  • IMU
  • Nav2
  • SLAM
  • RViz
  • ros2_control
  • Isaac Sim

由:Black Coffee Robotics 维护。这是一家机器人公司。

仿真运行


cd /home/lxg/code/github/bcr_bot/scripts
./run_bcr_bot_sim.sh --clean --world warehouse --with-rviz --follow-camera --drive-demo --drive-seconds 3 --drive-speed 0.4

bcr_bot

深度相机视角

rvix_bcr_bot

rbot

rbot-github

An open-source Autonomous Mobile Robot simulation stack for ROS 2 Jazzy and Gazebo Harmonic.

项目 定位
BCR Bot “现代 ROS2 学习型 AMR”
rbot “企业级 AMR baseline”

bcr_bot 源码


.
├── build                  # 编译输出目录,colcon build 的产物会放在这里
│   ├── bcr_bot            # bcr_bot 包的构建产物
│   └── COLCON_IGNORE      # colcon 忽略此目录标记
├── CHANGELOG.rst          # 项目更新日志
├── CMakeLists.txt         # CMake 构建配置文件
├── config                 # 配置文件目录
│   ├── bcr_map.pgm        # 地图文件(栅格图,用于导航)
│   ├── bcr_map.yaml       # 地图的元信息(分辨率、原点等)
│   ├── mapper_params_online_async.yaml  # SLAM 参数文件
│   └── nav2_params.yaml   # ROS2 Navigation2 参数文件
├── Dockerfile             # Docker 容器配置文件
├── install                # colcon 安装输出目录
│   ├── bcr_bot            # 安装后的 bcr_bot 包
│   ├── COLCON_IGNORE      # colcon 忽略标记
│   ├── local_setup.*      # 各种 shell / powershell 环境的 ROS2 工作空间初始化脚本
│   └── setup.*            # colcon 安装后的 setup 文件,用于 sourcing
├── launch                 # 启动文件目录(.launch.py)
│   ├── bcr_bot_gazebo_spawn.launch.py   # Gazebo 中生成机器人
│   ├── bcr_bot_gz_spawn.launch.py       # Ignition Gazebo 生成机器人
│   ├── bcr_bot_ign_spawn.launch.py      # Ignition 生成机器人(备用)
│   ├── gazebo.launch.py                 # 启动 Gazebo 仿真环境
│   ├── gz.launch.py                     # 启动 Ignition Gazebo
│   ├── ign.launch.py                    # 启动 Ignition
│   ├── mapping.launch.py                # 启动地图构建(SLAM)
│   ├── nav2.launch.py                   # 启动 Navigation2(路径规划)
│   └── rviz.launch.py                   # 启动 RViz 可视化
├── LICENSE               # 项目开源协议
├── log                   # 编译和运行日志
│   ├── build_YYYY-MM-DD_HH-MM-SS   # 每次 build 的日志目录
│   ├── COLCON_IGNORE               # 忽略标记
│   ├── latest -> latest_build      # 指向最新 build
│   └── nav_demo                     # 导航 demo 的日志
├── meshes                # 机器人或环境模型的网格文件
│   ├── bcr_bot_mesh.dae  # 机器人 3D 网格
│   ├── kinect             # Kinect 相机模型相关文件
│   ├── logo.png           # 项目 logo
│   └── realsense_texture.png  # RealSense 相机纹理
├── models                # Gazebo / Ignition 世界中的对象模型
│   ├── aws_robomaker_warehouse_*  # 仓库场景模型(桌子、货架、地板等)
├── package.xml           # ROS2 包描述文件
├── README.md             # 项目说明文档
├── res                   # 资源图片
│   ├── gz.jpg            # Gazebo 截图或示意图
│   ├── isaac.jpg         # Isaac Sim 截图或示意图
│   └── rviz.jpg          # RViz 截图或示意图
├── rviz                  # RViz 配置文件
│   ├── entire_setup.rviz  # 全局可视化配置
│   └── map.rviz           # 地图显示配置
├── scripts               # 实用脚本
│   ├── remapper.py        # ROS2 topic 重映射脚本
│   ├── run_bcr_bot_sim.sh # 一键运行机器人仿真脚本
│   └── run_nav_trajectory_demo.sh  # 一键运行导航 demo
├── urdf                  # URDF / xacro 机器人描述文件
│   ├── bcr_bot.xacro     # 机器人主 xacro 文件
│   ├── gazebo.xacro      # Gazebo 特定插件和参数
│   ├── gz.xacro          # Ignition Gazebo 特定参数
│   ├── ign.xacro         # Ignition 参数
│   ├── macros.xacro      # 可复用的宏定义
│   └── materials.xacro   # 材质定义
├── usd                   # USD (Universal Scene Description) 场景文件,用于 Isaac 或其他仿真
│   ├── ActionGraphFull.usd  # 机器人动作图场景
│   ├── bcr_bot.usd          # 机器人 USD 文件
│   ├── scene.usd            # 通用场景 USD
│   └── warehouse_scene.usd  # 仓库场景 USD
└── worlds                # 仿真世界文件
    ├── empty.sdf          # 空世界(测试用)
    └── small_warehouse.sdf # 小型仓库世界场景

可视化数据流程


                        ┌─────────────────────┐
                        │   物理机器人/传感器 │
                        │   (摄像头、雷达)   │
                        └─────────┬──────────┘
                                  │ 传感器数据
                                  ▼
                        ┌─────────────────────┐
                        │   urdf/ + meshes/   │
                        │   机器人模型       │
                        └─────────┬──────────┘
                                  │ 提供 TF / 物理形态
                                  ▼
                        ┌─────────────────────┐
                        │  Gazebo / Ignition   │
                        │  仿真环境           │
                        │  worlds/ + models/   │
                        └─────────┬──────────┘
                                  │ 发布仿真传感器数据
                                  ▼
                        ┌─────────────────────┐
                        │  ROS2 Topic / TF     │
                        │  (odom, scan, img)  │
                        └─────────┬──────────┘
                                  │ 数据流
          ┌───────────────────────┼─────────────────────────┐
          ▼                       ▼                         ▼
┌─────────────────┐     ┌─────────────────┐       ┌─────────────────┐
│  SLAM / Mapper  │     │  Navigation2     │       │  RViz 可视化     │
│  config/        │     │  config/         │       │  rviz/          │
│ mapper_params.* │     │ nav2_params.*    │       │ map.rviz etc.   │
└─────────┬───────┘     └─────────┬───────┘       └─────────┬───────┘
          │                     │                           │
          │ 地图更新/路径规划    │ 控制命令 (cmd_vel)          │ 显示传感器/地图
          ▼                     ▼                           │
┌─────────────────┐     ┌─────────────────┐                 │
│  运动控制器      │◄────┤  控制指令 / 机器人运动 │────────────┘
│  (diff_drive,    │     └─────────────────┘
│   velocity cmds) │
└─────────┬───────┘
          │
          ▼
┌─────────────────┐
│ Gazebo / Ignition│  ← 执行机器人动作
│ 机器人模型移动   │
└─────────────────┘

学习路线图


bcr_bot ROS2 学习路线图
─────────────────────────────────────────────
阶段 0:环境准备
─────────────────────────────────────────────
├─ 安装 ROS2 Humble / Foxy
├─ 安装 Gazebo / Ignition / Isaac Sim
├─ 安装 colcon build 工具
├─ 配置 Python / ROS2 workspace
└─ 测试 ROS2 基础命令
    ├─ ros2 topic list
    ├─ ros2 node list
    └─ ros2 run demo_nodes_cpp talker

─────────────────────────────────────────────
阶段 1:仿真入门 (Launch + URDF + TF)
─────────────────────────────────────────────
├─ launch/
│   ├─ bcr_bot_gazebo_spawn.launch.py
│   └─ rviz.launch.py
├─ urdf/ + meshes/
│   ├─ bcr_bot.xacro
│   └─ gazebo.xacro
├─ 学习目标
│   ├─ 启动机器人仿真
│   ├─ 理解 TF 树 (base_link, odom)
│   └─ RViz 可视化传感器和模型
└─ 输出
    └─ 能看到机器人在 Gazebo 中移动,TF 树完整

─────────────────────────────────────────────
阶段 2:传感器与数据流
─────────────────────────────────────────────
├─ ROS2 Topic / TF
│   ├─ 激光雷达 / RGB 相机 / Depth
│   └─ 发布/订阅机制
├─ 学习目标
│   ├─ 理解 topic 消息类型
│   ├─ 练习 ros2 topic echo
│   └─ 理解 TF 坐标变换
└─ 输出
    └─ 能在 RViz 中看到传感器数据

─────────────────────────────────────────────
阶段 3:SLAM 地图构建
─────────────────────────────────────────────
├─ launch/
│   └─ mapping.launch.py
├─ config/
│   └─ mapper_params_online_async.yaml
├─ 学习目标
│   ├─ 启动 SLAM 节点生成地图
│   ├─ 调整地图分辨率、滤波器参数
│   └─ 理解里程计和激光数据如何构建地图
└─ 输出
    └─ 生成 bcr_map.pgm / bcr_map.yaml 地图文件

─────────────────────────────────────────────
阶段 4:导航 (Navigation2)
─────────────────────────────────────────────
├─ launch/
│   └─ nav2.launch.py
├─ config/
│   └─ nav2_params.yaml
├─ 学习目标
│   ├─ 加载地图启动 Navigation2
│   ├─ 发送目标点,实现路径规划
│   ├─ 调整局部/全局规划器参数
│   └─ 理解控制器生成速度命令 (cmd_vel)
└─ 输出
    └─ 能够让机器人从起点移动到目标点

─────────────────────────────────────────────
阶段 5:脚本与自动化
─────────────────────────────────────────────
├─ scripts/
│   ├─ run_bcr_bot_sim.sh
│   └─ run_nav_trajectory_demo.sh
├─ 学习目标
│   ├─ 一键运行仿真 + 导航
│   ├─ 理解 topic remap 与 launch 参数
│   └─ 学习 Python 脚本调用 ROS2 API
└─ 输出
    └─ 能写自动化脚本调试仿真与导航

─────────────────────────────────────────────
阶段 6:高级仿真 (Ignition / Isaac / USD)
─────────────────────────────────────────────
├─ usd/ + ign.launch.py
├─ worlds/ + models/
├─ 学习目标
│   ├─ 加载 USD 场景
│   ├─ 理解仿真物理与碰撞
│   ├─ 比较 Gazebo / Ignition 数据差异
│   └─ 模拟复杂场景和动作
└─ 输出
    └─ 能用 Isaac / Ignition 仿真复杂仓库场景

─────────────────────────────────────────────
阶段 7:综合项目实战
─────────────────────────────────────────────
├─ 改 URDF/xacro 添加新传感器
├─ 调整 SLAM / Nav2 参数优化性能
├─ 修改世界 / 模型实现自定义场景
├─ 编写脚本自动执行 demo
└─ 输出
    └─ 完整掌握 ROS2 仿真、SLAM、导航闭环

─────────────────────────────────────────────
建议学习顺序:
阶段0 → 阶段1 → 阶段2 → 阶段3 → 阶段4 → 阶段5 → 阶段6 → 阶段7