3.3 PX4官方控制器通信
本小节的例程源码路径:RflySimAPIs\SimulinkControlAPI
3.3.1 Simulink模拟发送遥控器原始数据控制无人机
- 首先用
CopterSim
连接Pixhawk
并开始硬件在环仿真同时打开三维软件(RflySim
高级版可以直接运行桌面HITLRun
一键快速打开硬件在环,或运行SITLRun
一键打开软件在环仿真),然后通过MATLAB
打开“RflySimAPIs\SimulinkControlAPI\RadioControlAPI.slx”
文件,并运行。
- 首先,向右拖动
VeZ
滑块(模拟向上推油门过中点),可以控制飞机Z方向速度,使飞机垂直起飞;- 然后,拖动
VeX
(模拟前后推俯仰摇杆)和VeY
(模拟左右拨滚转摇杆)滑块可以实现前后与左右运动,- 同样,拖动
Yaw
滑块(模拟左右拨偏航摇杆)可以控制偏航速度,控制飞机偏转。- 双击
“RCOverrideMavlink”
模块,可以看到下图所示的内部信息- 双击
“RCControlTrans”
模块,可以看到下图所示的内部信息- 双击进入
“CMDPack”
模块,可以看到下图所示的内部信息 先将数据幅值给inHILCMDData结构体,然后将结构体数据存储到netDataShortShort结构体的payload数据段中,最后将数据发出去两层封装(保证数据安全) struct inHILCMDData{ uint32_t time_boot_ms; uint32_t copterID; uint32_t modes; uint32_t flags; float ctrls[16]; }; struct netDataShortShort { TargetType tg; int len; char payload[112]; }netDataShortShort;
CopterSim
收到来自Simulink
的UDP
消息后,会生成MAVLink
消息RC_CHANNELS_OVERRIDE
(遥控器器通道覆盖),并转发给Pixhawk
实现遥控器信号的模块- 再回到最外层,点击进入
“UDP_SIL_State_Receiver”
模块- 原理:接收
CopterSim
通过UDP
发送的outHILStateData
结构体的数据,并从中提取感兴趣的值CopterSim
数据来源:转发来自Pixhawk
的Mavlink
消息,包括LOCAL_POSITION_NED
,ATTITUDE
,HOME_POSITIONE
,STIMATOR_STATUS
等struct outHILStateData{ // mavlink data forward from Pixhawk uint32_t time_boot_ms; //Timestamp of the message uint32_t copterID; //Copter ID start from 1 int32_t GpsPos[3]; //Estimated GPS position,lat&long: deg*1e7, alt: m*1e3 and up is positive int32_t GpsVel[3]; //Estimated GPS velocity, NED, m/s*1e2->cm/s int32_t gpsHome[3]; //Home GPS position, lat&long: deg*1e7, alt: m*1e3 and up is positive int32_t relative_alt; //alt: m*1e3 and up is positive int32_t hdg; //Course angle, NED,deg*1000, 0~360 int32_t satellites_visible; //GPS Raw data, sum of satellite int32_t fix_type; //GPS Raw data, Fixed type, 3 for fixed (good precision) int32_t resrveInit; //Int, reserve for the future use float AngEular[3]; //Estimated Euler angle, unit: rad/s float localPos[3]; //Estimated locoal position, NED, unit: m float localVel[3]; //Estimated locoal velocity, NED, unit: m/s float pos_horiz_accuracy; //GPS horizontal accuracy, unit: m float pos_vert_accuracy; //GPS vertical accuracy, unit: m float resrveFloat; //float,reserve for the future use }
3.3.2 Simulink模拟发送归一化遥控信号控制无人机
- 上一个例子发送的是遥控器的原始数据,因此
PWM
的输出值需要与遥控器校准值一致,否则可能出现控制偏差 - 打开
“RflySimAPIs\SimulinkControlAPI\ ManulControlAPI.slx”
,得到和上一个例子相同功能的demo
,实验流程相同,但是本demo
不需要关心遥控器校准值 - 该消息是通过实现
MANUAL_CONTROL
的mavlink
消息,在实际飞行时,也可以通过数传发送该信号来复现控制指令。
3.3.3 Simulink模拟发送使用Offboard模式的控制无人机 (推荐)
Offboard
模式是无人机的一种控制模式,通常给机载计算机或地面计算机(上位机)实时控制飞机的速度、位置、姿态等,可以把飞机当成一个整体对象,专注于顶层的视觉与集群算法开发。- 遥控器信号控制没法定量地控制飞机的速度,因此使用起来没有
Offboard
控制模式方便,但是遥控器信号控制模式是最接近人的操作的方式,在一些高机动表演控制中有更好的效果 - 本课程后续实验都是将飞机看出一个整体子对象(接收并实现速度/位置/加速度/航路等指令),因此后续系列实验将主要采用
Offboard
模式来控制飞机。由于Offboard
模式是PX4
官方控制器提供的功能,因此需要确保Pixhawk
运行的是官方固件(在前面的设置中有提到)。- 开启
CopterSim
的硬件在环(或软件在环)仿真系统 - 打开
“RflySimAPIs\SimulinkControlAPI\OffboardAPI.slx”
运行即可,可以看到飞机首先自动起飞到10m高度,然后切换“速度/位置控制”开关,拖动滑块,可以输入X方向速度5m/s(或拖动滑块VeX到期望值),在QGC
中观察速度与给定速度是否一致
- 开启
- 原理:该例子会使
PX4
进入Offboard
模式,然后发送SET_POSITION_TARGET_LOCAL_NED
的mavlink
消息来实现飞机的速度、位置、与角度等控制。该指令不需要飞机进行遥控器校准或模态设置,直接给定指定的速度或位置即可。 - 在
OffboardAPI.slx
文件中展示了三个模块例子,VelEarthFrameOffboardCtrl
是地球坐标系下速度控制模块,VelBodyFrameOffboardCtrl
是机体坐标系下速度控制,PosTargetEarthFrameOffboardCtrl
是地球坐标系下位置控制模块(给定相对起飞点的x,y,z坐标,飞机会自动飞到该点并悬停)。 - 三个模块实现方法完全相同,只不过是
Offboard
消息的几个参数(位置/速度控制模式&机体/地球坐标系)不同,Offboard
控制指令是以解锁的位置为Home_Position
坐标为原点的相对坐标(Local_Position
),因此发送的位置指令是指飞到相对解锁位置的相对坐标值。 Simulink
的Offboard
模式接口如下图,可以自行组合需要控制的指令 https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_LOCAL_NED MAVLink消息的实现方法如下图