一天精通无人机第 30 讲 中级篇系列:外部通信总线 Mavlink 服务

file

Mavlink为无人机与外部通信的接口,在mavlink文件夹中的内容是mavlink协议所要用的头文件内容,实际上就是mavlink各类协议的定义部分和公共调用函数部分。文件夹中的内容如下:

mavlink/
└─include
└─ mavlink
└─ v2.0
├─ common
│ ├─ common.h
│ ├─ mavlink_msg_actuator_control_target.h
│ ├─ mavlink_msg_adsb_vehicle.h
│ ├─ mavlink_msg_altitude.h
│ └─ ...
├─ protocol.h
├─ checksum.h
├─ mavlink_helpers.h
└─ mavlink_types.h

需要注意的是,在此文件夹中所存放的只是Mavlink协议的头文件和公共调用函数,而不是飞控与地面站通信的功能实现。目前Mavlink的版本为2.0,在mavlink/include/mavlink/v2.0中定义了此版本中所有的头文件。common文件夹中以mavlink_msg_开头的文件,都是Mavlink的消息,目前的支持的消息有164个。下表中列出了的一些常用的Mavlink消息:

file

Mavlink服务是无人机与外部系统通信的数据总线源代码位置在src/modules/mavlink中。其目录文件列表如下:

mavlink/
├── CMakeLists.txt
├── mavlink_bridge_header.h
├── mavlink.c
├── mavlink_command_sender.cpp
├── mavlink_command_sender.h
├── mavlink_ftp.cpp
├── mavlink_ftp.h
├── mavlink_main.cpp
├── mavlink_main.h
├── mavlink_messages.cpp
├── mavlink_messages.h
├── mavlink_mission.cpp
├── mavlink_mission.h
├── mavlink_parameters.cpp
├── mavlink_parameters.h
├── mavlink_receiver.cpp
├── mavlink_receiver.h
├── mavlink_stream.cpp
└── mavlink_stream.h

主要包括发送和接收两个大的方向:在发送功能中飞控程序将无人机当前的主状态、导航状态、姿态、速度、位置等信息发送给地面站程序,以便地面站程序能够实时了解无人机的状态。于此同时,地面站程序可以向飞机发送特定的指令和飞行航线,例如:对飞控锁定/解锁、切换飞行状态、上传飞行任务航迹点等。数据在飞控和地面站交互数据的过程都是通过Malvink协议来完成的。如下图:

file

MavlinkStream是所有周期下发消息类的基类,它定义了整个周期下发消息统一格式,包括消息ID、消息名称、消息大小、发送频率、最近发送时间、实际发送函数等等。而其它实际消息都继承了MavlinkStream类。在实际消息发送时使用MavlinkStream的指针对象指向每一个实际的子类对象,然后通过这个指针来统一发送消息,下面我们来看一下MavlinkStream基类和其派生类的关系:

file

MavlinkReceiver:负责Malvink消息的接收,解析和处理工作。MavlinkReceiver负责接收消息,MavlinkReceiver主要功能为有:从底层链路读取数据;解析Mavlink消息数据;处理一般消息和命令;处理任务相关消息;处理参数相关消息;处理文件传输协议等相关内容。在消息接收过程中,MavlinkReceiver并没有将消息转换为具体的不同类型的消息,而是直接将消息交给不同的业务功能自行处理。例如,当MavlinkReceiver接收到一条mavlink_message_t消息之后,并没有进一步的分析是任务航迹点消息(mavlink_mission_item_t)还是参数设置消息(mavlink_param_set_t),而是直接将mavlink_message_t同时消息交给各个不同业务的处理程序同时分析这个消息包。各个业务程序分析mavlink_message_t消息,如果此消息类型与当前业务符合,则继续处理,否则直接抛弃。

MavlinkMissionManager:主要用于地面站与飞控之间传输任务之间相关数据,包括航迹点、电子围栏点、集结点等相关内容。包括任务信息的上传与下载。通常情况下在无人机起飞前需要使用地面站程序规划一系列的自动飞行任务航迹点,并通过Mavlink消息将这些任务信息点上传到飞控当中。飞控会接收这些航迹点并将其保存到SDCard当中,为飞行时使用。另外,地面站还可以根据需要将飞控中已经保存好的所有任务点下载到本地。我们来看一下上传任务时的工作流程:

file

MavlinkMissionManager的功能主要分为3个部分:接收地面站请求任务数据,向地面站发送任务数据,将任务数据保存到SDCard当中,或从SDCard中读取任务数据。

MavlinkParametersManager:主要负责处理地面站向飞控发送参数读写的相关功能。主要分为3个部分:处理参数请求列表、设置参数、读取参数。相对来说参数的处理过程较为简单,不做过多介绍。

MavlinkFTP:是一个文件传输服务,负责处理所有地面站向飞控传输的文件相关操作,包括文件夹的创建,删除,显示列表和文件的创建,读写,删除等等一系列功能。地面站程序在使用MavlinkFTP服务时可以将飞控程序当作一个文件操作服务器,向其发送相应的指令,服务器即为地面站返回相应的数据内容。如下图所示:

file

实际上地面站可以根据需要在文件服务器上创建或删除文件和文件或文件夹,并根据需要上传或下载相应的文件。MavlinkFTP所支持的文件操作指令如下:

file

下期预告:《中级篇:自动飞行Navigator》

file