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,可选择不加密

相关推荐
程序员爱钓鱼19 分钟前
Go语言实战案例-简易计算器(加减乘除)
后端
学不会就看24 分钟前
Django--01基本请求与响应流程
后端·python·django
胚芽鞘6814 小时前
关于java项目中maven的理解
java·数据库·maven
岁忧5 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
CJi0NG5 小时前
【自用】JavaSE--算法、正则表达式、异常
java
Nejosi_念旧6 小时前
解读 Go 中的 constraints包
后端·golang·go
风无雨6 小时前
GO 启动 简单服务
开发语言·后端·golang
Hellyc6 小时前
用户查询优惠券之缓存击穿
java·redis·缓存
小明的小名叫小明6 小时前
Go从入门到精通(19)-协程(goroutine)与通道(channel)
后端·golang
斯普信专业组6 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang