【QGroundControl二次开发】七.QGC自定义MAVLink消息MavLink通信协议 C++应用

1. 接收解析源码分析

通过接收串口或UDP发来的的字节流buffer,长度length=buffer.size(),通过下列脚本解析,每解析出一个mavlink数据包就执行onMavLinkMessage函数

for(int i = 0 ; i < length ; ++i){
      msgReceived = mavlink_parse_char(MAVLINK_COMM_1, (uint8_t)buffer[i], &message, &status);
if(msgReceived){
      emit onMavLinkMessage(message);
 }
}

其中: void onMavLinkMessage(mavlink_message_t message);是得到一个MAVLink消息包后的处理函数,需要根据这个消息的ID来识别当前包的用途(心跳包,GPS位置,姿态等),并提取出感兴趣的数据。

解析函数实现如下,根据message.msgid跳到对应的_decode函数,解码出数据

void onMavLinkMessage(mavlink_message_t message){
  switch (message.msgid){
    case MAVLINK_MSG_ID_GLOBAL_POSITION_INT:{
      mavlink_global_position_int_t position;
      mavlink_msg_global_position_int_decode(&message, &position);
      ui->label->setText("经度:"+QString::number(position.lat* 1e-7)// 将整数经纬度转换为度
                      + "\n 纬度:"+QString::number(position.lon* 1e-7)
                      + "\n 高度:"+QString::number(position.alt)// 以米为单位的高度
               );
      break;
     }
    } 
  }

2. 发送源码解析 — 发送一条mavlink_hil_actuator_controls消息

在这里插入图片描述

void sendHILCtrlMessage(uint8_t modes, uint64_t flags, float ctrl[])

{
	mavlink_hil_actuator_controls_t hilctrl;
	hilctrl.mode = modes;
	hilctrl.flags = flags;
	
	for(int i=0;i<16;i++){
		hilctrl.controls[i]=ctrl[i];
	}
	mavlink_message_t mess;
	mavlink_msg_hil_actuator_controls_encode(SystemID, TargetCompID, &mess, &hilctrl);
	
	char buffer[500];
	memset(buffer,0,500);
	unsigned int length = mavlink_msg_to_send_buffer((uint8_t*)buffer, & mess);
	udp.writeDatagram(buffer,length);//通过UDP或者串口将buffer发送出去即可
}

参考:
https://mavlink.io/zh/messages/common.html
https://doc.rflysim.com/3.2MAVL.html
https://blog.csdn.net/qq_44070755/article/details/122222337

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值