4. 开发环境搭建
自定义飞控驱动的 SITL 与 HIL 验证,本质上是在“软件飞控 + 仿真模型 + 地面站 + 通信链路”四者之间建立一条可重复、可观测、可回放的闭环。开发环境搭建的目标不是把软件装齐,而是让这条闭环在版本、接口、时钟和依赖上保持稳定。本节以 Ubuntu 22.04 LTS 为基准,给出从系统到仿真依赖的完整安装路径,并说明各组件在验证链路中的位置。
一、核心原理:环境即验证链路
SITL(Software In The Loop)把飞控固件编译为可在主机上运行的可执行程序,用 Gazebo 提供动力学与传感器模型;HIL(Hardware In The Loop)则把真实飞控板接入,由仿真机提供传感器激励并接收执行器输出。两者共用同一套 MAVLink 通信与 QGroundControl 地面站。因此环境搭建的关键是:版本匹配、接口一致、时钟同步、依赖完整。任何一处版本漂移,都会表现为“能启动但数据不对”的隐性故障。
推荐基线:Ubuntu 22.04 LTS + ROS 2 Humble + Gazebo Classic 11(或 Gazebo Sim/Garden)+ PX4/ArduPilot 固件 + MAVLink 2 + QGroundControl 稳定版。若使用 ROS 1,则对应 Noetic,但新项目建议直接采用 ROS 2。
二、方法流程:分层安装与验证
建议按“系统层 → 工具链层 → 中间件层 → 仿真层 → 地面站层”的顺序安装,每层完成后立即做最小验证,避免问题叠加。
- 系统层:更新系统、安装基础编译与串口工具。
- 工具链层:安装 GCC、CMake、Ninja、Python3、pip、git、colcon。
- 中间件层:安装 ROS 2 Humble 与 MAVROS/mavlink 相关包。
- 仿真层:安装 Gazebo 及飞控 SITL 依赖。
- 地面站层:安装 QGroundControl 并配置 UDP 链路。
# 1. 系统基础
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl wget build-essential cmake ninja-build \
python3-pip python3-venv python3-dev pkg-config
# 2. 串口与网络工具(HIL 常用)
sudo apt install -y minicom picocom net-tools iproute2
# 3. ROS 2 Humble(Ubuntu 22.04)
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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" \
| sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
sudo apt install -y ros-humble-desktop ros-dev-tools
ROS 2 安装完成后,务必验证环境变量与通信:
source /opt/ros/humble/setup.bash
ros2 topic list
ros2 run demo_nodes_cpp talker # 另开终端运行 listener 验证
三、Gazebo、MAVLink 与 QGroundControl
Gazebo 负责物理仿真,MAVLink 负责飞控与地面站/伴飞计算机之间的消息传递,QGroundControl 负责参数、航线和状态监控。三者通过 UDP/TCP 端口连接,典型 SITL 端口为 14550(地面站)与 14540(伴飞/ROS)。
# Gazebo Classic 11
sudo apt install -y gazebo11 libgazebo11-dev
# MAVLink 工具与消息库
pip3 install --user pymavlink mavproxy
sudo apt install -y libmavlink-dev
# QGroundControl(下载 AppImage 后赋权)
chmod +x QGroundControl.AppImage
./QGroundControl.AppImage
安装完成后,用一条最小 SITL 命令验证链路是否贯通:
# 以 PX4 为例,启动 SITL + Gazebo
make px4_sitl gazebo
# 另开终端查看 MAVLink 心跳
mavproxy.py --master=udp:127.0.0.1:14550 --console
若 QGroundControl 无法自动连接,检查防火墙与端口占用:sudo ufw status、ss -tulnp | grep 14550。SITL 默认只监听本机,跨机 HIL 需显式指定 -t 目标地址。
四、依赖清单与版本对照
下表给出本节涉及组件的用途、推荐版本与验证方式,可作为安装后的自检清单。
| 组件 | 用途 | 推荐版本 | 验证命令/现象 |
|---|---|---|---|
| Ubuntu | 宿主系统 | 22.04 LTS | lsb_release -a |
| GCC/CMake | 编译飞控与驱动 | 11.x / 3.22+ | gcc --version |
| ROS 2 | 伴飞与数据桥接 | Humble | ros2 topic list |
| Gazebo | 动力学与传感器仿真 | Classic 11 | gazebo --version |
| MAVLink | 飞控通信协议 | v2 | mavproxy.py 收到心跳 |
| QGroundControl | 地面站监控与调参 | Stable 4.x | 界面显示姿态与参数 |
| pymavlink | 脚本化测试 | 2.4+ | python3 -c "import pymavlink" |
五、案例场景:从零到一次 SITL 起飞
假设要验证自定义的 my_attitude_driver。先启动 SITL 与 Gazebo,确认 QGroundControl 能看到机体并解锁;再通过 MAVROS 把 /mavros/state 与自定义驱动节点连接;最后在 Gazebo 中观察姿态响应。若驱动输出异常,优先检查 MAVLink 消息频率与坐标系定义,而不是反复重装环境。
# 启动 MAVROS 桥接
ros2 launch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"
# 查看关键话题
ros2 topic echo /mavros/state
ros2 topic hz /mavros/imu/data
六、误区与复盘
- 误区一:只装 Gazebo 不装模型依赖。缺少
gazebo_ros或模型库时,SITL 能启动但机体不动,需安装ros-humble-gazebo-ros-pkgs。 - 误区二:ROS 1 与 ROS 2 混用。MAVROS 与 MAVROS2 包名、话题命名不同,混用会导致节点找不到。
- 误区三:忽略串口权限。HIL 连接真实飞控时,需将用户加入
dialout组:sudo usermod -aG dialout $USER,重新登录生效。 - 误区四:端口冲突。多个 SITL 实例同时运行会抢占 14550/14540,建议用
-i指定实例编号。
环境搭建完成后,请固定一份 env_setup.sh 记录所有版本与 source 命令,并在团队内共享。SITL/HIL 验证最怕“我这里能跑”,版本可复现比安装速度更重要。
完成以上安装与自检后,环境即可支撑后续的驱动编译、SITL 闭环调试与 HIL 联调。建议把版本号、端口分配和启动脚本写入项目 README,作为团队复现验证的基线。