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。

二、方法流程:分层安装与验证

建议按“系统层 → 工具链层 → 中间件层 → 仿真层 → 地面站层”的顺序安装,每层完成后立即做最小验证,避免问题叠加。

  1. 系统层:更新系统、安装基础编译与串口工具。
  2. 工具链层:安装 GCC、CMake、Ninja、Python3、pip、git、colcon。
  3. 中间件层:安装 ROS 2 Humble 与 MAVROS/mavlink 相关包。
  4. 仿真层:安装 Gazebo 及飞控 SITL 依赖。
  5. 地面站层:安装 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 LTSlsb_release -a
GCC/CMake编译飞控与驱动11.x / 3.22+gcc --version
ROS 2伴飞与数据桥接Humbleros2 topic list
Gazebo动力学与传感器仿真Classic 11gazebo --version
MAVLink飞控通信协议v2mavproxy.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 开发环境分层与数据流 系统层 Ubuntu 22.04 LTS GCC / CMake / Ninja Python3 / pip / git 串口工具 minicom / picocom 中间件层 ROS 2 Humble MAVROS / MAVLink 2 colcon / rosdep / pymavlink 仿真层 Gazebo Classic 11 SITL 固件(PX4/APM) 传感器模型 / 动力学模型 地面站层 QGroundControl 参数 / 航线 / 日志 UDP 14550 / 14540 HIL 分支 真实飞控板 ← 串口/USB → 仿真机(传感器激励 + 执行器采集) SITL 分支 飞控固件进程 ← UDP → Gazebo 模型(全软件闭环) 共用 MAVLink 与 QGC

完成以上安装与自检后,环境即可支撑后续的驱动编译、SITL 闭环调试与 HIL 联调。建议把版本号、端口分配和启动脚本写入项目 README,作为团队复现验证的基线。