前言
这里结合之前添加的mavlink消息,梳理下从飞控的物理端口到应用层的消息传递过程;
顺带再把整个框架在梳理了一遍;这里结合Rover来叙述,可能和copter有些区别,先开始吧~
libraries
这里需要说明下,关于mavlink的协议及生成部分,这里就不详细叙述了,后面专门单独写一篇文章来叙述。
还是说回GCS_MAVLink,先来分析下文件结构:
/ardupilot/libraries/GCS_MAVLink
|——example
|——GCS_Common.cpp
|——GCS_DeviceOp.cpp
|——GCS_Logs.cpp
|——GCS_MAVLink.cpp
|——GCS_MAVLink.h
|——GCS_serial_control.cpp
|——GCS_Signing.cpp
|——GCS.h
|——MAVLink_routing.cpp
|——MAVLink_routing.h
这里我们挨个举例进行梳理
GCS_Common.cpp
这里可以看出说包含的头文件,以及mavlink本身的一些工具函数:
这里就很明显能看出来是处理GCS上行的数据对应的处理函数(gimbal、gps、mission、param、radio、rc、set_mode…):
下面就是飞控端下行的数据处理函数(accelcal、ahrs、version、battery、gps、message、heartbeat、home、radio_in、power_status、raw_imu、sensor_offsets…),基本上通过接收和发送这些工具函数就能大概和GCS界面上的操作对应起来了(如果熟悉一款GCS的话);
接下来就是GCS_DeviceOp:
GCS_DeviceOp
先列出数据包的结构吧
handle device operations over MAVLink
从这句话翻译来看,差不多可以知道,GCS_DeviceOp就是通过mavlink,对飞控上设备进行读写操作
typedef struct __mavlink_device_op_read_t {
uint32_t request_id; /*< request ID - copied to reply*/
uint8_t target_system; /*< System ID*/
uint8_t target_component; /*< Component ID*/
uint8_t bustype; /*< The bus type*/
uint8_t bus; /*< Bus number*/
uint8_t address; /*< Bus address*/
char busname[40]; /*< Name of device on bus (for SPI)*/
uint8_t regstart; /*< First register to read*/
uint8_t count; /*< count of registers to read*/
} mavlink_device_op_read_t;
typedef struct __mavlink_device_op_write_t {
uint32_t request_id; /*< request ID - copied to reply*/
uint8_t target_system; /*< System ID*/
uint8_t target_component; /*< Component ID*/
uint8_t bustype; /*< The bus type*/
uint8_t bus; /*< Bus number*/
uint8_t address; /*< Bus address*/
char busname[40]; /*< Name of device on bus (for SPI)*/
uint8_t regsta