2.2 基础实验
2.2.1 实验一: LED灯闪烁实验
1. 打开LED例程
- 用MATLAB打开例程文件
RflySimAPIs\FlightControlExpCourse\demos\1.RC-LED-Ctrl\px4demo_input_rc.slx
,可以看到如下图的获取遥控器CH3-CH4通道信号,并生成LED灯控制指令的代码(具体原理请学习基础版课程)。
2. 编译与代码生成
- 在Simulink工具栏点击Build“编译” 按钮即可开始Simulink中设计模块与PX4固件的编译;再点击“诊断”按钮,可以观察到编译的详细过程。
3. 代码生成过程与结果
- 编译过程如下图,当代码生成完毕时,会弹出右下侧窗口,可以查看报告。这里生成的px4固件在
PX4PSP\Firmware\\build\px4_fmu-v5_default\px4_fmu-v5_default.px4
4. 固件自动上传
- 用USB线连接计算机和Pixhawk的MicroUSB口。对于MATLAB 2017b~2019a,在Simulink的Code下拉菜单中点击“PX4 PSP: Upload code to Px4FMU”选项;对于MATLAB 2019b及更高版本,在MATLAB主界面的“命令行窗口”输入“PX4Upload”命令来开始自动固件上传。注:如果自动上传方法失效,请用QGC手动将上一步生成的px4文件烧录到Pixhawk中。
5. 观察效果
默认状态下,即不操作遥控器时,LED灯是蓝色慢闪状态。拨动左手的油门杆可以观察到如下效果:
- 油门杆置于右上角:蓝灯快闪;油门杆左上角:红灯快闪;油门杆左下角:红灯慢闪;油门杆右下角:蓝灯慢闪。
2.2.2 实验二:姿态控制器设计实验
1. 打开例程
- 用MATLAB打开例程文件
RflySimAPIs\FlightControlExpCourse\demos\2.Attitude-Ctrl\Exp4_AttitudeSystemCodeGen_old.slx
,可以看到如下图的获取遥控器CH1-CH4通道信号,订阅姿态和姿态角信息,并生成执行器和LED灯控制指令的姿态控制器代码(具体原理请学习基础版课程)。注意:这里发送的是uORB消息actuator_outputs而不是真实电机指令,是硬件在环仿真HITLRun的专用输出口。 如果要将代码用于真机控制请使用同文件夹下的例程文件
Exp5_ AttitudeSystemCodeGenRealFlight_old.slx
。需要将输出换成PWM_output模块,来直接控制电机PWM值。
2. 实验步骤与结果
- 在Simulink中用上一实验相同步骤进行固件编译与上传
- 正确连接电脑、Pixhawk、接收机与遥控器,确认配置正确。
- 运行桌面的HITLRun快捷方式,并输入飞控的串口号,开启硬件在环仿真
- 将遥控器CH5拨杆开关拨到最下(最靠近操作者的位置)就可以解锁控制器(Simulink控制器中编程实现的,注意这里不需要使用PX4的右下三秒解锁规则),同时观察到LED等变为红灯闪烁。
- 推动油门杆可以看到飞机起飞,然后用遥控器操控飞机进行适当飞行。
- 由于例程中控制器非常简单,飞行效果没有之前测试PX4官方固件时平稳,这也说明我们的控制器已经发挥作用。
2.2.3 实验三:log数据记录
- 用MATLAB打开例程文件
RflySimAPIs\FlightControl ExpCourse\demos\3.Log-Write-Read\px4demo_log.slx
- 本例程使用了
binary_logger
模块,设定了记录20s(程序步长250Hz,因此有5000个数据点)的四维随机数据,数据存储位置/fs/microsd/log/pixhawk
。 - 按前面实验相同步骤,将slx编译并上传Pixhawk
- 飞控重启后等待20s以上,断电,拔出内存卡,将其插入电脑,可以在log文件夹看到
Pixhawk_A.bin
的日志文件(_A.bin后缀是系统自动加的) - 将
Pixhawk_A.bin
拷贝到slx的目录下来,运行如下指令即可得到四维5000个点的数据。[datapts, numpts]=px4_read_binary_file(‘pixhawk_A.bin’)
- 再用MATLAB进行数据处理即可。
更多的RflySim平台数据记录和分析方法见此处
2.2.4 实验四:uORB读写通信
- PX4的uORB消息系统是提供了非常强大且方便的内部模块间数据交互能力,所有模块都可以将数据放在消息池中,其他模块可以从消息池订阅到所需数据。
- 用MATLAB打开
RflySimAPIs\FlightControlExpCourse\demos\4.uORB-Read-Write\ px4demo_uORB_read_write.slx
例程文件,可以看到用uORB订阅和发布了一些消息。 - uORB模块的使用方法,请参考基础版教程;本例程主要展示了,可以发布和订阅一些消息ID与消息文件名不符的情况,例如
actuator_controls.msg
的消息文件,可以读取或发送消息ID为actuator_controls_***
的消息。
2.2.5 实验五:自定义uORB消息
- PX4中如果要发布uORB消息,需要在
PX4PSP\Firmware\msg
文件夹中新建.msg后缀的消息文件,并需要在CMakeLists.txt中添加消息名字。RflySim平台提供了一个自动化的脚本PX4uORBMsgGen.m
来实现上述注册过程。 - 在目标slx文件的同级目录新建一个子文件夹(例如,msg),在其中新建多个.msg格式的消息文件,并将
PX4uORBMsgGen.m
置于此文件夹,完成下面的配置之后,启动相应.slx文件时就会自动搜索所有msg并配置。 - 新建一个
init_control
,并在slx的File-Model Properties-Callbacks(MATLAB 2019b以上的版本在MODELING-Model Settings-Model Properties-Callbacks)中添加打开slx文件时自动调用init_control
脚本。 - 在init_control.m加入如下代码,来调用PX4uORBMsgGen
addpath('.\msg')
将子目录添加到路径方便脚本调用PX4uORBMsgGen
执行脚本PX4uORBMsgGen.m - 经过上述步骤,可以实现打开slx底层控制器文件时自动运行PX4uORBMsgGen脚本,它会自动搜索本目录下的所有.msg格式的uORB消息,并自动注册到Firmware/msg路径中。
- 例如,这里在msg目录下新建名为
rfly_test.msg
的消息文件,内容为uint64 timestamp
和float32[8] control
。注意:其中timestamp变量是每条消息都必须保留的,其他变量根据自己需求添加,请参考Firmware\msg
下其他消息。可自行新建其他msg消息文件。 - 用MATLAB打开
RflySimAPIs\\FlightControlExpCourse\ demos\5.uORB-Create\px4demo_ uORB_create.slx
文件,点击编译代码,并将固件上传烧录Pixhawk飞控。 - 本例程将数字1到8发送给了刚才新建的
rfly_test
消息,这里使用了uORB发送模块。 - 打开QGC连上Pixhawk,在MAVLink Console中输入
listener rfly_test
即可检测到我们的程序输出的rfly_test
消息,可以看到数据与预设的一致。
- 例如,这里在msg目录下新建名为
2.2.6 实验六:回传提示消息
- 在飞控中,我们时常需要向外发布一些文字消息,来反映系统当前的运行状态,这个功能可以通过发送
mavlink_log
的uORB消息来实现。 - 打开
RflySimAPIs\FlightControlExpCourse\demos\6.Mavlink -Msg-Echo\px4demo_mavlink_rc.slx
例程文件,编译并上传到Pixhawk中。 - 运行桌面的HITLRun快捷方式,输入飞控串口号,开始硬件在环仿真。
- 此时,可以在CopterSim的左下消息栏和QGC的消息栏接收到发送的文本信息,横向拨动遥控器油门杆,可以返回的信息变化。
2.2.7 实验七:PX4控制器的外部通信
- 在进行硬件在环仿真时,我们常常需要向设计的Simulink控制器中发送数据(传感器数据、故障触发、控制指令、参数调整等),同时接收一些感兴趣的数据。
RflySim平台的Simulink控制器设计功能,提供了
rfly_ctr
l这一uORB消息来接收外部数据(UDP发送指定结构体到CopterSim的30100系列端口),同时提供rfly_px4
这一uORB消息来向外发送数据(向40100系列端口发送特定数据。)注:本例子作为外界与Simulink控制值器的桥梁,能够大大提高控制器开发和参数调整的效率。 注:也可以手动修改Firmware的源码,将感兴趣的数据发送到
rfly_px4
,同时在需要的地方接收rlfy_ctrl
的uORB消息,实现PX4原生控制器的通信。打开
RflySimAPIs\FlightControlExpCourse\demos\7.PX4CtrlExternalTune\PX4ExtMsgReceiver.slx
,编译并烧录到Pixhawk中。本例程以外部发送的rfly_ctr
l数据来作为遥控器输入,同时会将收到的数据向rfly_px4
发送出去,回传给外部程序。- 运行
HITLRun
,输入飞控串口号,开启硬件在环仿真。 - 用Simulink运行
PX4ExtMsgSender.slx
程序,它的接收和发送的数据如图。在右下角拨动CH3(模拟油门杆)可以实现飞机起飞。 - 在
PX4ExtMsgReceiver.slx
中定义了左侧rfly_px4
的数据与rfly_ctrl
数据相同,实验结果与此一致。 - 在QGC的MAVLink Inspector也可以通过ACTUATOR_CONTROL_TARGET观察到
rfly_px4
的值。
2.2.8 实验八:QGC实时调整控制器参数
- 在进行硬件在环仿真和真机实验时,常常需要在QGC地面站中观察飞行状态,并对控制器参数进行实时调整,以使得飞机达到最佳的控制效果。
- 这里提供一个例程,见RflySimAPIs\FlightControlExpCourse\demos\8.QGC-Param-Tune文件夹
- 新建一条自定义的参数总共需要四步
操作:
- 在slx文件所在目录,建一个
px4_simulink_app_params.c
的空白文件,并填写参数信息(包括注释),例如下图所示例程,使用PARAM_DEFINE_FLOAT定义浮点数参数名和默认值,用PARAM_DEFINE_INT32
定义整型数据,并在注释中定义参数最小、最大、精度和增长量。在本例中,我们定义了SL_RFLY_FLT
和PARAM_DEFINE_INT32
两个参数。 - 在MATLAB工作空间中,调用
Pixhawk_CSC.Parameter
函数来注册参数。这里我们通过init_control.m
来在slx打开时自动注册两参数。 - 在Simulink中增加了一个
Parameter Update Module
实现定义参数的自动更新,双击本模块,点Auto-populate List ***
,来确认参数正确导入。注:这里可以打开PX4QGCTune.slx
来进行测试。 - 然后就可以在Simulink中直接调用新建的参数,进行控制器的设计,参数可以用于常数模块、积分模块、比例模块等需要配置参数的地方,在使用时需要注意参数类型的转换(浮点数还是整型)。注:在本例中,我们使用
SL_RFLY_FLT
和PARAM_DEFINE_INT32
来发送rfly_px4
的uORB消息。
- 在slx文件所在目录,建一个
- 打开
RflySimAPIs\FlightControlExpCourse\demos\8.QGC-Param-Tune\PX4QGCTune.slx
文件,编译并上传到Pixhawk中。 - 连接Pixhawk到电脑,并打开QGC地面站,等待与Pixhawk建立连接。
- 在QGC的
设置-参数-Other-Misc
中可以看到刚才新建的两条消息(如果没找到自己的消息,可以用搜索框搜索),然后手动修改两个参数的值。 - 去QGC的MAVLink Inspector中查看
ACTUATOR_CONTROL_TARGET
消息(接收来自rfly_px4
的数据),查看两个参数的值,是否为刚才修改的值。