无人机UAV与地面站QGC通讯MAVLink协议学习笔记

写在前面

  最近要学习了解一下Qgroundcontrol中所使用的一些与无人机载体通讯的一些方式,所以在这里记录一下学习的过程。

参考学习资源

QGroundControl用户指南

【无人机开发】通讯协议MavLink详解

MavLink 地面站QGC与飞控PX4/APM外挂设备的通信实现

MAVLink协议通信分析——(二)消息结构

MAVLink

  通过 USB、遥测无线电或 WiFi 将车辆连接到地面站设备。

  其中,MAVLink(Micro Air Vehicle Link,微型空中飞行器链路通讯协议)是无人飞行器与地面站(Ground Control Station ,GCS)之间通讯,以及无人飞行器之间通讯最常用的协议。它已经在PX4、APM、PIXHAWK和Parrot AR.Drone飞控平台上进行了大量测试。

消息结构

MAVLink官网协议构成

发送消息

//设备的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));
        //其他处理...
    }
}

还在学习中,未完待续~~~

猜你喜欢

转载自blog.csdn.net/weixin_45386937/article/details/113756194