3.4 代码生成控制器通信
本小节的例程源码路径:
RflySimAPIs\SimulinkControlAPI\Rfly_API_CTRL
3.4.1 自动代码生成环境配置
注:本小节内容主要针对课程“RflySim高级版_第02讲_飞行控制算法开发”(即《多旋翼飞行器设计与控制实践》书中的系列实验)中用Simulink开发的控制器的外部通信问题。
- 针对
Simulink
生成的Pixhawk
控制算法也可以通过的QGC/Simulink API
进行控制。运行本小节的例子,需要使用Simulink
代码生成控制器,因此需要重新运行安装脚本,如右图所示配置来屏蔽PX4
自身输出。 - 注意:编译命令需要根据自己硬件修改
- 注意:
Simulink
自动生成的代码目前不支持px4_sitl_default
的编译命令,因此不支持PX4 SITL
仿真,本小节例子需要使用Pixhawk
硬件进行硬件在环仿真。
3.4.2 使用Simulink生成的遥控器信号控制Simulink设计的控制器
- 可以使用
Simulink
输出的遥控器信号控制我们自己设计的姿态控制器,例如“RflySimAPIs\FlightControlExpCourse\code\e0\3.DesignExps\Exp4_AttitudeSystemCodeGen_old.slx”
- 首先打开
“Exp4_AttitudeSystemCodeGen_old.slx”
编译固件并烧录Pixhawk
,然后用CopterSim
连接Pixhawk
并开始硬件在环仿真(高级版可以直接运行桌面HITLRun
一键快速打开硬件在环)。 - 打开并运行
“RadioControlAPI.slx”
文件,可以控制飞机起飞并前后左右移动。在QGC
中也可以观察到数据
- 首先打开
- 原理:进一步解释原理,
RadioControlAPI.slx
文件发送RC_CHANNELS_OVERRIDE
的mavlink
消息到Pixhawk
,而Exp4_AttitudeSystemCodeGen_old.slx
中使用的遥控器模块会接收该Mavlink
消息,因而可以响应。 - 同理,如果需要自己生成的代码能响应
ManulControlAPI.slx
和OffboardAPI.slx
中的输入,需要分别在Simulink
控制器中接收相应的uORB
消息。其中ManulControlAPI.slx
对应的是“MANUAL_CONTROL_SETPOINT”
的uORB
消息,OffboardAPI.slx
对应的是“POSITION_SETPOINT”
的uORB
消息。 - 注:
ManulControlAPI.slx
对应了“Exp4_AttitudeSystemCodeGen.slx”
代码生成的例程,可以响应“MANUAL_CONTROL_SETPOINT”
消息。
3.4.3 使用Simulink收发自定义消息
RflySim
平台还提供了一个外界程序与自己Simulink控制器进行交流的消息。它发送rfly_ctrl.msg
(见Firmware\msg
文件夹)的uORB
消息。定义如下:
- 该
uORB
消息可以通过外部程序发送mavlink
消息来实现“HIL_ACTUATOR_CONTROLS”
消息,其16维的controls
控制量对应于下面的定义。
- 用MATLAB打开
RflySimAPIs\SimulinkControlAPI\Rfly_API_CTRL\Rfly_Mavlink_Receiver.slx
,编译生成代码,并烧录到Pixhawk
中。如下图所示,它接收了rfly_ctrl
的uORB
消息,替换了原来的遥控器信号。 - 开启
CopterSim
和Pixhawk
的硬件在环仿真,运行“Rfly_API_CTRL\Rfly_Mavlink_API_Sender.slx”
文件,该文件可以向CopterSim
发送控制信号,CopterSim
会转发为“HIL_ACTUATOR_CONTROLS” Mavlink
消息到Pixhawk
,然后Pixhawk
再发布到rfly_ctrl
的uORB
消息池中,给上图中代码生成的px4_simulink_app
使用。如下图所示,该slx例程模拟了CH1~Ch5通道的遥控器数据,发送到了rfly_ctrl
消息中。
- 用MATLAB打开
- 本例程的实验效果与
RadioControlAPI.slx
中模拟遥控器信号控制PX4官方控制器的操作流程一致 - 实验现象与效果相同,因为两个例子都是发送了遥控器信号,只不过通信途径有区别。
- 注:在真机飞行是,用
MAVLink
向飞控发送HIL_ACTUATOR_CONTROLS
消息即可,本模块可以实现向控制发送数据