ardupilot开发 --- MAVSDK 篇

在这里插入图片描述

摄于2024年中秋节前夕@广州

0. 一些概念

  • MAVSDK用于与MAVLink系统间的通信。
    功能:
    • 管理MAVLink系统(连接、管理);
    • 请求遥测数据、下发控制指令;
  • MAVSDK C++库已应用在生产环境中,但请注意,API仍在发展中,该项目不提供未来的兼容性保证
  • MAVSDK是跨平台的:Linux、macOS、Windows、Android和iOS。
  • 一个简单例子: Takeoff and Land.
  • 版本更新信息: API Changes
  • C++ API Reference
  • Plugins
    Plugins即“插件”。
    插件用于获取飞机的遥测数据(telemetry)、下发控制指令给飞机。
    例如:
    Action 插件用于arm, takeoff and land the vehicle。
    Telemetry 插件用于获取飞机GPS status, flight mode。
    要为每个 mavlink system 实例化属于该 system 的插件。
  • Server Plugins
    Server Plugins即“服务器插件”
    服务器插件可用于为不支持mavlink的飞控、板载计算机、相机、挂载设备提供mavlink服务。例如:某相机sdk不支持mavlink,相机速度快集成了mavsdk Server Plugins后,那么某个支持mavlink的APP(例如QGC地面站)就可以通过访问 mavsdk Server Plugins 提供的服务来与相机建立mavlink通信。
    Server Plugins
  • 编程语言版本:
    C++ (2016)
    Swift (2018)
    Python (2019)
    Java (2019)
    Go (2020)
    JavaScript (2019)
    CSharp (2019)
    Rust (2019)
  • 无论使用哪种语言,都可以使用C++指南来学习如何执行常见任务和使用库。
  • 问题、帮助
    Discuss board
    Slack
  • Guidehttps://mavsdk.mavlink.io/main/en/cpp/guide/
  • 文档(C++):https://mavsdk.mavlink.io/main/en/cpp/
  • 源码https://github.com/mavlink/MAVSDK
  • 同步、异步、阻塞、非阻塞
    假设:某进程在执行过程中调用了一个函数func_need_time,func_need_time因为需要等待IO资源,不能立即得到返回值。
    • 同步(sync)
      当执行不能立即得到返回值的函数func_need_time时,原地等待函数func_need_time执行完成(原地等待函数返回值)。
    • 异步(async)
      当执行不能立即得到返回值的函数func_need_time时,不等待func_need_time执行完成(不等待函数返回值),而是留下回一个调函数,当func_need_time执行完成后会自动调用该回调函数来处理func_need_time的返回值。
    • 阻塞(blocking)
      执行func_need_time函数时需要等待资源,等待过程中进程被挂起。
    • 非阻塞(non-blocking)
      执行func_need_time函数时需要等待资源,等待过程中进程不会被挂起。


      分类:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞。
      在mavlink中,只存在两种情况:同步阻塞、异步非阻塞:

1. 开发步骤

以Ubuntu20.04环境为例!

1.1 git 源码

sudo apt-get update
sudo apt-get install build-essential cmake git
git clone https://github.com/mavlink/MAVSDK.git
git submodule update --init --recursive

1.2 编译

1.2.1 Configuration

## 1)编译成Debug版本,编译路径设置为MAVSDK/build/default/,其中MAVSDK为源码路径
cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild/default -H.
## 2)或编译成Release版:
cmake -DCMAKE_BUILD_TYPE=Release -Bbuild/default -H.
## 3)指定安装路径为MAVSDK/install/,否则安装路径在/usr/local或/usr/中,其中MAVSDK为源码路径
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=install -Bbuild/default -H.

参数解析:

  • CMAKE_BUILD_TYPE = Debug or Release 编译成Debug还是Release版本
  • CMAKE_INSTALL_PREFIX=安装目录,如CMAKE_INSTALL_PREFIX=install 则会安装在MAVSDK/install/,缺省则会安装在/usr/local,其中MAVSDK为源码路径。
  • 更多请参考:https://mavsdk.mavlink.io/main/en/cpp/guide/build.html

1.2.2 Build

1)只编译不安装

cmake --build build/default -j8

2)编译并安装

## 可配置编译路径MAVSDK/build/default:
sudo cmake --build build/default --target install

其中:build/default指定的编译位置了,除了可在Configuration中指定还可以在build时指定!
可在安装结束的bash中看到安装位置,如下:
在这里插入图片描述
关于“路径”的几点说明:
在编译过程中,有3个路径值得关注,源码路径、编译路径、安装路径。
1)源码路径:源代码所在的路径。
2)编译路径:编译生成的中间文件存放的路径,一般命名为build。
3)安装路径:最终编译得到目标文件、头文件等的安装路径。

1.2.3 关于安装和安装路径的一些说明

有两种安装方式:

  • 直接安装预先编译好的release库文件,后可在其他.cpp中调用 mavsdk 库;
  • git 最新的源码,编译,后可在其他.cpp中调用 mavsdk 库;

所谓的“安装”实际上包括以下两点内容:

  • builds the SDK.
  • copies the libraries and header files into a “public” location so that they can be referenced by C++ applications.

在configuration步骤时不设置 CMAKE_INSTALL_PREFIX 参数,就会默认使用系统级安装(install system wide),安装位置在:/usr/local,如果是通过 .deb 或 .rpm 文件安装的则安装位置在: /usr/

通过 .deb 或 .rpm 文件安装:

sudo apt remove mavsdk
wget https://github.com/mavlink/MAVSDK/releases/download/v1.4.16/libmavsdk-dev_1.4.16_ubuntu20.04_amd64.deb
sudo dpkg -i libmavsdk-dev_1.4.16_ubuntu20.04_amd64.deb

1.3 卸载mavsdk、清除编译

1)通过 .deb 或 .rpm 文件安装

sudo apt remove mavsdk

2)通过build安装

 rm -rf build
 sudo rm -rf 安装目录如 MAVSDK/install

1.4 在.cpp中使用mavsdk库

  • 1)编译例程,如 takeoff_and_land
cd examples/takeoff_and_land/
cmake -Bbuild -H.
cmake --build build -j4

如果编译example时出错,先删掉编译目录再重新编译:

cd examples/takeoff_and_land/
rm -rf build
  • 2)启动仿真 SITL
sim_vehicle.py -v ArduCopter --console --map
  • 3)给SITL增加一个UDP连接
## 在运行SITL的bash输入:
output add 127.0.0.1:14550
  • 4)接入mission planner以观察飞机响应
    tcp连接:127.0.0.1:5762或5661,注意5760已被mavproxy占用!
  • 5)运行例程
build/takeoff_and_land udp://:14550

2.飞行器仿真环境搭建

文档中使用的是PX4仿真,那么如何搭建ardupilot仿真与mavsdk建立通讯呢?
给 SITL 配置 udp 连接即可,如:127.0.0.1:14550
在编译例子时,以udp的方式连接SITL,如:build/takeoff_and_land udp://:14550

3. 专业术语

  • system-wide 系统级,全系统范围
  • System-wide Install 系统级别的安装,可在系统范围内有效;
  • Local Install 指定位置安装,只在局部范围内有效;

4. MQTT推送业务平台实践记录

一些概念

用mavsdk获取飞控数据,解析、封装后用MQTT发送给业务平台服务器。
Mavsdk object 用于查找、连接mavlink系统。
插件用于获取飞机的遥测数据、控制飞机。
例如:
Action 插件用于arm, takeoff and land the vehicle。
Telemetry 插件用于获取飞机GPS status, flight mode。

回调函数

有些API支持配置用户回调函数,例如:
Telemetry::subscribe_position(PositionCallback callback)
Action::takeoff_async(ResultCallback callback)

条件

mavsdk主要用于多旋翼机,但也对固定翼和垂直起降提供了基本支持。
mavsdk并不支持所有mavlink协议功能。

如何响应遥测数据

  • 被动响应
    收到数据更新时执行回调函数,例如:Telemetry::subscribe_position(PositionCallback callback)
  • 主动响应。
    主动请求最新的遥感数据,然后用该数据处理业务。

Actions、Offboard

mavsdk下发指令后,会接收到一个确认消息,告知指令是否被飞控接受。mavsdk不会等待指令执行完成。

Missions

下载、上传航线文件,但mavsdk并不支持所有的 mavlink Mission Protocol。

连接

  • 连接字符串
    udp://[Bind_host][:Bind_port]
    tcp://[Server_host][:Server_port]
    serial://[Dev_Node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值