最近要学习了解一下Qgroundcontrol中所使用的一些与无人机载体通讯的一些方式,所以在这里记录一下学习的过程。
QGroundControl用户指南
【无人机开发】通讯协议MavLink详解
MavLink 地面站QGC与飞控PX4/APM外挂设备的通信实现
MAVLink协议通信分析——(二)消息结构
通过 USB、遥测无线电或 WiFi 将车辆连接到地面站设备。
其中,MAVLink(Micro Air Vehicle Link,微型空中飞行器链路通讯协议)是无人飞行器与地面站(Ground Control Station ,GCS)之间通讯,以及无人飞行器之间通讯最常用的协议。它已经在PX4、APM、PIXHAWK和Parrot AR.Drone飞控平台上进行了大量测试。
//设备的SYS ID 一般1为飞控
#define SYS_ID 2
//设备的COMP ID 在mavlink协议中找MAV_COMPONENT,最好不要重合
#define COMP_ID 8
//自己定义的结构体和数据,怎么实现都可以
m_pkg_t pkg;
//将结构体数据复制到字节数组中
uint8_t data[sizeof(m_pkg_t)];
memcpy(data,&pkg,sizeof (m_pkg_t));
auto vehicles = qgcApp()->toolbox()->multiVehicleManager()->vehicles();
//向每个飞机都发送这个指令
for(int i=0;i<vehicles->count();i++)
{
Vehicle* vehicle = qobject_cast<Vehicle*>((vehicles->get(i)));
if(vehicle==nullptr || !vehicle->parameterManager()->parametersReady())
continue;
mavlink_message_t msg;
mavlink_msg_serial_control_pack_chan(
SYS_ID,
COMP_ID,
vehicle->priorityLink()->mavlinkChannel(),
&msg,
SERIAL_CONTROL_DEV_ENUM_END,//这个串口号PX4和arduplilot都不处理
HELMET_DATA_UP_FLAGE,
0,
0,
sizeof(m_pkg_t),
data);
vehicle->sendMessageOnLink(vehicle->priorityLink(), msg);
}
参考MAVLINK_MSG_SERIAL_CONTROL消息在src/Vehicle/Vehicle.h中申明信号的函数根。
signals:
//...
// MAVlink Serial Data
void mavlinkSerialControl(uint8_t device, uint8_t flags, uint16_t timeout, uint32_t baudrate, QByteArray data);
//Raw Sersial Data 接收数据信号
void rawSerialDataReceived(QByteArray data);
//...
在src/Vehicle/Vehicle.cc中过滤MAVLINK_MSG_ID_RTX_UAV2GCS消息,并发射rawSerialDataReceived信号
//...
case MAVLINK_MSG_ID_SERIAL_CONTROL:
{
mavlink_serial_control_t ser;
mavlink_msg_serial_control_decode(&message, &ser);
if(ser.device == SERIAL_CONTROL_DEV_ENUM_END)
{
emit rawSerialDataReceived(QByteArray(reinterpret_cast<const char*>(ser.data), ser.count));
}
else
{
emit mavlinkSerialControl(ser.device, ser.flags, ser.timeout, ser.baudrate, QByteArray(reinterpret_cast<const char*>(ser.data), ser.count));
}
}
//...
在需要处理的位置连接信号完成消息接收处理
connect(_vehicle, &Vehicle::rawSerialDataReceived, this, &XXXX::_receiveData);
void XXXX::_receiveData(QByteArray data)
{
if(data.count()==)sizeof(m_pkg_t)
{
m_pkg_t pkg;
memcpy(&pkg,data.data(),sizeof(m_pkg_t));
//其他处理...
}
}
还在学习中,未完待续~~~