MavSDK官网
以mavlink协议为基础,适配目前主流开发语言:
MAVSDK-C++ (2016):用于生产。
MAVSDK-Swift (2018):用于生产。
MAVSDK-Python (2019):用于生产。
MAVSDK-Java (2019):用于生产。
MAVSDK-Go (2020):功能完整。
MAVSDK-JavaScript (2019):概念证明。
MAVSDK-CSharp (2019)。概念证明。
MAVSDK-Rust (2019):概念证明。
以C++版本为基础,进行说明:
集成和构建应用
MAVSDK 核心 C++ 库是用 C++17 编写的,并公开了 C++11 接口,例如std::function. 因此,使用该库的应用程序也需要是 C++11 或更高版本。
在 CMakeLists.txt文件中,必须加上:
project(your_project_name)
set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIREDON)
add_definitions("-Wall -Wextra -Werror")
否则可能会出现引用MavSDK后,很多API找不到或不合法的问题。
MAVSDK API说明
具体的使用Demo可以参考SDK源码中自带的样例或测试例子
MAVSDK代码
************************************************************************
用tcp还是udp_一文搞懂TCP和UDP的区别
一 TCP和UDP的区别
连接性
TCP是面向连接的协议,在收发数据前必须和对方建立可靠的连接,建立连接的3次握手、断开连接的4次挥手,为数据传输打下可靠基础;UDP是一个面向无连接的协议,数据传输前,源端和终端不建立连接,发送端尽可能快的将数据扔到网络上,接收端从消息队列中读取消息段。
可靠性
TCP提供可靠交付的服务,传输过程中采用许多方法保证在连接上提供可靠的传输服务,如编号与确认、流量控制、计时器等,确保数据无差错,不丢失,不重复且按序到达;UDP使用尽可能最大努力交付,但不保证可靠交付。
报文首部
TCP报文首部有20个字节,额外开销大;UDP报文首部只有8个字节,标题短,开销小。
报文传输
TCP协议面向字节流,将应用层报文看成一串无结构的字节流,分解为多个TCP报文段传输后,在目的站重新装配;UDP协议面向报文,不拆分应用层报文,只保留报文边界,一次发送一个报文,接收方去除报文首部后,原封不动将报文交给上层应用。
吞吐量控制
TCP拥塞控制、流量控制、重传机制、滑动窗口等机制保证传输质量;UDP没有。
双工性
TCP只能点对点全双工通信;UDP支持一对一、一对多、多对一和多堆垛的交互通信。
三 TCP和UDP的使用场景
为了实现TCP网络通信的可靠性,增加校验和、序号标识、滑动窗口、确认应答、拥塞控制等复杂的机制,建立了繁琐的握手过程,增加了TCP对系统资源的消耗;TCP的重传机制、顺序控制机制等对数据传输有一定延时影响,降低了传输效率。TCP适合对传输效率要求低,但准确率要求高的应用场景,比如万维网(HTTP)、文件传输(FTP)、电子邮件(SMTP)等。
UDP是无连接的,不可靠传输,尽最大努力交付数据,协议简单、资源要求少、传输速度快、实时性高的特点,适用于对传输效率要求高,但准确率要求低的应用场景,比如域名转换(DNS)、远程文件服务器(NFS)等。
***********************************************************************************
Java版官方SDK
Android端参考样例-MyStation3
交互图如下所示:
该方案属于Android端作为服务端,设备作为客户端的模式,不适合目前需要
期望中整体设计应该是这个样子:
ROS端作为控制数据发送的中心,等待客户端通过串口或UDP接入,当然客户端除了Android平台外,也可以是PC
Android采用SurfaceView绘制主界面,有关缩放、平移、旋转的操作可以参照(View的平移、缩放、旋转以及位置、坐标系)
mavlink 心跳包结构
HEARTBEAT消息是MAVLink中最重要的消息,其结构上图所示。
它表示无人系统存在且处于活动状态。无人系统定期(通常每秒)将心跳消息发送到地面站,以通知GCS它处于活动状态。
心跳是必备消息。
除报头外,消息有效负载还包含有关无人系统的基本信息。
(1)type:它表示微型飞行器的类型。根据最新规范,在MAV_TYPE中定义了33种预定义类型,包括四旋翼(MAV_TYPE_QUADROTOR = 2),直升机(MAV_TYPE_HELICOPTER = 4),固定翼(MAV_TYPE_FIXED_WING = 1),以及其他几种。
(2)autopilot:自动驾驶的类型。 MAV_AUTOPILOT枚举结构中定义了几种类型。例如,MAV_AUTOPILOT_GENERIC = 0表示通用自动驾驶仪,MAV_AUTOPILOT _ARDUPILOTMEGA = 3表示ArduPilot自动驾驶仪,MAV_AUTOPILOT_PX4 = 12用于PX4自动驾驶仪。
(3)base_mode:指示不同的操作模式。 正确理解心跳消息并从中提取有用信息对理解base_mode至关重要。 它以8位编码。 共有8个预定义的标记。 FLAG= 1:保留供将来使用; FLAG=2:表示已启用测试模式。 此模式用于临时测试,而不用于常规工具; FLAG=4:表示启用了自主模式(AUTO)。 这意味着无人系统通过导航到从地面站发送给它的目标航路点来自主运行。 在自动模式下,任务会加载到自动驾驶仪上。 任务由系统必须导航的一组多个航点组成。 FLAG=8:表示启用了GUIDED模式。 在GUIDED模式下,任务由发送到系统的单个航路点组成。 然后,系统自动导航到指定位置。 FLAG=16:表示系统可以通过自动控制来稳定其姿态(方向和高度)以及可能的位置。 这就需要外部传感器(例如室内环境中的GPS),高度传感器(气压计,LIDAR)或用于室内定位的运动捕捉才能在稳定状态下悬停。 系统需要外部控制输入才能使其移动。 FLAG=32:表示回路仿真器中的硬件已激活,即当内部自动驾驶仪完全运行时,所有电机和电机执行器均被锁定; FLAG=64:表示已启用手动模式,这要求飞行员使用远程控制输入手动控制系统。 在手动控制中,自动驾驶仪不会进行自动控制; FLAG=128:系统处于待命状态,这意味着电动机已启用/正在运行,并且可以启动飞行。
(4)custom_mode:自定义模式,也是必不可少的。 它指示除基本模式外还解释的自动驾驶仪特定标记。 在心跳消息解析中使用它来确定自动驾驶仪系统的飞行模式。 自定义模式有一些预定义的值,其中0表示手动飞行模式,4表示引导模式,10表示自动模式,11表示RTL模式,9表示LAND模式,2表示ALT_HOLD,5表示LOITER。
(5)system_status:一个系统状态的标志。 根据最新规范,已定义: system_status = 0:指未初始化系统或未知状态的系统; system_status = 1:表示系统正在引导; system_status = 2:表示系统正在执行校准。 实际上,传感器校准是一个非常重要的阶段,以确保诸如惯性测量单元(IMU)和通行证这样的飞行传感器保持一致并按预期运行。 system_status = 3:这意味着系统处于待机模式,可以随时启动; system_status = 4:表示电动机已接合并且系统处于活动状态并且可能在空中; system_status = 5:表示潜在的错误,并且系统处于严重状态,尽管它仍然可以导航。 例如,在临时干扰或电池电量不足时,可能会发生这种情况; system_status = 6 :这意味着紧急情况,其中无人驾驶系统失去了对某些零件的控制权,并处于困境中。 系统可能已经崩溃; system_status = 7:表示系统已开始关闭电源过程,现在正在关闭; system_status = 8:表示系统正在终止并结束其飞行。
(6)mavlink_version:表示MAVLink版本。 用户不可编辑,由协议设置。
命令信息
COMMAND_LONG是一个多功能命令,允许根据消息的命令类型及其参数发送不同类型的命令。
target_system字段和target_component字段指定将执行命令的系统及其底层件。
command:是指要执行的命令的类型。 它在MAV_CMD命令枚举中定义。 另外,对于每个命令,可以设置与该命令相关的一组参数。例如,带有21的命令ID是指LAND命令,而没有参数。 其他一些命令具有参数,例如起飞命令(ID = 22),该参数必须在param7中指定起飞高度 。 MAV_CMD命令枚举中定义了大约60种命令类型。
confirmation:指示消息是第一次发送的,值为0,其他值表示消息的确认。
param1-7:7个参数取决于命令的类型。 例如,对于LAND命令,所有七个参数均无用。 在起飞命令中,第七个参数代表起飞所需的高度。