7.3 Simulink集群控制进阶

本节导航


本讲的例程源码路径:RflySimAPIs\SimulinkSwarmAPI

7.3.1 Simulink集群算法编译EXE

  • MATLAB本身会占用大量的CPU和内存资源(见下图),在运行复杂的Simulink控制程序时,
  • 一方面计算量太大导致算法运行缓慢,无法达到实时要(Simulink中运行1s中大于现实时钟1s),这样就无法实时控制仿真系统(或真实系统)的集群飞机
  • 第二方面,在仿真时Simulink如果占用大量的计算资源,会导致RflySim3DCopterSim的计算资源分配较少,导致飞机仿真变差,飞机剧烈抖动甚至坠机。
  • Simulink控制器编译生成exe之后,算法可以脱离MATLAB运行,而且本身是二进制可执行文件,运行效率非常高,即使大型的控制算法,也能保证实时控制。
  • 如下图所示为用exe模式运行8个飞机集群控制算法的资源管理器图片,可以看到其内存和CPU的占用几乎为0,相比Simulink直接运行有巨大的性能提升
  • :生成exe需要安装VS编译器
  • 设置

    • 打开RflyUdpUltraSimpleFour.slx文件(或任意新建一个slx文件,但要保证GenerateSwarmExe.pRflyUdpFast.cppRflyUdpFast.mexw64拷贝到同一目录)
    • 点击Simulink的设置按钮,按下图设置。其他的都使用默认即可,关键是勾选Package Code and …,输入名字为:RflyUdpExe;然后,设置编译模式为:fasterruns(这一项非必须,设置后可以使运行速度更快)
    • ::这里需要安装Visual Studio C++编译器并配置,请参考第2.3.1讲进行配置,链接 http://doc.rflysim.com/2512558
    • 点击Simulink的编译按钮
    • 对于2019a及之前版本,工具栏样式见下图,直接点击它的编译按钮即可。
    • 对于对于2019b及之后版本,如图1所示,点击APPS - CODE GENERATIONSimulink 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个飞机SITLMATLAB可能会卡顿而炸机,也可以不打开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.255UseIP的例子要分别输入被控飞机所在电脑的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是用SimulnkUDP模块通过发送机体速度信号来控制飞机编队
    • SwarmFormEarthVelCTRL.slxSimulnkUDP模块通过发送地球速度(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)
    • 将其中的“集群控制器触发”开关拨到1,可以看到飞机组成竖直“1”字编队
    • 将“队形选择”摇杆拨到中间,可以看到飞机变换队形编程“横一”字。注意,这里的原理是给定了最终队形“一”,飞机通过人工势场等算法自动飞过去,并进行避障,不需要规定每个飞机的轨迹



    • 将“队形选择”摇杆拨到最后,可以看到飞机编程三角队形

    • 拖动syz速度控制滑块,就可以控制三角队形整体前后左右上下的运行

results matching ""

    No results matching ""