> 技术文档 > 无人机仿真环境搭建_gazebo + ros 环境无人机仿真

无人机仿真环境搭建_gazebo + ros 环境无人机仿真

下面给出一条 从零到可飞 的清晰路线图,并在每一步解释“为什么要这样做”。
默认操作系统为 Ubuntu 22.04 LTS(ROS 2 Humble 的官方平台);如无特别说明,命令均在终端中执行。


1  版本选择与总体架构

角色 建议版本 说明 ROS 2 发行版 Humble Hawksbill(LTS,维护到 2027 年) 无人机算法与上层应用运行环境 Gazebo(Ignition) Fortress (‑gz 6) Humble 官方配套版本,二进制包完备、API 稳定 (Gazebo Sim) ROS↔Gazebo 桥接 ros_gz 系列包 ros_ign_* 已过渡到 ros_gz_*,Humble 上两者兼容 (GitHub) 飞控 / SITL PX4 v1.15.x(当前稳定分支,2025‑02 发布 v1.15.4)(releasealert.dev) 官方已将 Ignition Gazebo 定为首选仿真后端 无人机场景与脚本 XTDrone2(PX4 v1.15 + ROS 2 + Gazebo Ignition)(GitHub) 较旧的 XTDrone(ROS 1 / PX4 1.13)仍可用,但推荐直接使用新分支

为什么不用 Garden / Harmonic?
Humble 的官方二进制桥接包仍以 Fortress 为基线;除非你愿意手动编译 ros_gz,对初学者并不划算。


2  基础环境

2.1 清理历史 Gazebo(可选)

sudo killall gzserver gzclient || truesudo apt-get remove --purge gazebo-* ignition-* -ysudo apt autoremove -ysudo rm /etc/apt/sources.list.d/gazebo-stable.list \\ /usr/share/keyrings/pkgs-osrf-archive-keyring.gpgsudo apt update

2.2 安装 ROS 2 Humble

(若已安装可跳过)

sudo apt update && sudo apt install curl gnupg lsb-release -ysudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \\ -o /usr/share/keyrings/ros-archive-keyring.gpgecho \"deb [arch=$(dpkg --print-architecture) \\ signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \\ http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main\" | \\ sudo tee /etc/apt/sources.list.d/ros2.list > /dev/nullsudo apt updatesudo apt install ros-humble-desktop -yecho \'source /opt/ros/humble/setup.bash\' >> ~/.bashrc

2.3 建立个人工作空间

mkdir -p ~/ros2_ws/srccd ~/ros2_wscolcon buildecho \'source ~/ros2_ws/install/setup.bash\' >> ~/.bashrc

3  Gazebo Fortress 与 ROS‑Gazebo 桥

3.1 安装 Gazebo Fortress

sudo apt install -y wget gnupg lsb-releasewget https://packages.osrfoundation.org/gazebo.gpg -O /tmp/gz.keysudo install -m 644 /tmp/gz.key /usr/share/keyrings/pkgs-osrf-archive-keyring.gpgecho \"deb [arch=$(dpkg --print-architecture) \\ signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] \\ http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main\" | \\ sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/nullsudo apt updatesudo apt install ignition-fortress -y

验证:

ign gazebo shapes.sdf # GUI 正常弹出即成功

3.2 安装 ros_gz 集成包

sudo apt install ros-humble-ros-gz-sim \\  ros-humble-ros-gz-bridge \\  ros-humble-gz-ros2-control # 如需 ros2_control

ros_gz_sim 提供 Ignition Gazebo 的 ROS‑launch 包;ros_gz_bridge 实现双向消息转换 (ROS Documentation)。


4  快速验收 “ROS ↔ Gazebo” 通路

# 终端 A:启动仿真(空世界)ros2 launch ros_gz_sim gz_sim.launch.py gz_args:=\"-r empty.sdf\" gui:=true use_sim_time:=true# 终端 B:查看话题ros2 topic list # 应出现 /clockros2 topic echo /clock # 时钟在运行

如要显式桥接键盘、激光、速度等,可用:

ros2 run ros_gz_bridge parameter_bridge \\ /world/empty/clock@rosgraph_msgs/msg/Clock@ignition.msgs.Clock

5  PX4 SITL 部署

PX4 在 v1.15 起正式将 Ignition Gazebo 列为默认;
gz_ 前缀目标对应 Ignition,gazebo-classic 对应旧版 Gazebo Classic (PX4 Documentation)。

5.1 依赖与源码

sudo apt install git python3-pip ninja-build ccache \\  libignition-gazebo6-dev libignition-math6-dev -ycd ~git clone https://github.com/PX4/PX4-Autopilot.gitcd PX4-Autopilotgit checkout v1.15.4 # 或最新稳定标签git submodule update --init --recursive

5.2 编译 Ignition Gazebo 版本

make px4_sitl gz_x500 # x500 四旋翼示例# 如果只想启动 PX4 等待外部仿真器:# make px4_sitl none_x500

成功后应看到:

[px4] INFO [px4] Startup script returned successfullyINFO [commander] Takeoff detected

并自动弹出 Gazebo GUI 和 QGroundControl(如已安装)。


6  集成 XTDrone2(可选)

XTDrone2 已针对 PX4 1.15 + ROS 2 + Ignition 重构,可直接放进工作空间:

cd ~/ros2_ws/srcgit clone https://github.com/andy-zhuo-02/XTDrone2.gitcd ~/ros2_ws && colcon build

仓库内自带 launch/xtdrone_*.launch.py,会同时拉起 PX4 SITL、Gazebo 场景、桥接和控制节点,真正做到“一键起飞”。


7  运行与调试流程示例

  1. 启动仿真

    ros2 launch xtdrone2 bringup_drone.launch.py world:=simple_runway.sdf
  2. 检查时钟 / TF / 传感器话题

    ros2 topic list | grep imu
  3. 发送 Offboard 控制(示例)

    ros2 run mavros_offboard offboard_node --ros-args -p speed:=3.0
  4. 在 RViz2 查看点云 / 路径


8  常见坑与解决思路

症状 可能原因 处理办法 library ignition-transport6 not found 缺少 libignition-transport6-dev sudo apt install libignition-transport6-dev PX4 编译报 gazebo_msgs 冲突 系统残留 Gazebo Classic 包 重新执行第 2.1 步完全清理 GUI 打开黑屏 NVIDIA 独显驱动 / Wayland 切换到 Xorg 或更新显卡驱动 ros2 topic echo /clock 无输出 桥接未建立或 use_sim_time 未打开 确认终端已 source 各自 setup.bash,检查 parameter_bridge

9  小结

  • ROS 2 Humble + Gazebo Fortress 是当前最稳的官方组合。

  • ros_gz_sim / bridge 让 ROS 消息与 Gazebo Transport 无缝互通。

  • PX4 v1.15 开始原生支持 Ignition Gazebo (gz_* 目标)。

  • XTDrone2 提供现成世界/模型/控制脚本,显著降低无人机仿真门槛。

按本文步骤完成后,你即可:

  1. 在 Gazebo 中看到飞行器并通过 QGroundControl 连接。

  2. 用 ROS 2 节点读取 / 发布 IMU、激光、相机等话题。

  3. 撰写飞控、视觉、导航算法并在 SITL 中闭环测试,再迁移到真实硬件。

祝你仿真顺利,Happy Flying!

下面给出一份 自洽、可执行且按依赖顺序排列 的无人机仿真环境搭建指南,并说明每步操作的目的与常见坑。
假设操作系统为 Ubuntu 22.04 LTS(PX4 v1.13、ROS 2 Humble 和 Gazebo Fortress 的官方推荐环境)。


0. 总览:组件与角色

组件 版本/包 作用 互联方式 ROS 2 Humble Hawksbill 无人机高层算法、话题通信框架 原生 Ignition Gazebo Fortress (gazebo6) 3D 物理/视觉仿真 ros_gz_*PX4 Autopilot v1.13.0 (稳定版) 无人机飞控 SITL 与 Gazebo 通过 UDP/MAVLink 或 Ignition 插件对接 XTDrone dev 分支 PX4‑friendly 的模型/世界/启动脚本 复制到 PX4 仓库 ros_gz_bridge / ros_gz_sim ROS ↔ Ignition 桥 & 启动器 话题类型映射、一次性启动 Gazebo ROS 包

为什么选 Fortress 而不是 Gazebo‑classic 11?
经典 Gazebo 11 是 PX4 v1.13 的“官方”组合;Ignition(Fortress)在 2024 年后已成为主线,且 ROS 2 Humble 官方桥接包默认对接 Ignition。若你更追求“稳”,可将本文的 Fortress 换成 gazebo11 并以 gazebo_ros_pkgs 做桥;否则按下文流程即可。


1. 安装基础依赖

sudo apt updatesudo apt install -y git curl gnupg lsb-release build-essential cmake ccache \\  python3-colcon-common-extensions python3-vcstool
  • 目的:为 ROS 构建系统、PX4 编译器链、后续添加 PPA 做准备。


2. 安装 ROS 2 Humble

sudo apt install -y software-properties-commonsudo add-apt-repository universesudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \\ -o /usr/share/keyrings/ros-archive-keyring.gpgecho \"deb [arch=$(dpkg --print-architecture) \\ signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \\ http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main\" | \\ sudo tee /etc/apt/sources.list.d/ros2.list > /dev/nullsudo apt updatesudo apt install -y ros-humble-desktop-fullecho \"source /opt/ros/humble/setup.bash\" >> ~/.bashrc
  • 目的:提供 ROS 核心、Gazebo 桥模板消息以及 rviz、rosbag 等桌面工具。


3. 建立你的 ROS 2 工作空间(可选但推荐)

mkdir -p ~/ros2_ws/srccd ~/ros2_wscolcon buildecho \"source ~/ros2_ws/install/setup.bash\" >> ~/.bashrc
  • 目的:隔离你未来自定义的 ROS 软件包,避免污染全局 /opt/ros.


4. 彻底清理旧版 Gazebo/Ignition(若曾安装)

sudo killall gzserver gzclient ignition gazebo &>/dev/null || true # 终止残留进程sudo apt remove --purge -y gazebo-* ignition-* sdformat*  # 卸载+清理配置sudo apt autoremove -ysudo rm -f /etc/apt/sources.list.d/gazebo-stable.listsudo rm -f /usr/share/keyrings/pkgs-osrf-archive-keyring.gpgsudo apt update
  • 目的:防止旧包与 Fortress 混装产生链依赖地狱。


5. 安装 Ignition Gazebo Fortress

# 添加 OSRF 公钥与软件源sudo wget https://packages.osrfoundation.org/gazebo.gpg \\ -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpgecho \"deb [arch=$(dpkg --print-architecture) \\ signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] \\ https://packages.osrfoundation.org/gazebo/ubuntu-stable \\ $(lsb_release -cs) main\" | \\ sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/nullsudo apt updatesudo apt install -y ignition-fortress # 元包,含 GUI、渲染、传感器、Physics

验证

ign gazebo shapes.sdf
  • 目的:确保 Gazebo GUI 能正常启动;若看见彩色几何体不停旋转即成功。


6. ROS 2 ↔ Ignition 桥与一键启动器

sudo apt install -y \\ ros-humble-ros-gz-sim # 启动脚本 + 系统插件sudo apt install -y \\ ros-humble-ros-gz-bridge # 动态话题桥sudo apt install -y \\ ros-humble-gz-ros2-control # 若需 ros2_control 驱动仿真机器人

对应表:
Gazebo‑classic ↔ gazebo_ros_pkgs
Ignition Gazebo ↔ ros_gz_* (前身 ros_ign)


7. 环境变量整理

把下列行 一次性 加到 ~/.bashrc 末尾(顺序重要):

# ROS 2source /opt/ros/humble/setup.bash# Ignition Fortresssource /usr/share/ignition/gazebo6/setup.sh# (可选)你的工作区source ~/ros2_ws/install/setup.bash
  • 目的:打开任意新终端即可获得 ROS、Ignition、个人包三套环境变量。


8. 快速自测:一次性起 Sim + 桥 + GUI

ros2 launch ros_gz_sim gz_sim.launch.py \\ gz_args:=\"-r empty.sdf\" \\ gui:=true \\ use_sim_time:=true

检查:

ros2 topic echo /clock # 应持续输出 sim 时钟
  • 失败排查:若 /clock 不存在,多半是桥配置缺失;见下节自定义 YAML。


9. 高级:用 YAML 定制自动桥接

~/ros2_ws/bridge_clock.yaml 示例

- ros_topic_name: \"/clock\" gz_topic_name: \"/world/empty/clock\" ros_type_name: \"rosgraph_msgs/msg/Clock\" gz_type_name: \"ignition.msgs.Clock\"

启动:

ros2 launch ros_gz_sim gz_sim.launch.py \\ gz_args:=\"-r empty.sdf\" \\ gui:=true \\ use_sim_time:=true \\ config_file:=\"$HOME/ros2_ws/bridge_clock.yaml\"
  • 目的:无需手动 parameter_bridge;一条命令搞定 Gazebo+桥。


10. 安装并编译 PX4 v1.13(Gazebo‑classic 默认)

两条路线

  1. 经典路线(稳定):PX4 ↔ Gazebo‑classic 11,使用 PX4 内置的 Tools/sitl_gazebo 插件。

  2. 现代路线(实验性):PX4 ↔ Ignition Gazebo,需 px4_gz 插件(PX4 master 分支才有)。

下文以 经典路线 为例,因为 XTDrone 目前仍依赖 classic Gazebo。

10.1 系统依赖

sudo apt install -y \\ gazebo11 libgazebo-dev \\ libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \\ protobuf-compiler python3-jinja2

10.2 获取并编译

git clone https://github.com/PX4/PX4-Autopilot.git ~/PX4_Autopilotcd ~/PX4_Autopilotgit checkout v1.13.0bash ./Tools/setup/ubuntu.sh # 官方脚本,自动装交叉工具链source ~/.bashrc # 脚本会添加 PATHmake px4_sitl_default gazebo # 首次编译较慢

11. 集成 XTDrone

git clone https://gitee.com/robin_shaun/XTDrone.git ~/XTDronecd ~/XTDrone# 按 README 选择与 PX4 版本匹配的分支# 复制模型/世界/插件cp -r sitl_config/launch/*  ~/PX4_Autopilot/launch/cp -r sitl_config/worlds/*  ~/PX4_Autopilot/Tools/sitl_gazebo/worlds/cp -r sitl_config/models/*  ~/PX4_Autopilot/Tools/sitl_gazebo/models/cp -r sitl_config/gazebo_plugin/*/* ~/PX4_Autopilot/Tools/sitl_gazebo/src/cp sitl_config/CMakeLists.txt  ~/PX4_Autopilot/Tools/sitl_gazebo/

重新编译

cd ~/PX4_Autopilotrm -rf build/make px4_sitl_default gazebo
  • 常见错误

    1. 找不到 libgazebo11-dev → 经典与 Ignition 混装;确保只装了一个系列。

    2. protobuf 版本不符 → sudo apt install protobuf-compiler


12. 启动一架仿真无人机

# 终端 1:PX4 仿真cd ~/PX4_Autopilotmake px4_sitl_default gazebo # 自动拉起 Gazebo‑classic GUI# 终端 2:桥接 MAVROS / 自己的 ROS 节点(可选)ros2 launch mavros px4.launch.py fcu_url:=udp://localhost:14540@

如果你执意使用 Ignition Fortress 而非 classic:

  • 把 PX4 升级到 master

  • 编译 make px4_sitl_default px4_gz;

  • ros_gz_* 做桥;
    但 XTDrone 需自行修改 URDF/SDF 与插件,工作量较大。


13. 典型工作流小结

  1. 打开新终端,自动 source 环境。

  2. make px4_sitl_default gazebo (PX4+Gazebo‑classic) ros2 launch ros_gz_sim ... (Ignition 侧)

  3. 启动你的 ROS 控制节点 / PX4‑MAVROS / MissionPlanner 等。

  4. 在 Rviz 或 Gazebo GUI 中观察传感器 / /clock / /tf。

  5. ros2 topic pub /model//cmd_vel ... 做闭环测试。


14. 常见疑难速查

现象 可能原因 处理 undefined reference to \'gazebo::msgs::XYZ\' during PX4 build Gazebo11 与 Fortress 头文件混合 sudo apt purge ignition-* 或反之 /clock 不发布 没有桥接、YAML 配置错路径 检查 `ros2 topic list gz: command not found 安装了 Fortress (ign) 而使用了 classic 命令 ign gazebo ... 才是 Ignition CLI GUI 打不开,报 GLX 显卡驱动与 hardware acceleration 更新 NVIDIA 驱动或 LIBGL_ALWAYS_SOFTWARE=1 临时软件渲染

结语

以上流程把 环境清理 → 组件安装 → 桥接验证 → PX4 & XTDrone 编译 → 仿真起飞 的逻辑拆解为可追踪的 14 步,避免版本混杂和循环依赖。
如需切换到完全基于 Ignition 的现代栈,请先让 basic demo 正常运行,再逐步把 PX4/XTDrone 切换到 px4_gz 与 SDF > 1.9 的格式,以免一步到位时排错成本过高。祝你飞行顺利、仿真稳定!