MavLink简单使用

参考连接: https://mavlink.io/zh/

整体说明

本文不探究mavlink协议的具体内容,只说明如何简单使用。环境: win10 c/c++

MAVLink仓库clone

我们其实clone的是一个工具,此工具可以帮我们把定义文件转成代码。发送端和接收端使用相同的代码,对数据进行打包和解包。

使用命令行:
git clone https://github.com/mavlink/mavlink.git --recursive

或者小乌龟:
MavLink简单使用_第1张图片

定义文件在:mavlink\message_definitions\v1.0文件夹下。打开test.xml,看看内容,应该就知道怎么写定义文件了。

MavLink简单使用_第2张图片

如何打开这个工具?

此工具是用Python写的,所以需要安装python,我们去官网下载最新的即可。官网

安装时,需要把python加入到环境变量(勾选下图红框选项)。默认安装即可(Install Now)
MavLink简单使用_第3张图片

安装python的future模块
用命令行安装
MavLink简单使用_第4张图片
鼠标双击mavlink\mavgenerate.py文件,工具就打开了。
MavLink简单使用_第5张图片

如何使用这个工具?

首先需要选择一个定义文件。
本例中,将mavlink\message_definitions\v1.0\test.xml复制一份重命名为mavlinktest.xml。

MavLink简单使用_第6张图片
用记事本打开,将消息的名字改成MY_MAV。其它内容不变。要注意的是:定义文件中定义的数组长度都是3。写代码的时候得保持一致。
MavLink简单使用_第7张图片

然后使用工具将这份定义文件变成代码。
MavLink简单使用_第8张图片
生成的文件如下图所示。实际应用时,将生成的文件放到工程里,并包含一个头文件#include “mavlinktest/mavlink.h”。
从生成文件可以得知:mavlinktest文件夹的名字是定义文件的名字。
MavLink简单使用_第9张图片

简单的代码示例

用vs2019新建一个控制台应用程序MavlinkTest。将生成的代码复制到工程里去。目录结构如下
MavLink简单使用_第10张图片
主函数如下

// MavlinkTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include 

#include "mavlinktest/mavlink.h"

int main() {
  /*发送方:*/
  // 第一步,打包msg
  mavlink_message_t msg;
  // 数组的长度是在定义文件里定义的
  uint8_t uint8_t_array[3] = {0, 1, 2}; 
  uint16_t uint16_t_array[3] = {0, 1, 2};
  uint32_t uint32_t_array[3] = {0, 1, 2};
  uint64_t uint64_t_array[3] = {0, 1, 2};
  int8_t int8_t_array[3] = {0, 1, 2};
  int16_t int16_t_array[3] = {0, 1, 2};
  int32_t int32_t_array[3] = {0, 1, 2};
  int64_t int64_t_array[3] = {0, 1, 2};
  float float_array[3] = {0, 1, 2};
  double double_array[3] = {0, 1, 2};
  // 可代替的函数 mavlink_msg_my_mav_pack 或 mavlink_msg_my_mav_encode_chan
  mavlink_msg_my_mav_pack_chan(
      0, 0, 0, &msg, 'a', "hello world!", 1, 1, 1, 1,
      1, 1, 1, 1, 1.1, 1.1, uint8_t_array,
      uint16_t_array, uint32_t_array, uint64_t_array,
      int8_t_array, int16_t_array, int32_t_array,
      int64_t_array, float_array, double_array);

  // 第二步,将msg转成uint8_t的数组,注意数组的长度一定要够长
  uint8_t buf[512] = {0};
  uint16_t rlen = mavlink_msg_to_send_buffer(buf, &msg);

  // 第三步,通过网口、串口等其它的方式发送数组
  // ...................



  /*接收方:*/
  //第一步,通过网口、串口等其它的方式将接收到的数据转成uint8_t[]
  // ...................

  // 第二步,逐字符解析
  for (int i = 0; i < rlen; i++) {
    mavlink_status_t rstatus;
    mavlink_message_t rmsg;
    //解析的状态, 在解析出问题时可以根据这个状态进行问题的跟踪
    // std::cout << rstatus.parse_state;
    if (mavlink_parse_char(0, (uint8_t)(buf[i]), &rmsg, &rstatus) == 1) {
      switch (rmsg.msgid) {
        case MAVLINK_MSG_ID_MY_MAV:
          mavlink_my_mav_t my_mav;
          mavlink_msg_my_mav_decode(&rmsg, &my_mav);
          std::cout << my_mav.c;
          break;
        default:
          break;
      }
    }
  }
}

你可能感兴趣的:(无人机,经验分享)