第三章 仿真环境搭建:从零开始构建你的飞控试验场

说实话,仿真环境搭建这件事,我见过太多人栽跟头了。

记得我刚入行那会儿,花了两周时间折腾环境,结果发现是版本不匹配。后来我带团队时,第一件事就是让大家把环境标准化。今天我就把这些年踩过的坑、总结的经验,一次性说清楚。

3.1 MATLAB/Simulink 环境配置

MATLAB/Simulink 是飞控算法开发的老本行。我个人习惯用它做早期算法验证,因为可视化强,调试方便。

3.1.1 版本选择与安装

这里有个血泪教训:不要追最新版。我曾经为了尝鲜装了2023b,结果发现 Aerospace Toolbox 的接口变了,整个项目回退花了一天。

组件 推荐版本 说明
MATLAB R2022a / R2021b 稳定,兼容性好
Simulink 同MATLAB版本 必须配套
Aerospace Toolbox 同MATLAB版本 飞控必备
Stateflow 同MATLAB版本 状态机建模用
我的小技巧:安装时勾选 "Simulink Coder" 和 "Embedded Coder",后面做代码生成会用到。别问我怎么知道的,都是泪。

3.1.2 关键配置项

装完软件后,有几件事必须做:

  • 设置工作路径:用 addpath(genpath('你的项目路径')) 把子目录都加进去
  • 配置求解器:飞控仿真建议用 ode4 (Runge-Kutta),固定步长 0.001s
  • 开启代码生成:在 Simulink 的 Model Settings 里,把 System Target File 设为 ert.tlc
% 我常用的初始化脚本
clear; clc; close all;
addpath(genpath('./lib'));      % 工具库
addpath(genpath('./models'));   % 模型文件
addpath(genpath('./scripts'));  % 脚本文件

% 仿真参数
dt = 0.001;                     % 仿真步长
sim_time = 10;                  % 仿真时长

3.2 PX4/ArduPilot 软件在环仿真(SITL)搭建

SITL 说白了就是让飞控代码在电脑上跑,假装自己连了飞机。我当年第一次跑通 SITL 时,看到终端里刷出姿态数据,那种感觉——嗯,就像第一次让四轴飞起来一样兴奋。

3.2.1 PX4 SITL 搭建

PX4 的 SITL 其实很成熟。我建议用官方推荐的 Ubuntu 20.04,省心。

# 克隆 PX4 源码
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

# 安装依赖(这一步别跳过)
make px4_sitl_default

# 启动仿真(以 gazebo 为例)
make px4_sitl gazebo
注意: --recursive 参数不能少!我有个同事没加这个参数,结果编译报错,折腾了两天才发现是子模块没拉下来。

3.2.2 ArduPilot SITL 搭建

ArduPilot 的 SITL 稍微不同。它用 Python 脚本启动,我个人觉得更灵活。

# 克隆代码
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 安装环境
git submodule update --init --recursive
./Tools/environment_install/install-prereqs-ubuntu.sh -y

# 启动 SITL
sim_vehicle.py -v ArduCopter --console --map

看到 --console--map 了吗?这两个参数会弹出图形界面,方便你观察状态。我第一次用的时候,盯着地图上的小飞机看了十分钟。

3.3 ROS/Gazebo 联合仿真环境搭建

ROS + Gazebo 是目前最主流的仿真方案。为什么?因为生态好。你想要什么传感器模型,基本都能找到现成的。

3.3.1 ROS 安装

我推荐 ROS Noetic(Ubuntu 20.04)或 ROS2 Humble(Ubuntu 22.04)。

# ROS Noetic 安装
sudo apt install ros-noetic-desktop-full

# 初始化
sudo rosdep init
rosdep update
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

3.3.2 Gazebo 与 ROS 集成

Gazebo 本身是个独立的仿真器,但和 ROS 配合起来才叫绝配。

# 安装 gazebo_ros_pkgs
sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control

# 测试启动
roslaunch gazebo_ros empty_world.launch

核心逻辑:ROS 负责通信和算法,Gazebo 负责物理和传感器。两者通过 ros_control 接口交互。说白了,就是 ROS 发指令,Gazebo 算结果,再反馈给 ROS。

3.3.3 联合仿真示例

这里给一个我常用的启动流程:

  1. 启动 Gazebo 世界:roslaunch your_package world.launch
  2. 加载无人机模型:roslaunch your_package spawn_quadcopter.launch
  3. 启动飞控节点:rosrun your_package flight_controller_node
  4. 启动可视化:rviz

你想想看,这一套下来,你的算法就能在虚拟世界里飞了。调试起来比真机快十倍。

3.4 硬件在环仿真(HITL)简介

HITL 是仿真验证的最后一道关。说白了,就是把真实的飞控板(比如 Pixhawk)连到仿真器上。

我做过一个项目,SITL 跑得好好的,一上 HITL 就炸。后来发现是 PWM 输出频率不对。所以我的建议是:SITL 验证算法逻辑,HITL 验证硬件接口

3.4.1 HITL 的基本架构

HITL 的核心是:

  • 真实飞控板:运行实际固件
  • 仿真计算机:运行 Gazebo 或 X-Plane
  • 通信链路:通常用 MAVLink 或 UDP

我曾经用 Pixhawk 4 连 Gazebo,配置过程其实不复杂:

# 在飞控板上设置参数
param set SYS_HITL 1          # 开启 HITL 模式
param set SIM_GPS1_TYPE 1     # 使用仿真 GPS

# 启动仿真
make px4_fmu-v5_default
make px4_hitl gazebo
避坑指南:HITL 时,飞控板的传感器数据会被仿真数据覆盖。所以千万别在 HITL 模式下飞真机——我见过有人忘了切换模式,结果飞机直接翻了。

3.4.2 HITL 的适用场景

说实话,不是所有项目都需要 HITL。我一般只在以下情况才用:

  • 要验证硬件驱动(比如新的 IMU 芯片)
  • 要测试故障保护逻辑(比如 GPS 丢失)
  • 要评估实时性能(比如控制周期抖动)

其他时候,SITL 完全够用。别为了炫技而用 HITL,浪费时间。

本章小结

环境搭建这件事,说白了就是「磨刀不误砍柴工」。我见过太多人急着写算法,结果环境没配好,浪费了更多时间。

我的建议是:先搭 SITL,再上 ROS/Gazebo,最后考虑 HITL。一步一个脚印,稳扎稳打。

记住:仿真环境是你的试验场。试验场越真实,你的算法就越可靠。别在这个环节偷懒。


公众号:蓝海资料掘金营,微信deep3321