1. 项目背景与核心需求
在无人机和机器人开发领域,跨平台联合仿真已经成为提升开发效率的关键手段。这个项目要解决的问题非常典型:如何在Ubuntu系统上运行的PX4软件在环仿真(SITL)环境,将飞行器的姿态数据实时传输到Windows平台的MATLAB/Simulink进行算法验证和控制系统设计。
我最近在为一个四旋翼无人机项目开发新的控制算法时,就遇到了这样的需求。PX4 SITL提供了高保真的飞行动力学仿真,而MATLAB/Simulink则是控制工程师最熟悉的算法开发环境。让这两个"说不同语言"的系统实时对话,需要解决三个核心问题:
- 跨平台通信:Ubuntu和Windows之间的实时数据传输
- 协议适配:PX4 MAVLink消息到Simulink可识别格式的转换
- 时间同步:保证仿真时钟的一致性
2. 系统架构设计
2.1 整体方案选型
经过多次尝试,最终确定的方案架构如下:
code复制[Ubuntu] PX4 SITL → MAVLink → MAVROS → ROS Bridge → [Windows] MATLAB ROS Toolbox → Simulink
选择这个方案主要基于以下考虑:
- MAVLink协议:PX4原生支持的无人机通信协议,包含完整的姿态数据字段(quaternion, angular velocity等)
- ROS中间件:成熟的机器人通信框架,自带数据类型转换和序列化功能
- MATLAB ROS支持:自2019b版本后,MATLAB对ROS的支持已经相当完善
2.2 关键组件版本
- PX4 Firmware: v1.13.3 (稳定版)
- ROS: Noetic (Ubuntu 20.04对应版本)
- MATLAB: R2022a (ROS Toolbox需单独安装)
- MAVROS: 1.14.0
注意:版本匹配至关重要。我曾因使用PX2 v1.12搭配ROS Melodic导致数据类型不兼容,浪费了两天时间排查。
3. Ubuntu端配置详解
3.1 PX4 SITL环境搭建
首先在Ubuntu 20.04上配置基础环境:
bash复制# 安装依赖
sudo apt-get install git zip qtcreator cmake build-essential genromfs ninja-build
# 克隆PX4源码
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl_default gazebo
启动SITL仿真时,需要特别指定MAVLink通信端口:
bash复制make px4_sitl_default gazebo_iris mavlink_udp_port:=14560
这个端口号(14560)后续在MAVROS配置中会再次使用。
3.2 MAVROS配置技巧
安装MAVROS包:
bash复制sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras
配置MAVROS连接SITL的launch文件(sitl_mavros.launch):
xml复制<launch>
<arg name="fcu_url" default="udp://:14560@127.0.0.1:14560" />
<arg name="gcs_url" default="" />
<arg name="tgt_system" default="1" />
<arg name="tgt_component" default="1" />
<include file="$(find mavros)/launch/node.launch">
<arg name="pluginlists_yaml" value="$(find mavros)/launch/px4_pluginlists.yaml" />
<arg name="config_yaml" value="$(find mavros)/launch/px4_config.yaml" />
<arg name="fcu_url" value="$(arg fcu_url)" />
<arg name="gcs_url" value="$(arg gcs_url)" />
<arg name="tgt_system" value="$(arg tgt_system)" />
<arg name="tgt_component" value="$(arg tgt_component)" />
</include>
</launch>
启动MAVROS节点:
bash复制roslaunch mavros sitl_mavros.launch
验证数据流:
bash复制rostopic echo /mavros/imu/data
应该能看到实时的姿态数据输出。
4. Windows端MATLAB配置
4.1 ROS环境配置
在Windows端需要建立与Ubuntu的ROS网络连接。首先在两台机器上设置ROS_MASTER_URI:
Ubuntu端(ROS Master所在机器):
bash复制export ROS_MASTER_URI=http://[Ubuntu_IP]:11311
export ROS_IP=[Ubuntu_IP]
Windows端(MATLAB所在机器):
cmd复制set ROS_MASTER_URI=http://[Ubuntu_IP]:11311
set ROS_IP=[Windows_IP]
重要提示:关闭两台机器的防火墙,或至少开放11311(ROS Master)和所有后续通信端口。
4.2 MATLAB ROS工具箱使用
在MATLAB中初始化ROS连接:
matlab复制rosinit('[Ubuntu_IP]', 11311)
创建Simulink模型,从ROS话题获取数据:
- 在Simulink Library Browser中找到"ROS Toolbox"
- 拖入"Subscribe"模块,设置Topic为"/mavros/imu/data"
- 添加"ROS To Workspace"模块转换数据格式
- 使用"Bus Selector"提取需要的字段(如orientation, angular_velocity等)
5. 数据转换与时间同步
5.1 四元数到欧拉角转换
PX4默认使用四元数表示姿态,而很多控制算法需要欧拉角。在Simulink中添加转换模块:
matlab复制function euler = quat2euler(q)
% q = [w x y z]
roll = atan2(2*(q(1)*q(2) + q(3)*q(4)), 1 - 2*(q(2)^2 + q(3)^2));
pitch = asin(2*(q(1)*q(3) - q(4)*q(2)));
yaw = atan2(2*(q(1)*q(4) + q(2)*q(3)), 1 - 2*(q(3)^2 + q(4)^2));
euler = [roll; pitch; yaw];
end
5.2 时间同步方案
由于两个平台时钟不同步,建议采用以下两种方案之一:
方案1:ROS时间同步
matlab复制% 在Simulink中使用ROS Time模块
msg = rosmessage('sensor_msgs/Imu');
msg.Header.Stamp = rostime('now');
方案2:外部触发同步
在PX4端添加自定义MAVLink消息,包含仿真时间戳,通过MAVROS转发到MATLAB。
6. 性能优化与实测数据
6.1 通信延迟测试
使用以下方法测量端到端延迟:
- 在PX4中添加一个方波信号
- 在MATLAB中记录接收时间
- 计算平均延迟
实测结果(千兆有线网络):
| 数据量 | 平均延迟 | 最大延迟 |
|---|---|---|
| 50Hz | 12ms | 25ms |
| 100Hz | 18ms | 42ms |
6.2 优化建议
- 网络配置:使用有线连接代替WiFi,延迟可降低30-40%
- 消息频率:将IMU数据发送频率控制在100Hz以内
- 消息过滤:只订阅必要的话题,如只订阅
/mavros/imu/data而非所有MAVROS话题
7. 常见问题排查
7.1 连接失败问题
症状:MATLAB无法连接到ROS Master
排查步骤:
- 在Ubuntu执行
rostopic list确认ROS Master正常运行 - 在Windows执行
ping [Ubuntu_IP]测试网络连通性 - 检查
ROS_MASTER_URI设置是否正确
7.2 数据不更新问题
症状:Simulink接收到的数据时间戳不更新
解决方案:
- 检查PX4 SITL是否正常运行(查看Gazebo界面)
- 确认MAVROS节点已正确连接(查看
rostopic echo /mavros/state) - 重启MATLAB ROS节点(
rosshutdown然后重新rosinit)
7.3 数据类型不匹配
症状:Simulink报"Bus signal type mismatch"错误
解决方法:
- 在MATLAB命令行执行
rosmsg show sensor_msgs/Imu确认消息结构 - 在Simulink中右键Subscribe模块选择"Update Message Types"
8. 进阶应用:双向通信
完成基础姿态数据传输后,可以进一步实现Simulink到PX4的控制指令回传:
- 在Simulink中设计控制算法
- 通过
/mavros/setpoint_raw/attitude话题发送控制指令 - PX4端需要配置:
bash复制rosrun mavros mavcmd long 511 31 1000 0 0 0 0 0
这个命令启用MAVLink的EXTENDED_SYS_STATE消息,允许外部控制。
在实际项目中,这套系统成功将我们的控制算法开发周期缩短了60%。一个特别有用的技巧是在MATLAB中创建实时可视化界面,同步显示PX4仿真状态和算法输出,极大方便了调试过程。