【QGroundControl二次开发】九. QGC地面站替换自定义MAVLINK协议

一. 生成自定义mavlink协议

具体操作参考之前文章->【QGroundControl二次开发】四.QGC自定义MAVLink消息

-------------------------下面为具体操作---------------------------

在mavlink源码下的mavlink-master\message_definitions\v1.0\common.xml加入自定义协议,格式如下:

<message id="20001" name="CUS_AI_HEARTBEAT">
      <description>The heartbeat message shows AI Computer Status.</description>
      <field type="uint8_t" name="type" enum="MAV_TYPE">Vehicle or component type. For a flight controller component the vehicle type (quadrotor, helicopter, etc.). For other components the component type (e.g. camera, gimbal, etc.). This should be used in preference to component id for identifying the component type.</field>
      <field type="uint8_t" name="autopilot" enum="MAV_AUTOPILOT">Autopilot type / class. Use MAV_AUTOPILOT_INVALID for components that are not flight controllers.</field>
      <field type="uint8_t" name="base_mode" enum="MAV_MODE_FLAG" display="bitmask">System mode bitmap.</field>
      <field type="uint8_t" name="system_status" enum="MAV_STATE">System status flag.</field>
      <field type="uint8_t_mavlink_version" name="mavlink_version">MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version</field>
    </message>

与之前介绍的不同的GGC地面站是C版本的MAVLINLK,所以这里是需要生成c版本的协议。
运行源码中的mavgenerate.py脚本。
在这里插入图片描述
在Generator中的XML框中选择修改完的commo.xml文件,Out中选择生成文件的位置。
在这里插入图片描述
生成的文件如下所示:
在这里插入图片描述

二. 修改QGC文件

两种方法选其一

2.1 省事做法

复制生成文件的common下的common.h和 mavlink_msg_cus_ai_heartbeat.h到 qgc的mavlink对应位置下。
一般是在qgroundcontrol\libs\mavlink\include\mavlink\v2.0\common下

2.2 手动修改

  1. 复制生成common.h中的多出来的crc校验字段加入到qgc中common.h的校验中。
MAVLINK_MESSAGE_CRCS{...}

在这里插入图片描述

  1. 在common.h两千多行的位置引入新协议的头文件
#include "./mavlink_msg_cus_ai_heartbeat.h"
  1. 修改common.h中的MAVLINK_MESSAGE_INFO.
# define MAVLINK_MESSAGE_INFO {..., MAVLINK_MESSAGE_INFO_CUS_AI_HEARTBEAT}
  1. 修改common.h中的MAVLINK_MESSAGE_NAMES
# define MAVLINK_MESSAGE_NAMES {..., { "CUS_AI_HEARTBEAT", 20001 }}

重新编译,编译成功即无误。

你好!以下是一个使用QtMavlink的无人机地面站的简单示例代码: ```cpp #include <QCoreApplication> #include <QSerialPort> #include <QSerialPortInfo> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 查找可用的串口 QList<QSerialPortInfo> portInfoList = QSerialPortInfo::availablePorts(); QSerialPort serialPort; foreach (const QSerialPortInfo &portInfo, portInfoList) { if(portInfo.description().contains("PX4")){ serialPort.setPort(portInfo); break; } } // 配置串口参数 serialPort.setBaudRate(QSerialPort::Baud57600); serialPort.setDataBits(QSerialPort::Data8); serialPort.setParity(QSerialPort::NoParity); serialPort.setStopBits(QSerialPort::OneStop); serialPort.setFlowControl(QSerialPort::NoFlowControl); // 打开串口 if (!serialPort.open(QIODevice::ReadWrite)) { qDebug() << "Failed to open serial port."; return 1; } // 进行Mavlink通信 while (true) { QByteArray data = serialPort.readAll(); // 处理接收到的数据 // 发送数据 quint8 buffer[MAVLINK_MAX_PACKET_LEN]; mavlink_message_t message; mavlink_msg_heartbeat_pack(1, 200, &message, MAV_TYPE_QUADROTOR, MAV_AUTOPILOT_GENERIC, 0, 0, 0); uint16_t len = mavlink_msg_to_send_buffer(buffer, &message); quint64 bytesWritten = serialPort.write(reinterpret_cast<const char*>(buffer), len); if (bytesWritten == -1) { qDebug() << "Failed to write to serial port."; break; } serialPort.waitForBytesWritten(1000); } // 关闭串口 serialPort.close(); return a.exec(); } ``` 这是一个基本的示例,可以读取和发送Mavlink消息。你需要根据你的实际情况进行适当的修改和扩展。请确保安装了Qt开发环境和相应的串口库。 希望对你有帮助!如果你有更多问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值