7.3 Simulink集群控制进阶
本讲的例程源码路径:RflySimAPIs\SimulinkSwarmAPI
7.3.1 Simulink集群算法编译EXE
MATLAB
本身会占用大量的CPU
和内存资源(见下图),在运行复杂的Simulink
控制程序时,- 一方面计算量太大导致算法运行缓慢,无法达到实时要(
Simulink
中运行1s中大于现实时钟1s),这样就无法实时控制仿真系统(或真实系统)的集群飞机 - 第二方面,在仿真时
Simulink
如果占用大量的计算资源,会导致RflySim3D
和CopterSim
的计算资源分配较少,导致飞机仿真变差,飞机剧烈抖动甚至坠机。 - 将
Simulink
控制器编译生成exe之后,算法可以脱离MATLAB
运行,而且本身是二进制可执行文件,运行效率非常高,即使大型的控制算法,也能保证实时控制。 - 如下图所示为用
exe
模式运行8个飞机集群控制算法的资源管理器图片,可以看到其内存和CPU
的占用几乎为0,相比Simulink
直接运行有巨大的性能提升 - 注:生成
exe
需要安装VS编译器 设置
- 打开
RflyUdpUltraSimpleFour.slx
文件(或任意新建一个slx
文件,但要保证GenerateSwarmExe.p
、RflyUdpFast.cpp
和RflyUdpFast.mexw64
拷贝到同一目录) - 点击
Simulink
的设置按钮,按下图设置。其他的都使用默认即可,关键是勾选Package Code and …
,输入名字为:RflyUdpExe
;然后,设置编译模式为:fasterruns
(这一项非必须,设置后可以使运行速度更快) - 注::这里需要安装
Visual Studio C++
编译器并配置,请参考第2.3.1讲进行配置,链接 http://doc.rflysim.com/2512558 - 点击
Simulink
的编译按钮 - 对于
2019a
及之前版本,工具栏样式见下图,直接点击它的编译按钮即可。 对于对于
2019b
及之后版本,如图1所示,点击APPS
-CODE GENERATION
–Simulink Coder
才能弹出代码生成工具栏,在其中如图2所示点击Build
按钮就能编译生成代码
图1
图2
- 打开
- 编译结果
- 编译完成后,在“诊断视图
Diagnostic Viewer
中得到下图的编译成功完成提示(请忽略黄色的警告) - 如下图,我们可以得到一个
RflyUdpExe.zip
压缩包文件,里面包含所有生成的代码,会用于我们后续生成exe
文件
- 编译完成后,在“诊断视图
运行效果
- 注意:上一步编译命令时生成了一个
RflyUdpUltraSimpleFour.exe
文件,双击它可以运行,但是它不符合实时控制要求(始终以最快速度运行,不和现实时钟同步),因此需要运行我们的脚本来生成实时控制的exe
文件。 - 如图1,鼠标右键点击
GenerateSwarmExe.p
文件,并点击“运行。或者直接在MATLAB
命令行输入GenerateSwarmExe
,即可如图2所示得到Simulink
文件名对应的.exe
文件RflyUdpUltraSimpleFour.exe
。 - 双击
RflyUdpUltraSimpleFour.bat
,开启4机SITL
系统,点击上一步生成得到的exe
文件即可同Simulink
一样控制飞机起飞画圆,exe
运行窗口如图3
图1- 注意:上一步编译命令时生成了一个

图2

图3
- 其他例子
- 请自行用
exe
代码生成的方式运行8机飞行的例子(需要电脑配置支持),例程文件见RflyUdpUltraSimpleEight.exe
。 - 请自行用
exe
代码生成的方式运行20机飞行的例子(仅限完整版,且需要电脑配置支持),例程文件见RflyUdpUltraSimple20.exe
。 RflySimAPIs\SimulinkSwarmAPI
文件夹下所有例程均支持生成exe
文件,再进行软件/硬件在环仿真。请自行尝试运行这些例子- 注:体验版限制只能4个飞机,因此不能实现本例程(和后续几个例程)效果;完整版运行20个飞机例程,需要强大电脑配置,一般而言会有抖动或坠机,属于正常现象
- 请自行用
7.3.2 八个飞机飞8字编队例子
- 进入
RflySimAPIs\SimulinkSwarmAPI\UAV8Swarm3D
文件夹(限完整版运行) - 用
MATLAB
打开UAV8Swarm3D.slx
文件,可以看到其中的Simulink
飞8字编队控制算法。注:本算法可以用于1~10个飞机的编队控制 - 自行阅读内部实现
- 实验效果
- 运行本目录的
UAV8Swarm3D.bat
会自动打开八个飞机的SITL
仿真模式。或者插入8
个飞控,运行RflySimAPIs\SimulinkSwarmAPI\HITLRunUdpSimple.bat
来开启八个飞机的硬件在环。
* 注:本例子最多可控制10
个飞机的编队,也可以将UAV8Swarm3D.bat
修改VehicleNum
幅值语句为SET VehicleNum=10
。 - 打开
MATLAB
,运行UAV8Swarm3D.slx
文件即可看到飞机依次起飞,编队飞8字。注意:配置不够的电脑,同时运行8个飞机SITL
和MATLAB
可能会卡顿而炸机,也可以不打开MATLAB
,按之前步骤生成UAV8Swarm3D.exe
来运行8字编队
- 运行本目录的
RflySim
: 如何快速将集群仿真算法部署到室内真机集群平台上,本视频观看地址:
优酷:https://v.youku.com/v\_show/id\_XNDcwNjA4NDU2OA==.html
YouTube:https://youtu.be/sLIatdHL6FY
如下图所示,本例子的代码还可以直接用于更多飞机的编队实验。注:室内试验需要用到Optitrack
视觉定位系统来获取位置,室外可直接用GPS
定位来编队。

7.3.3 分布式局域网仿真
- 例程文件见
RflySimAPIs\SimulinkSwarmAPI\DistributedSwarmSim
,其中包含了两个文件夹BroadCast
:用广播的通信方式来局域网组网仿真;UseIP
:用指定两台电脑IP
地址的方式来组网仿真。 BroadCast
的例子的优点是配置简单,不需要查看两台电脑在局域网中的地址,拷贝到其他电脑可以直接运行,但是通信效率低、不稳定、延迟大。UseIP
的例子与广播的方式相反,配置较为麻烦(需要指定两台电脑的IP),但是性能较高、通信速度快、延迟小,在更多飞机的仿真时推荐使用本模式。- 在两个代码文件夹中都包含两个
bat
文件,需要在两台电脑分别运行 - 注:体验版限制只能4个飞机且限单台电脑,不能运行本例程
bat
脚本编写注意事项SITLRunUdpSimple1_4.bat
用于一台电脑,用于开启1~4
号飞机的软件在环仿真。相对于其他bat
脚本,它的修改如下SET /a START_INDEX=1
语句后,另起一行加上SET /a TOTOAL_COPTER=8
;对于BroadCast
例程,将其SET IS_BROADCAST=0
修改为:SET IS_BROADCAST=1
;对于UseIP
例程,使用SET IS_BROADCAST=192.168.1.5
,其中192.168.1.5
是用于Simulink
集群控制的电脑的IP
地址。SITLRunUdpSimple5_8.bat
用于第二台电脑,用于开启5~8
号飞机的软件在环仿真。相对于其他bat
脚本,它的修改如下- 将其
SET /a START_INDEX=1
修改为:SET /a START_INDEX=5
;在该语句后,另起一行加上SET /a TOTOAL_COPTER=8
;对于BroadCast
例程,将其SET IS_BROADCAST=0
修改为:SET IS_BROADCAST=1
;对于UseIP
例程,使用SET IS_BROADCAST= 192.168.1.5
,其中192.168.1.5
是用于Simulink
集群控制的电脑的IP
地址
Simulink
例子- 打开
DistributedSwarmSim\BroadCast\RflyUdpUltraSimpleEight_Dist.slx
,器内部实现情况如下,里面包含了两个UDP
通信模块,分别于两台电脑进行通信 BroadCast
例子的IP地址都输入255.255.255.255
,UseIP
的例子要分别输入被控飞机所在电脑的IP
地址(例如192.168.3.101
)- 左边模块对应
1~4
号飞机,起始端口号为20100
;右边飞机从5
开始,起始端口20108
Broadcast
例子的两个UDP
通信模块的配置UseIP
例子的两个UDP
通信模块的配置
- 打开
RflySim
: 如何在局域网多台电脑上快速启动分布式的无人机集群软件在环仿真,本视频观看地址:
优酷:https://v.youku.com/v\_show/id\_XNDcwNjA4NDE2OA==.html
YouTube:https://youtu.be/fmzYADSQyj0
7.3.4 带自动防撞的无编队集群实验
- 实验例程见文件夹
RflySimAPIs\SimulinkSwarmAPI\SwarmForm
,其中包含三个程序:SwarmFormBodyVelCTRL.slx
是用Simulnk
的UDP
模块通过发送机体速度信号来控制飞机编队SwarmFormEarthVelCTRL.slx
用Simulnk
的UDP
模块通过发送地球速度(NED
坐标系)信号来控制飞机编队SwarmFormEarthVelCTRLUdpAPI.slx
是利用我们提供的多机UDP
模块(UDP_Full
模式)来发送地球速度(NED
坐标系)控制信号
- 下面以
SwarmFormEarthVelCTRLUdpAPI.slx
为例子,介绍一下操作流程 - 实验效果
- 双击运行
SwarmFormSITL.bat
脚本来新建三个飞机的SITL
仿真(或者插入三个Pixhawk
,双击运行SwarmFormHITL.bat
并输入三个飞控的串口号,来新建三个HITL
仿真系统)。 - 等到
CopterSim
上提示EKF初始化完毕
(硬件在环时Pixhawk
的LED灯变绿灯闪烁,软件在环时地面站上显示进入Hold
模式) - 此时运行
SwarmFormEarthVelCTRLUdpAPI.slx
程序,可以在RflySim3D
上观察到飞机慢慢起飞(按下键盘S
键可以观看每个飞机ID) - 等到飞机起飞并平稳后,可以去按后文步骤,切换到编队模式,观察编队效果。
注:运行该实验时,不可暂停Simulink程序的运行。
- 将其中的“集群控制器触发”开关拨到
1
,可以看到飞机组成竖直“1”字编队 - 将“队形选择”摇杆拨到中间,可以看到飞机变换队形编程“横一”字。注意,这里的原理是给定了最终队形“一”,飞机通过人工势场等算法自动飞过去,并进行避障,不需要规定每个飞机的轨迹。
- 将“队形选择”摇杆拨到最后(取值为3),可以看到飞机编程三角队形。
- 拖动
syz速度控制滑块
,就可以控制三角队形整体前后左右上下的运行
- 双击运行