MAVLINK生成自定义消息

文章描述了如何使用Git克隆Mavlink库,创建自定义XML消息,以及如何在C++中编码和解码这些消息。还涉及到了CMake项目的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git clone https://github.com/mavlink/mavlink.git

cd mavlink
    
git submodule update --init --recursive
    
python -m mavgenerate

出现以下界面
在这里插入图片描述

XML填写自定义xml路径,直接在mavlink/message_definitions/v1.0/common.xml添加

Out为输出路径

在这里插入图片描述

<?xml version="1.0"?>
    <message id="99" name="gggGGG">
      <description>hahaha</description>
      <field type="char" name="custom_char">char</field>
 
      <field type="int32_t" name="custom_int32">int32_t</field>

      <field type="float[10]" name="custom_float_array">float_array</field>

    </message>

导出的路径如下
在这里插入图片描述

//encode decode示例
#include <common/mavlink.h>
#include<iostream>

int main(){

	mavlink_gggggg_t g;
	g.custom_char = 'a';
	g.custom_int32 = 4;
	float array[]={1,2,3,4};
	memset(g.custom_float_array,0,sizeof(g.custom_float_array));
	memcpy(g.custom_float_array,array,sizeof(array));
	
	uint8_t * buffer2= new uint8_t[300];
	
	mavlink_message_t test_msg;
	mavlink_msg_gggggg_pack(0x01,0x01,&test_msg,g.custom_char,g.custom_int32,g.custom_float_array);
	mavlink_msg_to_send_buffer(buffer2,&test_msg);
// for(int i = 0 ; i < 300 ;i++){
//     printf("%#X\n",buffer2[i]);
// }
	
	
	mavlink_message_t test_msg2;
	mavlink_status_t test_status2;
	for(int i = 0 ; i < 300 ;i++){
	    if(mavlink_parse_char(MAVLINK_COMM_0, buffer2[i], &test_msg2, &test_status2)){
	        switch (test_msg2.msgid)
	        {
	        case MAVLINK_MSG_ID_gggGGG:
	            mavlink_gggggg_t g2;
	            mavlink_msg_gggggg_decode(&test_msg2,&g2);
	            printf("g2.custom_char = %c, g2.custom_int32 = %d\n",g2.custom_char,g2.custom_int32);
	            printf("g2.custom_float_array = \n");
	            for(int i = 0 ; i < sizeof(g2.custom_float_array)/sizeof(g2.custom_float_array[0]);i++){
	                printf("%f\n",g2.custom_float_array[i]);
	            }
	
	            break;
	        
	        default:
	            break;
	        }
	
	    }
	
	}

}

cmake_minimum_required(VERSION 3.0)
project(mavt)

include_directories(/home/wjd1/mavlink/outv1)

set(SRC src/main.cpp )

add_executable(a ${SRC})

### 实现接收自定义MAVLink消息 为了实现在Linux环境中接收自定义MAVLink消息,需先完成一系列准备工作并编写相应的程序来解析接收到的数据。 #### 准备工作 确保已安装必要的软件包和工具链: ```bash sudo apt install python3-pip pip3 install --user future sudo apt install python3-lxml libxml2-utils sudo apt install python3-tk git clone https://github.com/mavlink/mavlink.git --recursive cd mavlink mkdir out ``` 上述命令用于设置Python环境以及克隆官方维护的MAVLink仓库到本地机器上[^1]。接着需要利用`mavgen.py`脚本来生成针对特定应用所需的绑定文件(即支持所使用的编程语言版本的消息结构体)。这一步骤对于处理标准或是用户扩展后的XML描述文档尤为重要。 #### 创建自定义消息集 如果打算使用非默认的消息类型,则应编辑或创建新的`.msg`文件,并将其加入至现有的消息集合中去。之后运行如下指令来自动生成适用于目标平台的语言接口: ```bash python3 -m pymavlink.tools.mavgen \ --lang=C \ --wire-protocol=2.0 \ path/to/custom_message.xml \ -o gen/ ``` 这里假设采用的是C语言作为开发语言;同时指定了协议版本号为2.0,并给出了待编译的消息定义路径及其输出目录。 #### 编写接收逻辑 下面给出一段简单的代码片段展示怎样打开串口连接并且监听传入的信息流,在此过程中调用了由前序步骤产生的API函数来进行数据帧解码操作: ```c #include "mavlink.h" // ... other includes ... int main() { int fd; struct termios tty; /* Open serial port */ fd = open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_SYNC); if (fd < 0) { printf("error %d opening /dev/ttyUSB0: %s\n", errno, strerror(errno)); return -1; } // Configure the port... while(1){ uint8_t buf[1]; ssize_t len = read(fd,buf,sizeof(buf)); mavlink_message_t message; mavlink_status_t status; if(mavlink_parse_char(MAVLINK_COMM_0,*buf,&message,&status)){ switch(message.msgid){ case MAVLINK_MSG_ID_YOUR_CUSTOM_MESSAGE: // Handle your custom message here. break; default: break; } } usleep(10); // Sleep a little bit to prevent busy-waiting from consuming too much CPU time. } close(fd); return 0; } ``` 这段示范性的源代码展示了基本框架——它持续不断地尝试读取单字节字符直至遇到完整的有效负载为止。每当成功组装起一条完整的消息实例时就会触发回调机制以便进一步分析其内部字段值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值