MavLinK协议

news2024/11/17 8:16:09

由于在公司需要使用这个,我就写一个文章用于入门级别

简单介绍

        

MAVSDK是PX4开源团队贡献的基于mavlink通信协议的用于无人机应用开发的SDK,其可以部署在Windows、Linux、Android等多种平台,并且支持多种语言如c/c++、python、Java等。

在官网你会看到不同语言的MAVSDK,对应新手来说可能有点懵,其实MAVSDK的核心是MAVSDK-C++,这个版本实现了包括接口驱动(串口、udp等)、mavlink通信、各种交互逻辑处理,并且创建了server,建立gRPC通信,其他不同的语言版本都是只实现了gRPC通信接口而已。

下图可能会更清晰一些:

MAVSDK包括了library和server,如果我们使用的是C++,那么可以不用server,如果是使用其他语言(如python等)必须使用server,用于跟各种语言的客户端建立gRPC通信。
除 C++ 之外的 MAVSDK 语言包装器使用 gRPC 连接到 MAVSDK C++ 核心。这个围绕 MAVSDK C++ 库的 gRPC 服务器称为 mavsdk_server(过去称为后端)。

环境配置

安装MAVSDK Library-使用安装包

官方提供了已经打包好的安装包,可以直接去MAVSDK仓库下载release版。

或者直接使用如下命令下载并安装:

wget https://github.com/mavlink/MAVSDK/releases/download/v1.0.0/mavsdk_1.0.0_ubuntu20.04_amd64.deb
sudo dpkg -i mavsdk_1.0.0_ubuntu20.04_amd64.deb

安装MAVSDK Library-源码

  • 系统更新
sudo apt-get update
sudo apt-get install build-essential cmake git
​
$ pip3 install future
  • 下载源码
git clone https://github.com/mavlink/MAVSDK.git
git submodule update --init --recursive

  • 编译
cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild/default -H.
cmake --build build/default -j8
在编译过程中,会需要下载一些依赖仓库,并且会放置到 MAVSDK/build/default/third_party/文件夹下。
  • 安装
sudo cmake --build build/default --target install

安装路径

完成安装后,动态链接库和头文件会安装在系统默认路径下。

链接库为:/usr/local/lib/

$ ls /usr/local/lib/
cmake  libmavsdk.so  libmavsdk.so.1  libmavsdk.so.1.4.0  python2.7  python3.8

头文件为:/usr/local/include

$ ls /usr/local/include/mavsdk/
connection_result.h  geometry.h  log_callback.h  mavlink_include.h  plugin_base.h  server_component.h    system.h
deprecated.h         handle.h    mavlink         mavsdk.h           plugins        server_plugin_base.h

在使用时,需要添加环境变量,编辑~/.bashrc文件,在末尾添加如下:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

官网地址: 简介 ·MAVLink 开发者指南

1. 

ERROR: Exception:
Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\urllib3\response.py", line 438, in _error_catcher
    yield
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\urllib3\response.py", line 561, in read
    data = self._fp_read(amt) if not fp_closed else b""
           ^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\urllib3\response.py", line 527, in _fp_read
    return self._fp.read(amt) if amt is not None else self._fp.read()
           ^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\cachecontrol\filewrapper.py", line 98, in read
    data: bytes = self.__fp.read(amt)
                  ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\http\client.py", line 479, in read
    s = self.fp.read(amt)
        ^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\socket.py", line 707, in readinto
    return self._sock.recv_into(b)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\ssl.py", line 1252, in recv_into
    return self.read(nbytes, buffer)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\ssl.py", line 1104, in read
    return self._sslobj.read(len, buffer)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TimeoutError: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\cli\base_command.py", line 180, in exc_logging_wrapper
    status = run_func(*args)
             ^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\cli\req_command.py", line 245, in wrapper
    return func(self, options, args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\commands\install.py", line 377, in run
    requirement_set = resolver.resolve(
                      ^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\resolver.py", line 179, in resolve
    self.factory.preparer.prepare_linked_requirements_more(reqs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\operations\prepare.py", line 552, in prepare_linked_requirements_more
    self._complete_partial_requirements(
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\operations\prepare.py", line 467, in _complete_partial_requirements
    for link, (filepath, _) in batch_download:
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\network\download.py", line 183, in __call__
    for chunk in chunks:
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\cli\progress_bars.py", line 53, in _rich_progress_bar
    for chunk in iterable:
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\network\utils.py", line 63, in response_chunks
    for chunk in response.raw.stream(
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\urllib3\response.py", line 622, in stream
    data = self.read(amt=amt, decode_content=decode_content)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\urllib3\response.py", line 560, in read
    with self._error_catcher():
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\urllib3\response.py", line 443, in _error_catcher
    raise ReadTimeoutError(self._pool, None, "Read timed out.")
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

2. 

python: can't open file 'D:\\mavlink\\mavlink-master\\mavgenerator.py': [Errno 2] No such file or directory

3. git submodule update --init --recursive`是一个用于初始化并更新 Git 子模块的命令,其中包含了三个参数:

1. update:

这个参数告诉 Git 更新子模块。如果不指定此参数,Git 将不会更新子模块,而只是确保它们处于正确的提交状态。

2. --init:

这个参数告诉 Git 初始化尚未初始化的子模块。如果你的仓库包含子模块,并且有些子模块尚未被初始化(通常是因为它们是在一个最新的版本中添加的),那么使用这个参数将初始化这些子模块。

3. --recursive:

这个参数告诉 Git 递归地初始化和更新所有的子模块。如果子模块本身包含了其他子模块,那么使用这个参数将确保所有子模块都被正确初始化和更新。

因此,git submodule update --init --recursive命令的作用是确保所有子模块都被正确地初始化和更新到仓库中的最新状态。

git克隆
git clone https://github.com/mavlink/mavlink.git --recursive
安装python的future库
pip install future
使用可视化工具生成mavlink库

![在这里插入图片描述](https://img-blog.csdnimg.cn/52a95488f3814779a255082c280ff121.png

  • XML是选择消息格式,也可以自定义
  • Out是输出路径
  • Language是生成的语言,我这里是C++
  • Protocol是协议版本
    点击generate生成对应的头文件。

测试

在这里插入图片描述

MavLinkLibrary

是刚才生成的mavlink库

CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(MAVLINKTEST)
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 -pthread -g")
# 当前cmakelist文件所在的目录
message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR})
# 项目cmakelist文件所在的目录
message(STATUS "CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR})

# 添加include文件
set(MAVLINK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/MavLinkLibrary)

include_directories(${MAVLINK_INCLUDE_DIRS})

add_executable(test test.cpp)

test.cpp
 
#include "MavLinkLibrary/common/mavlink.h"
#include "MavLinkLibrary/common/mavlink_msg_local_position_ned.h"
#include "MavLinkLibrary/common/mavlink_msg_sys_status.h"
#include<iostream>
using namespace std;
#define BUFFER_LENGTH                                                          \
  2041 // minimum buffer size that can be used with qnx (I don't know why)
 
int main(int argc, char *argv[]) {
 
  mavlink_system_t mavlink_system = {
      1, // System ID (1-255)
      1  // Component ID (a MAV_COMPONENT value)
  };
  char help[] = "--help";
 
  char target_ip[100];
 
  float position[6] = {};
 
  uint8_t buf[BUFFER_LENGTH];
  ssize_t recsize;
  // socklen_t fromlen = sizeof(gcAddr);
  int bytes_sent;
  mavlink_message_t msg2;
 
  // mavlink_message_t msg;
  mavlink_status_t status;
 
  uint16_t len;
  int i = 0;
  unsigned int temp = 0;
  {
    mavlink_msg_local_position_ned_pack(1, 200, &msg2, 123, 2, 33, 35, 43, 52,
                                        62);
    len = mavlink_msg_to_send_buffer(buf, &msg2);
    if(len){
        std::cout<<"message send success!"<<endl;
    }
    for (i = 0; i < len; i++)
      printf("%x ", buf[i]);
    printf("\n--------------------------------------------------------\n");
    mavlink_message_t msg;
    for (i = 0; i < len; i++) {
      temp = buf[i];
      printf("%02x ", (unsigned char)temp);
      if (mavlink_parse_char(12, buf[i], &msg, &status)) {
        // Packet received
        printf("\nReceived --packet: SYS: %d, COMP: %d, LEN: %d, MSG ID: %d\n",
               msg.sysid, msg.compid, msg.len, msg.msgid);
        if (msg.msgid == 32) {
          mavlink_local_position_ned_t local_position_ned;
          mavlink_msg_local_position_ned_decode(&msg, &local_position_ned);
          printf("ned x %f, y%f, z%f\nned vx %f, vy%f, vz%f\n",
                 local_position_ned.x, local_position_ned.y,
                 local_position_ned.z, local_position_ned.vx,
                 local_position_ned.vy, local_position_ned.vz);
        }
      }
    }
 
  }
}
编译
mkdir build
cd build
cmake .. -G "MinGW Makefiles"
mingw32-make.exe
运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1684257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5月30日在线研讨会 | 面向智能网联汽车的产教融合解决方案

随着智能网联汽车技术的快速发展&#xff0c;产业对高素质技术技能人才的需求日益增长。为了促进智能网联汽车行业的健康发展&#xff0c;推动教育链、人才链与产业链、创新链的深度融合&#xff0c;经纬恒润推出产教融合相关方案&#xff0c;旨在通过促进教育链与产业链的深度…

XV4001KD汽车级应用的数字输出陀螺传感器

XV4001KD是一款专为汽车导航系统和远程信息处理而设计的数字输出陀螺传感器。采用SPI/I2C串行接口&#xff0c;具有高精度的16位的角速率输出和11位的温度输出功能&#xff0c;能够准确地测量车辆的运动状态和环境温度&#xff0c;为导航系统和信息处理提供可靠的数据支持。以及…

深度学习基础之《TensorFlow框架(18)—卷积神经网络(2)》

一、卷积层 1、卷积层&#xff08;Convolutional Layer&#xff09;介绍 卷积神经网络中每层卷积层由若干卷积单元&#xff08;卷积核&#xff09;组成&#xff0c;每个卷积单元的参数都是通过反向传播算法最佳化得到的 卷积运算的目的是特征提取&#xff0c;第一层卷积层可能…

word页眉线如何置于文字上方

然后 敲黑板&#xff0c;点这里

学硕都考11408的211院校!河北工业大学计算机考研考情分析!

河北工业大学&#xff08;Hebei University of Technology&#xff09;&#xff0c;简称河北工大&#xff0c;坐落于天津市&#xff0c;由河北省人民政府、天津市人民政府与中华人民共和国教育部共建&#xff0c; 隶属于河北省&#xff0c;是国家“双一流”建设高校、国家“211…

Linux磁盘高级操作

RAID RAID存储系统是一种数据存储虚拟化技术&#xff0c;它将多个物理磁盘驱动器组合成一个或多个逻辑单元&#xff0c;以提供数据冗余和/或提高性能。 1. RAID 0 无奇偶校验与冗余&#xff08;磁盘容错&#xff09;的条带存储&#xff08;带区卷/条带卷&#xff09; 由两块…

科技巨头的下一个目标:Web3与物联网融合

引言 随着技术的不断演进和创新&#xff0c;科技巨头们正在将目光聚焦到Web3与物联网的融合领域&#xff0c;这将开启一个全新的数字时代。本文将深入探讨科技巨头们在这一领域的动向&#xff0c;以及融合可能带来的影响和未来发展方向。 Web3与物联网的融合趋势 技术发展的趋…

【手写大跟堆详解】

文章目录 大跟堆介绍大跟堆的结构大跟堆的应用场景大跟堆的代码实现 大跟堆介绍 大根堆&#xff08;Max Heap&#xff09;是一种特殊的二叉树结构&#xff0c;它满足以下两个条件&#xff1a; 1.完全二叉树&#xff1a;大根堆是一棵完全二叉树&#xff0c;即除了最后一层外&am…

Web Server项目实战4-服务器编程基本框架和2种高效的事件处理模式

服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理 模块功能I/O处理单元处理客户连接&#xff0c;读写网络数据逻辑单元业务进程或线程网络存储单元数据库、文件或缓存请求队列各单元之间的通信方式 I/O 处理单元是…

520主题趣味小游戏玩法线上互动的作用是什么

行业商家借势520气氛&#xff0c;往往能低成本达到预期效果&#xff0c;包括但不限于品牌传播、渠道引流涨粉、用户促活引导等&#xff0c;除了前面推荐的互动玩法外&#xff0c;在【雨科】平台的这几款520趣味小游戏同样值得关注。 1、爱你不止520 这是一款九宫格抽奖活动&am…

【Java面试】三、Redis篇(下)

文章目录 1、抢券场景2、Redis分布式锁3、Redisson实现分布式锁4、Redisson实现的分布式锁是可重入锁5、Redisson实现分布式锁下的主从一致性6、面试 1、抢券场景 正常思路&#xff1a; 代码实现&#xff1a; 比如优惠券数量为1。正常情况下&#xff1a;用户A的请求过来&a…

利用神经网络学习语言(六)——总结与常见面试问题

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 文章列表&#xff1a; 利用神经网络学习语言&#xff08;一&#xff09;——自然语言处理的基本要素利用神经网络学习语言&…

基于STM32看Cortex-M内核相关的一些底层知识

文章目录 固件起始地址存储了主栈指针和向量表内容启动文件分析程序启动流程Code,RO Data,RW Data, ZI Data启动流程Regin$$Table 固件起始地址存储了主栈指针和向量表内容 《ARM Cortex-M3与Cortex-M4权威指南》中的4.8章节复位和复位流程中有下面这段的描述&#xff1a; 在复…

医疗软件供应链安全治理:保障医疗服务质量和患者安全的当务之急!

如今&#xff0c;随着医疗数智化的不断深入&#xff0c;医共体网络、远程医疗网络、区域医疗网络、互联网医院等系统建设日益普及&#xff0c;医疗信息系统从基础应用进阶到智能医疗阶段。医疗机构对医疗软件采购、外包开发以及调用第三方开发资源的需求日益增加。 然而&#x…

buuctf的RSA(二)

1.RSA 知道 flag.enc 和 pub.key&#xff0c;典型的加密、解密 将pub,key 改为pub.txt 打开后发现公钥 在RSA公私钥分解 Exponent、Modulus&#xff0c;Rsa公私钥指数、系数(模数)分解--查错网 进行解密 得到e65537 n8693448229604811919066606200349480058890565…

S-Clustr+H4vdo 僵尸网络锁屏播放锁屏插件

项目地址:https://github.com/MartinxMax/S-Clustr-Ring 视频 用法 安装H4vdo依赖 在Install目录中选择你的操作系统安装依赖Windows_H4vdo_plugin_installation 启动H4vdo服务端 $ python3 Generate.py [Device Type (Number)]>7 [] [0] Start RTMP server [1] Skip &g…

家政预约小程序05服务管理

目录 1 设计数据源2 后台管理3 后端API4 调用API总结 家政预约小程序的核心是展示家政公司提供的各项服务的能力&#xff0c;比如房屋维护修缮&#xff0c;家电维修&#xff0c;育婴&#xff0c;日常保洁等。用户在选择家政服务的时候&#xff0c;价格&#xff0c;评价是影响用…

关于抖音小程序开发代码修改了,但是真机调试代码不更新问题解决(全网第一成功解决方案,无论安卓或苹果)

各位铁铁&#xff0c;今天开发小程序在抖音小程序适配时&#xff0c;终于是又一次踩到这个恶心的坑了&#xff0c;现在就记录一下&#xff0c;方便我以后查找&#xff0c;也希望帮助到当前被它所坑害的你&#xff01; 具体实现步骤如下&#xff1a; 1.到你的抖音开发平台&…

高效利用键盘上的 caps lock(大写键)实现中英切换

先看效果 在中文输入环境中&#xff0c;Caps Lock 键经常被忽视&#xff0c;占据了键盘上的黄金位置却很少派上用场。接下来&#xff0c;我将介绍如何将这个闲置的键合理利用&#xff0c;让它变得更加实用。 第一步 设置&#xff1a; 我以五笔为例&#xff1a; 1.输入法默认…

国内快速下载hugging face大模型的方法

由于众所周知的原因&#xff0c;从hugging face下载大模型比较困难&#xff0c;幸好国内有人做了镜像站&#xff0c;可以通过国内的镜像站进行快速下载&#xff0c;以下是配置方法。 我的系统是ubuntu 22&#xff0c;这里记录的方法只对debian/ubuntu有效。 git-lfs/INSTALLI…