戴训华 副教授
中南大学 计算机学院
dai.xh@csu.edu.cn
http://faculty.csu.edu.cn/daixunhua/zh_CN


4.1 软硬件配置

本节导航


本讲的例程源码路径:RflySimAPIs\OtherVehicleTypes
注意:本小节例子推荐使用PX4的官方固件,任意版本都可以,这里选择了最新固件

4.1.1 Pixhawk固件还原(需联网)方法如下:

  • 打开QGC地面站软件,断开Pixhawk;
  • 如下图所示,点击工具栏齿轮图标进入载具设置页面,再点击“Firmware”(固件)标签进入固件烧录页面;
  • 用USB线连接Pixhawk自驾仪到电脑,此时软件会自动识别 Pixhawk硬件,如右图所示所示,在界面右侧弹出固件配置窗口,勾选第一项“PX4 *”,然后点击“确定”,QGC开始自动下载(需联网,无法联网请参考下一页使用本地固件)并安装最新的 PX4 固件到Pixhawk中;

    注意1:本小节例子需要使用PX4的官方固件,任意版本均可,这里选择了最新固件 注意2:如果手头没有Pixhawk自驾仪硬件,可以跳过飞控硬件配置内容,直接进行软件在环仿真


4.1.2 Pixhawk硬件配置 — 离线固件下载(因网络无法在线下载固件时采用本方法)方法如下:

1)打开QGC地面站软件;
2)点击“Firmware”(固件)标签,此时用USB数据线连接Pixhawk自驾仪,地面站会自动检测自驾仪
3)勾选“advanced settings”(高级设置)选框;
4)点击“Standard Version (stable)”(标准版Stable)标签 – “Custom firmware file …”(自定义固件文件…)选项,再点“确定”;
5)在弹出的文件选择页面中,如果使用Pixhawk1飞控选择“RflySimAPIs\FlightControlExpCourse\code\e0\4.PX4Firmwares\px4fmu-v3_default1.10.1Stable.px4”,(如果使用Pixhawk 4,选择fmu-v5的固件)
具体如下图所示:

注意:如果文件夹中没有需要版本固件,请访问https://github.com/PX4/Firmware/releases 下载

4.1.3 安装Visual Studio 2017 (也可以用其他版本,MATLAB能识别即可)

  • 后续课程很多地方都需要用到Visual Studio编译器,例如MATLAB
  • S-Function Builder模块的使用、Simulink自动生成C/C++模型代码等
  • 这里推荐安装Visual Studio 2017,在线安装步骤(需联网)如下:
  • 双击“RflySimAPIs\SimulinkControlAPI\VS2017Installer\vs_community2017.exe”
  • 本课程内容只需勾选右图的“C++的桌面开发”即可。
  • 注意:如果后续要用于UE4C++开发,还可以在右侧“摘要”里面勾选一个最新的Window 10 SDK;再点击“单个组件”标签页,勾选NET 4.7.2(最新版即可)和对应pack包。再点安装。

    注:本小节较多例子都需要使 用VS编译器,推荐提前安装


4.1.4 为MATLAB正确配置C++编译器

  • 在MATLAB的命令行窗口中输入指令“mex -setup”
  • 一般来说会自动识别并安装上VS 2017编译器,如右图所示显示“MEX配置使用MicrosoftVisual C++ 2017”以进行编译”说明安装正确
  • 若有其他编译器,本页面还可以切换选择VS 2013/2015等其他编译器

4.1.5 平台支持的软/硬件在环仿真机型

  • RflySim平台支持任意PX4可控机型的软硬件在环仿真
  • 所有支持机型可从QGC中查看,如下图所示
  • 目前RflySim平台包含了旋翼类、固定翼类的模型,其他模型需要用户Simulink搭建

4.1.6 软/硬件在环仿真设置步骤

  • 硬件在环仿真流程:CopterSim配置模型参数或Simulink导入DLL模型 ——QGC配置Pixhawk进入对应的机架 ——QGC配置进入硬件在环仿真模式——CopterSim开始仿真
  • 软件在环仿真流程: CopterSim配置模型参数或Simulink导入飞机模型 ——PX4源码中配置机架文件 ——bat启动脚本中选定机架样式 ——一键启动软件在环
    – PX4源码中配置文件拷贝流程:“Firmware\ROMFS\px4fmu_common\init.d\airframes”文件夹中拷贝需要机型文件到“Firmware\ROMFS\px4fmu_common\init.d-posix”,例如六旋翼X布局“6001_hexa_x”和固定翼“2100_standard_plane”。
    – bat启动脚本修改:
    拷贝一份SITLRun.bat文件,修改机型PX4SitlFrame为配置文件的非数字部分,例如六旋翼为“set PX4SitlFrame=hexa_x”,固定翼为“setPX4SitlFrame=standard_plane”,其他机型类似。
    – 选择专用地形:
    推荐使用OldFactory地形,带平地跑道,适合固定翼起飞。三个地方需要修改:选择场地“SET /a UE4_MAP=OldFactory”,X坐标“SET /a ORIGIN_POS_X=-250”,以及Y坐标“SET /a ORIGIN_POS_Y=-119”即可初始到跑道上

4.1.7 建模模板例程文件夹介绍

  • 进入RflySimAPIs\OtherVehicleTypes\DLLModelTemp可以看到无人机建模模版例程
  • 其中Exp1_MinModelTemp.slx是最小系统的模版,包含了最低要求的输出和输出接口
  • Exp2_MaxModelTemp.slx是最大系统的模版,包含了更丰富的附加功能
  • GenerateModelDLLFile.p是将slx模型转化为DLL模型文件的脚本
  • Init.m包含了模型的参数信息本脚本会在slx启动是被调用 将参数载入MATLAB空间
  • **.bat是平台的一键启动脚本包含了自动拷贝DLL文件到 CopterSim目录,以及设定飞控机架等配置信息
  • MavLinkStruct包含数据结构体

4.1.8 最小模型模版—输入信号

  • 打开Exp1_MinModelTemp.slx文件,可以看到以多旋翼为例的最小模型模版
  • 它包含了1个输入接口inPWMs,16维执行器控制量输入,已归一化到-1到1尺度,它的数据来自飞控回传的电机控制MAVLink消息mavlink_hil_actuator_controls_t的controls
  • 本数据结构体的具体定义如下
    typedef struct __mavlink_hil_actuator_controls_t {
    uint64_t time_usec; //时间戳,从开机后的时间,单位ms
    uint64_t flags; //标志位,用于显示当前的飞行状态
    float controls[16]; //控制量,16维电机的控制量, 发送到模型中,驱动飞机飞行
    uint8_t mode; //模型,用于显示飞机当前的飞行模式和是否上锁等信息
    }) mavlink_hil_actuator_controls_t;

    注意:免费体验版只支持前6维输入(后面数据全0),高级完整版支持全16维输入
    注意:推荐不改变本模型模版,而是在其中修改模型参数(质量、转动惯量等)和执行器模块(转速动态响应)与作用力模型(驱动力、气动力、地面支撑和阻力等)两个模块来适配不同的载具的模型


4.1.9 最小模型模版—输出信号

  • 包含了三个输出信号(bus结构体,在 MavLinkStruct.mat中定义),分别是 MavHILSensor、MavHILGPS、 MavVehile3DInfo。
  • 其中,MavHILSensor是发送给飞控的各种传感器的数据集合,对应了MAVLink的 mavlink_hil_sensor_t消息,它的定义如右图。
  • 本结构体包含了加速度传感器的加速度值、陀螺仪传感器的角速度值、磁罗盘传感器的磁场值,气压和空速传感器的气压值等。
  • 这些传感器的值在仿真时由我们的模型提供,在真机飞行时由真实传感器芯片提供。

4.1.9 最小模型模版—输出信号

  • MavHILGPS是模型发送给飞控的GPS数据值。
  • 它对应了MAVLink消息的mavlink_hil_gps_t 结构体,具体的定义如右图。
  • 本结构体包含了,经纬高、水平竖直精度、地速、北东地的速度、偏航角、定位状态和卫星数量等数据。
  • 这些传感器的值在仿真时由我们的模型提供,在真机飞行时由真实GPS模块提供。
  • 注:GPS数据的发送频率与真实传感器硬件基本相同为10Hz,因此飞控的实时位置并不能靠GPS直接提供,需要与IMU等传感器进行融合滤波估计得到。

4.1.9 最小模型模版—输出信号

  • MavVehile3DInfo是DLL模型发送给RflySim3D的真实仿真数据(也会向30100端口发送,用于数据分析),是平滑的理想值不像传感器和GPS模块会加上噪声和振动。
  • 这些数据可用于Simulink下的飞控与模型进行软件仿真测试。由于模型真值在真机实验时是不可获取的,只能用PX4自驾仪的状态估计值(存在延迟、噪声和干扰),这就导致Simulink控制器往PX4在环仿真和真机实验时效果变差,需要进行调整。

4.1.10 最小模型模板—模型参数

  • 打开“Init.m”即可看到模型数据,本最小系统包含了以下几个关键数据。
  • ModelInit_PosE=[0,0,0]; %用于设置飞机的初始位置,对应了CopterSim上的X和Y初始值。
  • ModelInit_AngEuler=[0,0,0]; %用与设定飞机的初始姿态。
  • 注意:目前飞机姿态角的前两位(俯仰和滚转角)可以通过ModelInit_AngEuler 参数来配置,但是偏航角需要在Copter Sim中配置。
  • 针对导弹等竖直起飞的飞行器,需要设定合适的俯仰和滚转值。

4.1.11 最小模型模版—实验步骤

  • 打开“Exp1_MinModelTemp.slx”文件,点击编译(“Build Model”)按钮(需要先安装VS C++编译器)。注:MATLAB 2019b以后,在APPS - CODE GENERATION – Embedded Coder – C++ Code中可以看到编译按钮。
  • 编译完成后,右键GenerateModelDLLFile.p并点击运行,就可以生成 “Exp1_MinModelTemp.dll”的DLL模型文件。
  • 运行“Exp1_MinModelTemp.bat”脚本,可以自动打开软件在环仿真,并完成所有需要配置。
  • 在QGC中可以如之前步骤一样,控制飞机的起飞、降落、航路飞行等。
  • 注:由于本接口没有使用地形模块,地形高度始终为0,因此只能适用于平地场景不能使用Grassland等带地形的地图。

4.1.12 最大模版的使用—新增输入输出

  • 打开“Exp2_MaxModelTemp.slx”文件,可以看到最大模版,相比最小模版多了四个输入TerrainZ(1维地形高度)、inSILInts和inSILFloats(8维整型和20维浮点,可通过30100端口从外部传入模型, 实现故障注入、外部传感器等功能)、inFloatsCollision(20维浮点结构体,接收来自RflySim3D的四面射线信息,用于实现碰撞引擎)。
  • 多一个输出ExtToUE4PX4(32维浮点数,前16维发送给RflySim3D作为第9-24维执行器控制,后16维发送给PX4的uORB消息的rfly_ext,用于传输其他传感器或必要数据给飞控)。

    注意:inFloatsCollision碰撞引擎输入和ExtToUE4PX4扩展输出仅限高级完整版


4.1.13 最大模版的使用—新增参数和功能

  • 在“Exp2_MaxModelTemp.slx”例程中,利用TerrainZ实现了从CopterSim中读取当前地形高度数据, 使得飞机可以初始化在复杂地形的地表面(例如Grassland地图)。
  • 利用 inSILInts 和inSILFloats实现了一个电机故障的例子,只需要从30100端口收到指定结构体数据,当两输入第1位都大于0.5时,就会触发电机随机故障,导致飞机坠机。
  • 利用inFloatsCollision(限完整版)实现了一个简单地物理引擎,可以根据RflySim3D回传的四周距离数据,实现碰到障碍物的回弹,碰到其他飞机的坠毁等功能。
  • 利用ExtToUE4PX4输出接口,本例程中实现了前8维发送了部分电机飞机的转速值(默认全0),9到16维 发送1到8的数字,用后16维数据发送了17到32的数字。
  • 此外,最大模版还引入了几个扩展参数。
  • ModelParam_GPSLatLong和ModelParam_envAltitude:配置飞机经纬高,本参数在RflySim3DNew的全球地图大场景(限完整版)中需要,能任意指定飞机在地球三维场景中的坐标。通过本参数可以直接调整飞机在QGC中的显示坐标(适用全版本)。
  • ModelInit_Inputs:执行器的初始参数(见inPWMs后的memory模块),对固定翼和小车需要,因为它的油门在初始状态处于最小值(-1),而不是默认的0值。
  • ModelInParams:可通过外部消息动态改变的32维参数向量(限完整版),在故障注入或者可变形的异构飞行器上有用,也可动态地调整传感器模型噪声等;与inSILInts和inSILFloats形成功能互补。

    注意:附加的输入、输出和参数不需要全部加上, 只需要在使用本功能时加入模型即可,但是务必保证名称、维度和数据格式一致。


4.1.14 最大模版的使用—实验验证

  • 编译Exp2_MaxModelTemp.slx,并生成DLL模型文件Exp2_MaxModelTemp.dll
    1) TerrainZ的地形响应验证:直接运行“Exp2_MaxModelTempSITL.bat”可以看出飞机已经能初始化在街区地形表面,修改本脚本中UE4_MAP到其他地形,验证初始地形功能。
    2) inFloatsCollision的物理引擎验证(限完整版):运行上述***SITL.bat脚本,在QGC中控制飞机起飞,在RflySim3D中按下P键进入物理引擎模式,在QGC中设定飞机目标位置, 让飞机朝向建筑物飞,可以看到飞机不再穿越障碍物,而是会被弹回或停留物体表面,同时装到物体时RflySim3D也会打印碰撞物体信息。

4.1.14 最大模版的使用—实验验证
3)inSILInts 和inSILFloats 故障注入功能验证:运行上述***SITL.bat脚本,让飞机起飞在空中,然后用MATLAB打开RflySimAPIs\OtherVehicleTypes\ExternalCtrlAPI\PX4ExtMsgSender.slx并运行, 然后点击切换FaultSwitch开关,可以发送一个inSILInts和inSILFloats 首位数都是1的信号,触发电机故障,可以在RflySim3D中看到飞机坠机。

  • 同时从CopterSim中看到数据接收和飞机状态。

4.1.14 最大模版的使用—实验验证
4)ExtToUE4PX4输出接口验证(限完整版):
•打开RflySimAPIs\OtherVehicleTypes\ExternalCtrlAPI\PX4ExtMsgReceiver.slx,按照本课程第2讲的内容,进行代码编译并上传到Pixhawk飞控中,然后运行DLLModelTemp\ Exp2_MaxModelTempHITL.bat脚本,连上烧录自定义固件的Pixhawk飞控,实现硬件在环仿真。 •在RflySim3D中按下D键,可以看到ExtToUE4PX4的前16维输出,已经传输到RflySim3D中,并显示为扩充输出“Extend output”的值,用于执行器偏转/旋转显示。 •在QGC中,打开MAVLink Inspector的ACTUATOR_CONTROL_TARGET消息,可以看ExtToUE4PX4的后16维数据,说明已成功传入飞控。注:也可运行PX4ExtMsgSender.slx,从其中的40100系列端口查看本数据,详情见第二讲教程。


4.1.14 最大模版的使用—实验验证
5)ModelInParams动态修改参数验证(限完整版):

  • 打开Exp2_MaxModelTemp.slx ,可以看到inPWMs电机信号乘以一个MotorFault增益(2-ModelInParams(3))才输入到电机模型中;程序原理是:若参数ModelInParams(3) \=1则电机正常输出,若ModelInParams(3) \=2则电机输出全0。
  • 打开Init.m文件,可以看到初始化了一个32维的全零向量ModelInParams=zeros(32,1),再设置了第3维取值1,即初始时电机正常输出。
  • 注:ModelInParams的维度必须为32维,不然DLL模型无法生成。
  • 注:在模型中可以用ModelInParams(3)、 ModelInParams(4:6)等表达式来获取一维标量或三维向量。

4.1.14 最大模版的使用—实验验证
5)ModelInParams动态修改参数验证(限完整版):

  • 打开ExternalCtrlAPI\PX4ExtMsgReceiver.slx,可以看到右图所示SendToPX4ModelInParams模块,它发送 Bitmask(一维int型,32bit,某一位bit为1就更新对应的InParams参数)和一个InParams(32维double型向量,会改变DLL模型ModelInParams参数的值)。
  • 例如,我想改变DLL模型第三位参数ModelInParams(3) 需要设置Bitmask为00..0100(对应C++移位运算:1<<2, 或MATLAB移位运算bitshift(1,2) ),将第三位参数改为2,就能实现电机输出全零(见前一页PPT定义),飞机应该直接降落。
  • 注:本消息应该发送到30100系列端口(对多机就是30100+(i-1)*2号端口)。

5)ModelInParams动态修改参数验证(限完整版):

  • 运行Exp2_MaxModelTempSITL.bat脚本开启一个飞机的软件仿真,然后在QGC中控制飞机起飞。
  • 在Simulink中运行PX4ExtMsgSender.slx程序,可以看 到CopterSim提示收到PX4ModelInParams消息。
  • 将ParamSwitch开关置于1的位置,即可将Bitmask变为1<<2,InParams(3)变为2,并发送CopterSim再转发(限完整版)到DLL模型的ModelInParams参数中。
  • 此时,可以看到所有电机停转,飞机自由落体到地面上, 这说明模型的电机输入信号全变为了0,测试成功。
  • 注:本例子也可以作为一个典型的通过动态改变DLL模型参数来注入故障的例子,对于一些带参数的Simulink模块的故障注入非常实用。本接口也可以用于动态改变模型的构型、质量等,使的仿真模型更灵活。

results matching ""

    No results matching ""