文章目录
- [一、 前言](#一、 前言)
- 二、搭建PX4仿真
-
- [1. 下载PX4源码并编译软件在环(SITL)仿真:](#1. 下载PX4源码并编译软件在环(SITL)仿真:)
- [2.配置微型 XRCE-DDS 代理](#2.配置微型 XRCE-DDS 代理)
- 三、在MATLAB生成PX4官方自定义消息格式(px4_msgs)
- [四、 在simulink发布/订阅消息](#四、 在simulink发布/订阅消息)
- [五、 在simulink进行实时仿真](#五、 在simulink进行实时仿真)
-
- [1. Simulation Pacing(调速功能)](#1. Simulation Pacing(调速功能))
- [2. Simulink Real-Time(实时仿真)](#2. Simulink Real-Time(实时仿真))
- 3.运行仿真
一、 前言
本教程主要指导在Windows11下利用matlab/simulink相关工具进行WLS2下ROS2联合仿真环境的搭建。使用PX4仿真作为背景。如果只想要搭建ROS相关的可以跳过第二、三节。
教程编写日期为2025年11月28日,相关工具与版本为:
- PX4 v1.16.0
- WLS2(ubuntu22.04 ROS2 humble)
- MATLAB R2024b。
未安装WLS2的请点击链接:Windows上使用WSL2创建Ubuntu系统,实现无缝高效开发的体验
注意需要WLS2为最新版本,请使用wsl --update检查更新。搭建好以后使用:鱼香ROS一键安装教程,安装ROS2 Humble发行版。
二、搭建PX4仿真
本节内容完全参考PX4官方手册,官方手册很详细,可以找到更加详细的步骤。官方手册链接:PX4 Autopilot User Guide
PX4官方开发团队现在全面推荐使用ROS2,原话是:
ROS 2 能够实现与 PX4 极深度的集成,你可以在 ROS 2 中创建飞行模式,这些模式与 PX4 内部原生飞行模式毫无区别;同时还能以高速率直接读取和写入 PX4 内部的 uORB 主题。 (尤其)建议在以下场景中使用:从伴飞计算机进行控制与通信(且低延迟至关重要时)、需借助 Linux 系统的现有库时,或编写新的高级飞行模式时。
其他使用ROS2的巨大优势,在官方手册中已经详细描述,这里不过多阐述。下面给出搭建步骤。
1. 下载PX4源码并编译软件在环(SITL)仿真:
(1) 下载源码:
bash
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
(2) 执行环境搭建脚本:
bash
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh
(3) 进入源码目录:
bash
cd PX4-Autopilot/
(4) 切换到v.1.16.0版本:
bash
git checkout -b 分支名(自定义)v1.16.0
(5) 清理子模组:
bash
make distclean
(6) 更新子模组:
bash
git submodule update --recursive
(7) 编译软件在环仿真:
bash
make px4_sitl
(8) 编译完成启动仿真验证:
bash
make px4_sitl gz_x500
(9) 打开QGC
(10) 在PX4终端回车,输入commander takeoff,会看到飞机起飞。
注意WLS2需要开启镜像网络,并在Windows启动QGC连接,否则无法起飞!!
2.配置微型 XRCE-DDS 代理
(1) 下载源码:
bash
git clone -b v2.4.3 https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
(2) 进入源码目录
bash
cd Micro-XRCE-DDS-Agent
(3) 创建build构建目录并进入
bash
mkdir build && cd build
(4) 编译代码
bash
cmake .. && make
(5) 安装到系统中
bash
sudo make install && sudo ldconfig /usr/local/lib/
(6) 以后仿真想要PX4与ROS2连接起来,执行:
bash
MicroXRCEAgent udp4 -p 8888
启动PX4仿真make px4_sitl gz_x500后会自动连接,使用ros2 topic list可以查看话题
注:实物连接请参考官方手册
三、在MATLAB生成PX4官方自定义消息格式(px4_msgs)
和mavros不同的是,PX4使用DDS中间件与ROS2连接,所有的话题消息格式都是PX4官方自定义消息格式,这是为了和内部uORB主题消息保持一致,具体相关信息请参考PX4官方手册。
博主使用的是MATLAB R2024b,因为不同MATLAB版本支持的ROS版本不一样,具体请参考官方手册:ROS Toolbox

在自己Windows的matlab的工程目录下,下载px4_msgs。Windows没有git的话,建议去安装一下,毕竟git现在是常用的代码版本管理工具。
bash
git clone https://github.com/PX4/px4_msgs.git
界面如下:

然后在MATLAB命令行执行命令:
bash
ros2genmsg('E:\MATLAB_Project\ros2CustomMsgs')
MATLAB会自己寻找这个目录下的所有软件包中的msg、srv、action的相关文件,然后生成消息。
命令执行后等待一段时间(因为需要编译)。执行完毕后可使用ros2 msg list查看。消息生成一次就行,以后都会存在
前提是不要删除你的这个文件夹!
四、 在simulink发布/订阅消息
用写代码的方式来发布和订阅消息,博主不在此处描述介绍,可以参考官方文档。这里博主介绍使用simulink的方式。
首先新建一个空白模型,在simulink的APP中找到ROS,点击并设置为ROS2。


1.发布消息
我们先启动小海龟仿真:ros2 run turtlesim turtlesim_node。注意WLS2需要开启镜像网络!否则simulink无法进行通信

接着双击simulink空白处输入Publish,找到ROS2的发布模块。

双击选择/turtle1/cmd_vel话题。

双击simulink空白处输入Blank Message,双击选择对应话题的消息类型,设置采样时间为0.01,也就是100HZ。

双击simulink空白处输入 Bus Assignment,将Blank Message连接到 Bus Assignment上。然后双击Bus Assignment,改为下面的样子。

然后可以拖一个正弦模块,采样时间也需要设置为0.01,与Blank Message一致,进行输入,最终连接的为下面所示:

但是注意先不要急着仿真,在下一节我会说为什么,我们先把订阅消息的模型搭建学会。
2.订阅消息
这里示例需要用到的模块有Subscribe、Enable、Bus Selector、Display、XY Graph。
我们这里去订阅PX4的/fmu/out/vehicle_local_position话题。搭建如下所示的模型:
tips1:选中部分模块后,Ctrl+G可以快速创建子系统
tips2:订阅模块在每个时间步长都会输出一条消息(总线);如果根本未接收到任何消息,它将输出一条空白消息(即所有值均为零的消息)。因此,XY 坐标有些时候会绘制在(0,0)处。为了以便仅在接收到新消息时才做类似绘制位置的事情,我们可以加入Enable模块(创建子系统加入)


注意:这里接收的是px4的PX4的/fmu/out/vehicle_local_position话题,根据官方手册,接收px4话题的时候,要设置Subscribe订阅的QoS服务质量,如下所示:

五、 在simulink进行实时仿真
首先,这里先解释一下什么是实时仿真。
- 在实时仿真(real-time simulation)中,仿真时间与真实时间严格对应。如果现实世界经过 1 秒,仿真系统也在 1 秒真实时间内完成 1 秒时间内计算。简单来说就是仿真调试速度和实际时间对应关系为1:1。
- 在我们平常做仿真的时候,simulink会根据终止时间和步长来尽快完成所需的计算。比如仿真时间为5秒,步长为固定步长0.001(也就是1毫秒,步长的意思就是更新模型的时间间隔),simulink会尽快完成这5000次的计算。
- 在我们使用simulink要和ros进行联合仿真的时候,我们需要程序运行/模型仿真的速度要和现实时间流逝的速度一致,而不是几秒的时间就把程序运行完了,所以需要控制simulink的仿真速度!如果不控制的话,很容易会发现话题的发布频率很快,而且不可控制,这也是前面博主说先不要急着仿真的原因。
- 控制仿真速度有两种:Simulation Pacing(调速功能)、Simulink Real-Time(实时仿真) 。第一种是通过延时来实现的,用延时(pause) 来"放慢"仿真进度,使仿真时间≈真实时间 ;第二种是用实时调度器和固定周期任务保证计算完成时间=硬件采样周期 。所以推荐第二种方式。下面介绍两种方式的实现。
1. Simulation Pacing(调速功能)


2. Simulink Real-Time(实时仿真)
使用这个方式要用到实时内核,需要在MATLAB命令行执行命令:
bash
sldrtkernel -install
安装完毕以后,只需要在simulink中拖放出一个Real-Time Synchronization模块就行,不用做其他操作。
3.运行仿真
- 点击仿真运行,我们可以看到小海龟的速度按照正弦变化。
- 如果开启了PX4仿真,并订阅了消息,也可以在Display和XY Graph看到数据
tips:记得simulink模型需要选择固定步长,步长长度可以自行决定