无人机仿真环境搭建
下面给出一条 从零到可飞 的清晰路线图,并在每一步解释“为什么要这样做”。
默认操作系统为 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 || true
sudo apt-get remove --purge gazebo-* ignition-* -y
sudo apt autoremove -y
sudo rm /etc/apt/sources.list.d/gazebo-stable.list \/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
sudo apt update
2.2 安装 ROS 2 Humble
(若已安装可跳过)
sudo apt update && sudo apt install curl gnupg lsb-release -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 $(lsb_release -cs) 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
2.3 建立个人工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
echo 'source ~/ros2_ws/install/setup.bash' >> ~/.bashrc
3 Gazebo Fortress 与 ROS‑Gazebo 桥
3.1 安装 Gazebo Fortress
sudo apt install -y wget gnupg lsb-release
wget https://packages.osrfoundation.org/gazebo.gpg -O /tmp/gz.key
sudo install -m 644 /tmp/gz.key /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
echo "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/null
sudo apt update
sudo 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 # 应出现 /clock
ros2 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.git
cd PX4-Autopilot
git 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 successfully
INFO [commander] Takeoff detected
并自动弹出 Gazebo GUI 和 QGroundControl(如已安装)。
6 集成 XTDrone2(可选)
XTDrone2 已针对 PX4 1.15 + ROS 2 + Ignition 重构,可直接放进工作空间:
cd ~/ros2_ws/src
git clone https://github.com/andy-zhuo-02/XTDrone2.git
cd ~/ros2_ws && colcon build
仓库内自带 launch/xtdrone_*.launch.py
,会同时拉起 PX4 SITL、Gazebo 场景、桥接和控制节点,真正做到“一键起飞”。
7 运行与调试流程示例
-
启动仿真
ros2 launch xtdrone2 bringup_drone.launch.py world:=simple_runway.sdf
-
检查时钟 / TF / 传感器话题
ros2 topic list | grep imu
-
发送 Offboard 控制(示例)
ros2 run mavros_offboard offboard_node --ros-args -p speed:=3.0
-
在 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 提供现成世界/模型/控制脚本,显著降低无人机仿真门槛。
按本文步骤完成后,你即可:
-
在 Gazebo 中看到飞行器并通过 QGroundControl 连接。
-
用 ROS 2 节点读取 / 发布 IMU、激光、相机等话题。
-
撰写飞控、视觉、导航算法并在 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 update
sudo 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-common
sudo add-apt-repository universe
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 $(lsb_release -cs) main" | \sudo tee /etc/apt/sources.list.d/ros2.list > /dev/nullsudo apt update
sudo apt install -y ros-humble-desktop-full
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
-
目的:提供 ROS 核心、Gazebo 桥模板消息以及 rviz、rosbag 等桌面工具。
3. 建立你的 ROS 2 工作空间(可选但推荐)
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
echo "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 -y
sudo rm -f /etc/apt/sources.list.d/gazebo-stable.list
sudo rm -f /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
sudo apt update
-
目的:防止旧包与 Fortress 混装产生链依赖地狱。
5. 安装 Ignition Gazebo Fortress
# 添加 OSRF 公钥与软件源
sudo wget https://packages.osrfoundation.org/gazebo.gpg \-O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
echo "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 update
sudo 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 2
source /opt/ros/humble/setup.bash
# Ignition Fortress
source /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 默认)
两条路线
经典路线(稳定):PX4 ↔ Gazebo‑classic 11,使用 PX4 内置的
Tools/sitl_gazebo
插件。现代路线(实验性):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_Autopilot
cd ~/PX4_Autopilot
git checkout v1.13.0
bash ./Tools/setup/ubuntu.sh # 官方脚本,自动装交叉工具链
source ~/.bashrc # 脚本会添加 PATH
make px4_sitl_default gazebo # 首次编译较慢
11. 集成 XTDrone
git clone https://gitee.com/robin_shaun/XTDrone.git ~/XTDrone
cd ~/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_Autopilot
rm -rf build/
make px4_sitl_default gazebo
-
常见错误
-
找不到
libgazebo11-dev
→ 经典与 Ignition 混装;确保只装了一个系列。 -
protobuf 版本不符 →
sudo apt install protobuf-compiler
。
-
12. 启动一架仿真无人机
# 终端 1:PX4 仿真
cd ~/PX4_Autopilot
make 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. 典型工作流小结
-
打开新终端,自动
source
环境。 -
make px4_sitl_default gazebo
(PX4+Gazebo‑classic) 或ros2 launch ros_gz_sim ...
(Ignition 侧) -
启动你的 ROS 控制节点 / PX4‑MAVROS / MissionPlanner 等。
-
在 Rviz 或 Gazebo GUI 中观察传感器 / /clock / /tf。
-
用
ros2 topic pub /model/<uav>/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 的格式,以免一步到位时排错成本过高。祝你飞行顺利、仿真稳定!