第三章 仿真环境搭建:从零开始构建你的飞控试验场
说实话,仿真环境搭建这件事,我见过太多人栽跟头了。
记得我刚入行那会儿,花了两周时间折腾环境,结果发现是版本不匹配。后来我带团队时,第一件事就是让大家把环境标准化。今天我就把这些年踩过的坑、总结的经验,一次性说清楚。
3.1 MATLAB/Simulink 环境配置
MATLAB/Simulink 是飞控算法开发的老本行。我个人习惯用它做早期算法验证,因为可视化强,调试方便。
3.1.1 版本选择与安装
这里有个血泪教训:不要追最新版。我曾经为了尝鲜装了2023b,结果发现 Aerospace Toolbox 的接口变了,整个项目回退花了一天。
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| MATLAB | R2022a / R2021b | 稳定,兼容性好 |
| Simulink | 同MATLAB版本 | 必须配套 |
| Aerospace Toolbox | 同MATLAB版本 | 飞控必备 |
| Stateflow | 同MATLAB版本 | 状态机建模用 |
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 联合仿真示例
这里给一个我常用的启动流程:
- 启动 Gazebo 世界:
roslaunch your_package world.launch - 加载无人机模型:
roslaunch your_package spawn_quadcopter.launch - 启动飞控节点:
rosrun your_package flight_controller_node - 启动可视化:
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
3.4.2 HITL 的适用场景
说实话,不是所有项目都需要 HITL。我一般只在以下情况才用:
- 要验证硬件驱动(比如新的 IMU 芯片)
- 要测试故障保护逻辑(比如 GPS 丢失)
- 要评估实时性能(比如控制周期抖动)
其他时候,SITL 完全够用。别为了炫技而用 HITL,浪费时间。
本章小结
环境搭建这件事,说白了就是「磨刀不误砍柴工」。我见过太多人急着写算法,结果环境没配好,浪费了更多时间。
我的建议是:先搭 SITL,再上 ROS/Gazebo,最后考虑 HITL。一步一个脚印,稳扎稳打。
记住:仿真环境是你的试验场。试验场越真实,你的算法就越可靠。别在这个环节偷懒。
公众号:蓝海资料掘金营,微信deep3321