3. PSP工具箱

../_images/3-13.jpg

Simulink 与 Pixhawk 自驾仪代码生成关系图

上图展示了 PSP 工具箱、PX4 软件系统与 Pixhawk 硬件系统之间的关系。该工具箱的主要功能包括:

(1)能在 Simulink 中对不同的飞机模型和自驾仪算法进行仿真和测试,并能自动将算法部署到 Pixhawk 自驾仪系统中;
(2)PSP 工具箱提供了一些实用实例,包括灯光控制、遥控器数据处理和姿态控制器等;
(3)PSP 工具箱中提供了很多接口模块,用于访问 Pixhawk 硬件系统的软/硬件组件;
(4)能自动记录传感器、执行机构以及部署进去的控制器的飞行数据;
(5)能订阅和发布 uORB 话题消息。PX4 软件系统的所有数据都暂存在一个 uORB消息池中,通过 uORB 订阅功能可以从消息池中读取感兴趣的话题,通过 uORB 模块的发布功能可以将特定的话题发布到消息池中供其他模块使用。

Simulink 生成的代码与 Pixhawk 自驾仪系统的关系总结如下:

(1)Pixhawk 自驾仪系统的软/硬件结构包括:Pixhawk 硬件系统(类似于计算机主机)和 PX4 自驾仪软件系统(类似于主机上运行的操作系统和应用程序)。
(2)整个 PX4 自驾仪软件系统可以分为若干个小模块,每个模块独立运行(多线程并行),各个模块通过 uORB 模块的订阅与发布功能实现数据的传输与交互。
(3)Simulink 生成的代码部署到 PX4 自驾仪软件系统之后,不会影响原生 PX4 自驾仪软件系统的运行,而是新增一个名为“px4 simulink app”的独立模块(独立线程)并行于其他模块运行。
(4)整个代码生成与部署过程如下:
  • PSP 工具箱将在 Simulink 中设计的控制算法生成 C 代码;
  • 将代码导入到 PX4 自驾仪软件系统的源代码中,生成一个“px4 simulink app”独立运行的程序;
  • PSP 工具箱调用编译工具将所有代码编译为“.px4”的 PX4 自驾仪软件固件文件(类似于系统镜像文件);
  • 将得到的固件文件下载到 Pixhawk 自驾仪系统中并烧录,由 Pixhawk 自驾仪系统执行带有生成算法代码的 PX4 软件。
(5)由于原生 PX4 控制算法可能需要访问和“px4_simulink_app”同样的硬件输出资源,这会产生读写冲突。因此,平台一键部署脚本提供了自动屏蔽 PX4 原生固件对执行器的选项,以确保只有“px4_simulink_app”模块能够输出电机控制量。
../_images/3-14.jpg

Simulink 与 Pixhawk 自驾仪代码生成关系图

(6)生成的 Simulink 代码也可以用于替换PX4 软件系统的某些原生模块(位置控制器、卡尔曼滤波器、姿态控制器等),但是需要手动修改 PX4 固件代码来屏蔽原始模块的输出接口(另一种可行方法是修改PX4模块启动脚本文件 “Firmware\ROMFS\px4fmu_common\init.d\rcS”,并注释掉想要屏蔽的模块)。例如,想用 Simulink 实现一个姿态滤波器模块(输入传感器数据,输出状态滤波数据)来替换 PX4 原始的滤波器,需要手动屏蔽 “Position & Attitude Estimator”滤波器模块向 uORB 消息池发布滤波后姿态数据(对应名为vehicle_attitude的uORB消息)的代码。具体操作示例为:
① 打开“Firmware\src\modules\ekf2\ekf2_main.cpp”文件(扩展卡尔曼滤波器模块对应代码);
②在其中屏蔽掉”ORB_ID(vehicle_attitude)”消息相关的发送代码。例如,搜索关键字”_att_pub”的代码行,并找到其中含有”publish”和”att”的发送代码行,将其替换为“UNUSED(att);”。
③ 在Simulink中编写姿态滤波器,并用”uORB Write”模块发送”vehicle_attitude”消息即可实现姿态滤波器功能的替换。

3.2. 工具箱内各个模块的使用说明

(1)遥控输入模块
通过这个模块可以选择接收遥控器的通道数量和其他的一些信息。每个选项的含义可单击对话框的“Help”按钮查看或者查阅官方文档。同时 PSP 工具箱还提供了学习这一模块的例子(详见文件”e0/2.PSPOfficialExps/px4demo_input_rc.slx”)。
../_images/3-18.jpg

遥控器输入模块及其参数设置框

(2)PWM 输出模块
PWM 输出模块用于发送 PWM 信号到 PX4IO 的输出端口以控制电机转动,在配置页面中可以选择 PWM 的更新率及输出通道。
../_images/3-19.jpg

PWM 输出模块及其参数设置框

(3)FMU 输出模块
FMU 输出模块用于发送 PWM 信号到 PX4FMU 的输出端口以控制舵机的偏转,在配置页面中可以选择 PWM 的更新率及输出通道。
../_images/3-20.jpg

FMU 输出模块及其参数设置框

(4)蜂鸣器模块
通过这个模块可以控制蜂鸣器发出提示音。PSP 工具箱还提供了学习这一模块的例子(详见文档”C:\PX4PSP\examples\px4demo_tune.slx”)。
../_images/3-21.jpg

蜂鸣器模块及其参数设置框

(5)RGB LED 模块
通过这个模块可以控制 LED 灯闪烁的模式和颜色。该模块接收有两个输入,一个是模式(Mode),另一个是颜色(Color)。PSP 工具箱还提供了学习这一模块的例子(详见文档”C:\PX4PSP\examples\px4demo_rgbled.slx”)。
../_images/3-22.jpg

RGB LED 模块及其参数设置框

(6)传感器数据组合模块
通过传感数据组合模块可以获取 Pixhawk 中可用的传感器数据,然后这些数据可以用于 Simulink 控制器的设计。可获取的传感器数据包括磁力计、加速度计、陀螺仪、气压计和时间戳。在模块的设置页面可以配置采样频率和想要输出的传感器信号。PSP 工具箱还提供了学习这一模块的例子(详见文档”e0/2.PSPOfficialExps/px4demo_attitude_control.slx”)。
../_images/3-23.jpg

传感器数据组合模块及其参数设置框

(7)姿态数据模块
姿态数据模块提供了经过滤波的姿态数据(欧拉角和四元数)。PSP工具箱还提供了学习这一模块的例子(详见文档”e0/2.PSPOfficialExps/px4demo_attitude_control.slx”)。
../_images/3-24.jpg

姿态数据模块及其参数设置框

(8)GPS 数据模块
通过该模块可以获取 Pixhawk 的 GPS 数据,它是通过订阅 uORB 话题“vehicle_gps”实现的。因此,在实际运行时需要 Pixhawk 上插入 GPS模块才能保证正确发布该话题,从而获取正确的 GPS 数据。PSP 工具箱还提供了学习这一模块的例子(详见文档”e0/2.PSPOfficialExps/px4demo_gps.slx”)。
../_images/3-25.jpg

GPS 数据模块及其参数设置框

(9)电池数据模块
通过这个模块可以获取电池的实时数据,它是通过订阅uORB 话题“battery status”实现的,所以在实际运行时需要保证 Pixhawk 上插入电源模块才能获取正确数据。
../_images/3-26.jpg

电池数据模块及其参数设置框

(10)uORB 模块
通过uORB 模块可以从 PX4 自驾仪软件系统中读取或发送 uORB 消息,其中 PX4 自驾仪软件系统支持的所有 uORB 消息类型可以在软件包安装目录(默认路径是”C:\PX4PSP”)下的”Firmware\msg”目录中查看。
../_images/3-27.jpg

用于消息读写的 uORB 模块

双击“uORB Write”模块可以打开uORB 消息配置界面,在其中可以选择发送的 uORB 消息名称和数据。

../_images/3-28.jpg

uORB 消息配置界面

单击uORB 消息配置界面中的“Open .msg file”按钮可以打开选定的 uORB消息文件;单击“Open .msg folder”按钮打开消息目录。

../_images/3-29.jpg

uORB 消息文件

下面为两个高级的“uORB Write”模块,提供更为简单的发送 uORB 消息的接口。

../_images/3-30.jpg

uORB 模块参数设置框“Open.msg folder”消息目录

实际上,前面提到的所有模块(如 PWM 输出模块、RGB LED 模块等)在底层均是通过uORB 消息的读写来实现的。理论上,通过 uORB 消息的读写,Simulink 可以获取并发送 PX4 自驾仪软件系统内所有消息和中间变量,来实现更高级的控制器功能。同时,PSP 工具箱还提供了学习这一模块的例子(详见文档“e0/2.PSPOfficialExps/px4demo_fcn_call_uorb_example.slx”和“e0/2.PSPOfficialExps/px4demo_write_uorb_example.slx”)。

PX4 自驾仪软件系统的开发者网站提供了 自定义 uORB 消息的教程 ,以及 通过MAVLink 协议与外部设备进行数据交互的教程 。通过以上教程,可以实现从外部设备接收数据,并解码为自定义的 uORB 消息。结合PSP中的uORB 模块,可以实现生成的”px4_simulink_app”与外部硬件的通信。

../_images/3-31.jpg

高级 uORB Write 模块及它们之间的区别

(11)Pixhawk 内部参数
为了方便调参与测试,PSP 工具箱还提供了读取 Pixhawk 内部参数的方法。这样可以在飞行测试实验中,直接通过地面站软件来修改 Simulink 生成控制器的参数,而不需要在 Simulink 中修改参数,再生成代码并重新下载 Pixhawk。访问内部参数的例程展示在 “e0/2.PSPOfficialExps/px4demo_Parameter_CSC_example.slx”文件中。
../_images/3-32.jpg

PX4 内部参数读取例程

../_images/3-33.jpg

参数初始化脚本设置

访问 Pixhawk 内部参数是通过 Pixhawk CSC.Parameter({*, *}) 函数实现的,需要将该函数放入Simulink菜单栏的”File”-“Model Properties”-“Callbacks”-“InitFcn”中。