目录
前言
之前的文章,介绍过 PX4开源飞控仿真环境的搭建 及 MAVLink飞控通讯协议:
本章将介绍如何通过MAVSDK开发包控制仿真无人机飞行(间接使用MAVLink飞控通讯协议)。
飞行操作视频如下:
基于MAVSDK开发包使用键盘控制仿真无人机起飞着陆、飞行
一、MAVSDK简介
MAVLink飞控通讯协议常用于无人机和地面站之间的通讯,直接通过底层MAVLink协议去控制无人机较为困难,容易失败,是因为无人机存在一些操控逻辑和细节。
因此,使用一些MAVLink协议相关的开源API,工程或SDK软件包去操作,无疑是最好的选择。MAVSDK是一个由开源社区 mavlink 开发的轻量级 SDK,用于与MAVLink系统的通讯接口。 它提供了一套现代多编程语言接口(c++、python、go、java等),处理了很多逻辑细节,使得开发者能够轻松地与飞行控制器、地面站以及其他 MAVLink 设备进行通信,从而构建复杂的无人机应用。
- MAVSDK官方指导文档:https://mavsdk.mavlink.io/main/en/
- MAVSDK-C++源码:https://gitcode.com/mavlink/MAVSDK
二、编译安装MAVSDK
1、下载MAVSDK-C++源码
git clone https://github.com/mavlink/MAVSDK.git --recursive
cd MAVSDK
2、编译项目
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -Bbuild/default -H.
参数解析:
-DCMAKE_INSTALL_PREFIX=install:指定安装路径为install,否则安装路径在系统默认的/usr/local或/usr/中
-Bbuild/default:指定编译路径设置为build/default
3、编译源码并安装(安装路径由上一步指定)
cmake --build build/default --target install
三、启动PX4的jMAVSim仿真环境无人机
1、搭建仿真环境(docker方式)参照之前的文章:
https://blog.csdn.net/zhoubiaodi/article/details/138303475
2、编译启动 jMAVSim 仿真模拟器(也可选择启动 Gazebo 模拟器)
cd /home/px4/PX4-Autopilot
make px4_sitl jmavsim
3、启动jMAVSim仿真模拟器的 mavlink通信,在局域网和外部UDP服务通信
例如UDP服务的ip:10.10.151.211 端口:14540
mavlink start -p -u 14557 -t 10.10.151.211 -o 14540
四、飞行控制
1、例子:控制无人机 起飞着陆
examples/takeoff_and_land
- 编译(指定之前安装的路径../../install)
cd examples/takeoff_and_land
cmake -Bbuild -DCMAKE_PREFIX_PATH=../../install -H.
cmake --build build -j8
- 运行(启动udp通信,控制仿真模拟器无人机 起飞着陆)
build/takeoff_and_land udp://:14540
2、例子:键盘方向键控制无人机 起飞着陆、飞行
examples/mavsdk_control
- 下载mavsdk_control放到examples目录下(mavsdk_control是本人自己编写的C++代码):
基于mavsdk写的一个c/c++例子:键盘方向键控制无人机 起飞着陆、飞行
- 编译(指定之前安装的路径../../install)
cd examples/mavsdk_control
cmake -Bbuild -DCMAKE_PREFIX_PATH=../../install -H.
cmake --build build -j8
- 运行(启动udp通信,电脑方向键控制仿真模拟器无人机 起飞着陆、飞行)
build/mavsdk_control
飞行操作视频如下:
基于MAVSDK开发包使用键盘控制仿真无人机起飞着陆、飞行
3、其它例子
源码目录下其它例子,编译运行指令跟上诉例子一样。
examples/fly_mission:飞行航线任务
examples/battery:订阅电池状态
...
五、后续开发建议
MAVSDK支持TCP、UDP和串口通信方式和无人机进行通信,
串口通信方式可能因硬件系统环境存在差异,导致不适用,这时候可开发一个TCP或UDP客户端通信,透传串口数据到MAVSDK的TCP或UDP服务 。