matlab/simulink与WLS2下ROS2联合仿真环境搭建

文章目录

  • [一、 前言](#一、 前言)
  • 二、搭建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仿真

本节内容完全参考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(调速功能)


使用这个方式要用到实时内核,需要在MATLAB命令行执行命令:

bash 复制代码
sldrtkernel -install

安装完毕以后,只需要在simulink中拖放出一个Real-Time Synchronization模块就行,不用做其他操作。

3.运行仿真

  • 点击仿真运行,我们可以看到小海龟的速度按照正弦变化。
  • 如果开启了PX4仿真,并订阅了消息,也可以在Display和XY Graph看到数据
    tips:记得simulink模型需要选择固定步长,步长长度可以自行决定
相关推荐
AGANCUDA3 小时前
智能焊接机器人模拟器
机器人
海伯森技术4 小时前
赋予人形机器人“细腻触觉”:海伯森六维力传感器的材质与集成改革
人工智能·机器人·材质
Dev7z6 小时前
基于OpenCV和MATLAB的椭圆检测系统的设计与实现
人工智能·opencv·matlab
AI脚下的巨人7 小时前
机器人逆运动学:从SVD到IK算法
算法·机器人
源代码杀手11 小时前
66 个可直接访问的机器人项目合集!涵盖科研 / 教育 / 工业 / 医疗(附详细介绍与项目代码链接)
机器人
科普瑞传感仪器11 小时前
从轴孔装配到屏幕贴合:六维力感知的机器人柔性对位应用详解
前端·javascript·数据库·人工智能·机器人·自动化·无人机
jianqiang.xue1 天前
别把 Scratch 当 “动画玩具”!图形化编程是算法思维的最佳启蒙
人工智能·算法·青少年编程·机器人·少儿编程
WWZZ20251 天前
快速上手大模型:深度学习12(目标检测、语义分割、序列模型)
深度学习·算法·目标检测·计算机视觉·机器人·大模型·具身智能
喵手2 天前
AI在自动化与机器人技术中的前沿应用
人工智能·机器人·自动化