文章

QGC代码架构解析:FirmwarePlugin与AutopilotPlugin

概念:

  • FirmwarePlugin:固件插件,表示某种飞控固件(如APMPX4等)。
  • AutoPilotPlugin:表示某种飞控固件实现的不同飞机类型,比如固定翼旋翼等。

1. FirmwarePlugin 与 AutoPilotPlugin 的关系

从逻辑关系看(主要从分类角度),AutoPilotPlugin需要从FirmwarePlugin创建,例如APM的固件,创建APM相关的AutoPilotPlugin

从实现看,FirmwarePlugin最多也有三层继承,以APM固件为例:

  • FirmwarePlugin(基类)
    • APMFirmwarePlugin(表示APM固件)
      • ArduPlaneFirmwarePlugin(表示APM的固定翼飞机)
      • ArduCopterFirmwarePlugin(表示APM的多旋翼飞机)
      • ArduRoverFirmwarePlugin(表示APM的地面车)

是在APMFirmwarePlugin这一层创建AutoPilotPlugin,即针对APM固件,实际只有一种AutoPilotPlugin实现。

1.1. FirmwarePlugin 实例的创建

MAVLink协议心跳包中,包含了固件类型飞行器类型两个字段:

1
2
3
4
5
6
7
8
typedef struct __mavlink_heartbeat_t {
 uint32_t custom_mode; /*<  A bitfield for use for autopilot-specific flags*/
 uint8_t type; /*<  Vehicle or component type. For a flight controller component the vehicle type (quadrotor, helicopter, etc.). For other components the component type (e.g. camera, gimbal, etc.). This should be used in preference to component id for identifying the component type.*/
 uint8_t autopilot; /*<  Autopilot type / class. Use MAV_AUTOPILOT_INVALID for components that are not flight controllers.*/
 uint8_t base_mode; /*<  System mode bitmap.*/
 uint8_t system_status; /*<  System status flag.*/
 uint8_t mavlink_version; /*<  MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version*/
} mavlink_heartbeat_t;

通信层在收到心跳包之后,最终传递给MultiVehicleManager,然后在创建Vehicle中,创建对应的FirmwarePlugin实例:

1
2
// void Vehicle::_commonInit(LinkInterface* link)
_firmwarePlugin = FirmwarePluginManager::instance()->firmwarePluginForAutopilot(_firmwareType, _vehicleType);

2. FirmwarePlugin 的职责

获取对应的AutoPilotPlugin

1
virtual AutoPilotPlugin *autopilotPlugin(Vehicle *vehicle) const;

主要功能是,定义支持的飞行模式,并通过接口提供给外部。以及,一些飞行模式的控制实现:比如TakeOff模式中,起飞前检查(解锁等),发送起飞命令;再比如,发送Mission命令,以及发送之前的检查。

一些接口定义:

1
2
3
4
5
6
virtual QList<MAV_CMD> supportedMissionCommands(QGCMAVLink::VehicleClass_t /*vehicleClass*/) const;

virtual QStringList flightModes(Vehicle* /*vehicle*/) const;

virtual void startTakeoff(Vehicle *vehicle) const;
virtual void startMission(Vehicle *vehicle) const;

另一个重要的接口是,定义飞控的离线参数文件,例如APM固定翼飞机:

1
QString offlineEditingParamFile(Vehicle *vehicle) const override { return QStringLiteral(":/FirmwarePlugin/APM/Plane.OfflineEditing.params"); }

3. AutoPilotPlugin 的职责

FirmwarePlugin实现通信协议及逻辑,而AutoPilotPlugin实现界面呈现。

AutoPilotPlugin目录下,定义了AutoPilotPlugin模块,以及VehicleComponent模块。APMPX4两个子目录实现各自的AutoPilotPlugin子类,以及各自包含的诸多组件(继承自VehicleComponent)。

实现的组件包括:Vehicle Configuration面板中的各个功能模块,比如遥控器飞行模式传感器参数等页面(参看QGC运行页面)。

本文由作者按照 CC BY 4.0 进行授权