PC端基于SpringBoot架构控制无人机(二):MavLink协议

简述:

上一章我们提到了无人机最关键的部分:飞控。这一章我们详细讨论一下与飞控交互的一个非常重要的协议:mavLink协议MAVLink Developer Guide | MAVLink GuideMAVLink Developer Guidehttps://mavlink.io/en/

一、MAVLink协议的基本概念

1.1 协议定义

MAVLink(Micro Air Vehicle Link)是一种为小型飞行器(如无人机)设计的轻量级、高效的消息协议。它旨在实现不同组件(如飞控、地面站、传感器等)之间的数据通信,以保证系统的实时性和可靠性。由于采用二进制消息格式,MAVLink能够在低带宽环境下快速、准确地传输数据。

1.2 设计目标

MAVLink协议的设计目标主要包括:

  • 轻量级:协议本身占用的资源少,适合在资源受限的嵌入式系统中运行。

  • 实时性:能够快速传输关键数据,以满足飞行器实时控制的需求。

  • 跨平台兼容性:支持多种硬件平台和操作系统,方便不同设备之间的通信。

  • 可扩展性:允许用户自定义消息类型,以适应不同的应用场景。


二、MAVLink协议的消息格式

2.1 消息结构

MAVLink消息由以下几个部分组成:

  • 起始字节:用于标识消息的开始,通常为固定值。

  • 消息长度:表示消息的总字节数。

  • 序列:用于消息排序和丢失检测。

  • 系统ID:标识发送消息的系统。

  • 组件ID:标识发送消息的组件。

  • 消息ID:用于区分不同类型的消息。

  • 有效载荷:包含具体的数据内容。

  • 校验和:用于验证消息的完整性。

以下是一个简化的MAVLink消息结构示例:

起始字节 消息长度 序列 系统ID 组件ID 消息ID 有效载荷 校验和
1 byte 1 byte 1 byte 1 byte 1 byte 1 byte n bytes 2 bytes
2.2 消息类型

MAVLink协议定义了多种消息类型,常见的有:

  • 心跳消息(HEARTBEAT):用于定期发送系统状态信息,让其他组件知道该系统是否正常运行。

  • 姿态消息(ATTITUDE):包含飞行器的姿态信息,如俯仰角、横滚角和偏航角。

  • 位置消息(GLOBAL_POSITION_INT):提供飞行器的全球位置信息,包括经纬度、海拔高度等。

  • 命令消息(COMMAND_LONG):用于发送控制命令,如起飞、降落、改变飞行模式等。


三、MAVLink协议的通信机制

3.1 单播通信

单播通信是指一个发送者向一个特定的接收者发送消息。在MAVLink中,通过指定接收者的系统ID和组件ID,可以实现单播通信。例如,地面站向特定的无人机发送控制命令时,就采用单播通信方式。

以下是一个使用Java实现MAVLink单播通信的简单示例:

import io.dronefleet.mavlink.MavlinkConnection;

import io.dronefleet.mavlink.MavlinkMessage;

import io.dronefleet.mavlink.common.Heartbeat;

import io.dronefleet.mavlink.util.EnumValue;

import java.io.IOException;

import java.net.Socket;

public class MavlinkUnicastExample {

public static void main(String\[\] args) {

try {

// 建立与无人机的连接

Socket socket = new Socket("127.0.0.1", 5760);

MavlinkConnection connection = MavlinkConnection.create(socket.getInputStream(), socket.getOutputStream());

// 创建心跳消息

Heartbeat heartbeat = Heartbeat.builder()

.type(EnumValue.of(1))

.autopilot(EnumValue.of(3))

.baseMode(0)

.customMode(0)

.systemStatus(EnumValue.of(4))

.mavlinkVersion(3)

.build();

// 发送心跳消息到特定的无人机(假设系统ID为1,组件ID为1)

MavlinkMessage<Heartbeat> message = MavlinkMessage.create(1, 1, heartbeat);

connection.send(message);

// 关闭连接

connection.close();

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

3.2 广播通信

广播通信是指一个发送者向所有接收者发送消息。在MAVLink中,广播消息的系统ID通常设置为0,表示该消息是广播消息。例如,无人机发送的状态信息可以采用广播通信方式,让所有连接的地面站都能接收到。

3.3 消息队列与缓冲

为了保证消息的可靠传输,MAVLink协议通常会使用消息队列和缓冲机制。发送方将待发送的消息放入消息队列中,按照一定的顺序进行发送;接收方则使用缓冲区来存储接收到的消息,以便后续处理。

四、MAVLink协议的版本与兼容性


4.1 主要版本

MAVLink协议主要有两个版本:MAVLink 1.0MAVLink 2.0

  • MAVLink 1.0:是早期版本,具有简单、轻量级的特点,但在消息安全性和扩展性方面存在一定的局限性。

  • MAVLink 2.0:是MAVLink 1.0的升级版,增加了消息签名、扩展消息长度等功能,提高了消息的安全性和可扩展性。


4.2 版本兼容性

在实际应用中,需要考虑不同版本之间的兼容性问题。MAVLink 2.0 兼容 MAVLink 1.0 的消息格式,因此支持MAVLink 2.0的设备可以接收和处理MAVLink 1.0的消息;但支持MAVLink 1.0的设备无法处理MAVLink 2.0的扩展消息。推荐使用MAVLink2.0,可选择不加密

相关推荐
葫芦和十三1 天前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp1 天前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑1 天前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan1 天前
多Agent之间的区别
后端
青石路1 天前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充1 天前
1.面向对象设计思想
后端
IT_陈寒1 天前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro1 天前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗1 天前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端