小伙子20240914中秋加班
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 - Guide:https://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中,只存在两种情况:同步阻塞、异步非阻塞:
- 同步(sync)
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