Kerloud飞控系列教程(16):PX4飞控开发基础之Mavlink通信模块介绍

PX4飞控开发基础:Mavlink通信模块介绍

Kerloud飞控支持的长期稳定LTS版本位于:https://github.com/cloudkernel-tech/Firmware,请参考其中master_kerloud_v1.10.0分支进行阅读

Mavlink通信模块在PX4 固件 v1.10.0版本中位于src/modules/mavlink目录,包括较多程序文件。这个程序是PX4飞行控制系统中实现MAVLink协议的一部分。MAVLink是一种轻量级基于消息的通信协议,用于无人机和地面控制站之间的通信。

Mavlink的相关类和主要函数

Mavlink的相关类和主要函数介绍如下,包括它们的作用、输入和输出:

mavlink_main.cpp - 这是主要的源文件,包含了MAVLink协议的核心实现。
    作用:实现MAVLink协议,处理消息的发送和接收。
    输入:来自无人机系统或其他MAVLink节点的消息。
    输出:发送给其他MAVLink节点的消息。

mavlink_main.h - 头文件,定义了mavlink_main.cpp中使用的类、函数和数据结构。
    作用:提供MAVLink协议的接口和数据类型。

Mavlink 类 - 负责管理MAVLink通信的主要类。
    作用:封装了MAVLink消息的处理、发送和接收逻辑。
    输入:MAVLink消息、系统参数、订阅的ORB主题。
    输出:通过串口或网络发送的MAVLink消息。

mavlink_receiver.h 和 mavlink_receiver.cpp - 负责接收MAVLink消息的类。
    作用:从物理接口(如串口或网络)读取数据并解析MAVLink消息。
    输入:来自物理接口的原始数据。
    输出:解析后的MAVLink消息。

mavlink_sender.h 和 mavlink_sender.cpp - 负责发送MAVLink消息的类。
    作用:将MAVLink消息封装并通过物理接口发送。
    输入:要发送的MAVLink消息。
    输出:通过物理接口发送的原始数据。

mavlink_message_t 结构体 - 定义了MAVLink消息的结构。
    作用:作为MAVLink消息的数据容器。
    输入:从MavlinkReceiver接收的解析后的数据。
    输出:通过MavlinkSender发送的数据。

mavlink_main() 函数 - 程序的入口点。
    作用:根据命令行参数启动MAVLink实例。
    输入:命令行参数。
    输出:启动的MAVLink实例。

mavlink_start() 函数 - 启动一个新的MAVLink实例。
    作用:根据提供的参数初始化并启动MAVLink。
    输入:命令行参数,如设备名称、波特率、数据率等。
    输出:启动的MAVLink实例。

mavlink_stream_command() 函数 - 配置运行中的MAVLink实例的流。
    作用:动态调整流的发送速率或启用/禁用特定的流。
    输入:命令行参数,如流名称和速率。
    输出:更新后的流配置。

mavlink_status() 函数 - 打印所有MAVLink实例的状态。
    作用:提供关于MAVLink实例运行状态的信息。
    输入:无。
    输出:MAVLink实例的状态信息。

mavlink_boot_complete() 函数 - 标记系统启动完成,开始发送MAVLink消息。
    作用:通知MAVLink系统已准备好发送消息。
    输入:无。
    输出:无。

这个程序框架通过使用多线程和消息队列来处理MAVLink消息的接收和发送。它支持串口和网络接口,并且可以配置为不同的通信模式和数据率。程序的设计允许它在PX4飞行控制系统中灵活地与其他MAVLink节点通信。

主程序介绍

task_main() 函数是 Mavlink 类中的一个成员函数,它是MAVLink任务的主循环,负责处理MAVLink消息的发送和接收。以下是该函数的流程重点,用于一般开发者的教程内容:

初始化参数和订阅:
    读取命令行参数,如串口名称、波特率、数据率等,并设置相应的MAVLink参数。
    初始化串口或网络接口,准备接收和发送数据。
    创建并订阅uORB主题,如车辆命令(vehicle_command)和车辆状态(vehicle_status)。

配置流和消息缓冲区:
    根据MAVLink模式(如正常模式、板载模式、OSD模式等)配置默认的消息流。
    如果启用了消息转发功能,初始化一个消息缓冲区,用于临时存储转发的消息。

进入主循环:
    在一个无限循环中,执行以下任务:
        等待一定时间间隔,这是由数据率和系统负载决定的。
        检查是否有参数更新,并更新MAVLink参数。
        检查无线电配置,并在必要时发送配置命令到无线电。
        从订阅的uORB主题中获取最新的车辆命令和状态。
        发送命令确认消息(ACK)给发送者。
        处理日志消息和来自MAVLink Shell的输出。
        根据配置更新消息流的状态。
        转发从其他MAVLink实例接收的消息。
        更新发送和接收的数据速率统计信息。
        发布MAVLink链接的遥测状态。

处理消息发送:
    对于每个配置的消息流,检查是否有足够的空间在发送缓冲区中写入新消息。
    从消息缓冲区中读取消息,并发送到物理接口。
    如果启用了ULog流,处理ULog流的更新。

清理和退出:
    当检测到退出信号时,关闭串口或网络接口,取消订阅uORB主题,并清理资源。
    等待接收线程完成,并销毁Mavlink实例。

task_main() 函数是MAVLink通信的核心,它确保了消息能够按照预定的速率和格式发送和接收。开发者需要理解这个函数的流程,以便能够根据需要配置和调试MAVLink通信。

回到教程目录Kerloud飞控系列教程(1):目录 - #4