QGCToolbox

QGCToolBox

此类是程序中工具类的集合。此类掌管的工具如下。这些工具对象是单例。

   AudioOutput*                _audioOutput            = nullptr; // 语音提示
    FactSystem*                 _factSystem             = nullptr; // 用于注册Fact,FactMetaData,FactPanelController,FactGroup
    FirmwarePluginManager*      _firmwarePluginManager  = nullptr;
    GPSManager*                 _gpsManager             = nullptr;
    QGCImageProvider*           _imageProvider          = nullptr;
    JoystickManager*            _joystickManager        = nullptr;
    LinkManager*                _linkManager            = nullptr;
    MAVLinkProtocol*            _mavlinkProtocol        = nullptr;
    MissionCommandTree*         _missionCommandTree     = nullptr;
    MultiVehicleManager*        _multiVehicleManager    = nullptr;
    QGCMapEngineManager*        _mapEngineManager       = nullptr;
    UASMessageHandler*          _uasMessageHandler      = nullptr;
    FollowMe*                   _followMe               = nullptr;
    QGCPositionManager*         _qgcPositionManager     = nullptr;
    VideoManager*               _videoManager           = nullptr;
    MAVLinkLogManager*          _mavlinkLogManager      = nullptr;
    QGCCorePlugin*              _corePlugin             = nullptr;
    SettingsManager*            _settingsManager        = nullptr;
    AirspaceManager*            _airspaceManager        = nullptr;
    ADSBVehicleManager*         _adsbVehicleManager     = nullptr;
    PairingManager*             _pairingManager         = nullptr;
    TaisyncManager*             _taisyncManager         = nullptr;
    MicrohardManager*           _microhardManager       = nullptr;
  • 这些工具类类都继承QGCTool。
  • QGCToolbox在构造函数中将这些类new出来。然后在setChildToolboxes()函数中将这些工具彼此建立联系。
  • void _scanAndLoadPlugins(QGCApplication *app);用于加载用户自定义的QGCCorePlugin的子类。

Firmware相关类

类型说明

  • MAV_AUTOPILOT:自动驾驶仪固件类型。如PX4, APM, 通用的…
  • MAV_TYPE: Mvlink组件。如固定翼,垂起,四旋翼,潜艇,船,气球,火箭,相机,伺服,降落伞, 电池, 降落伞…

FirmwarePluginFactoryRegister

  • 程序中使用的固件都会被注册到这个类中。存储在私有变量QList<FirmwarePluginFactory*> _factoryList;
  • FirmwarePluginFactory会在构造函数中,调用registerPluginFactory函数。

FirmwarePluginFactory

  • 固件工厂的基类。
  • 它有两个子类APMFirmwarePluginFactory和PX4FirmwarePluginFactory。

函数说明

  • 构造函数中会将自己注册到FirmwarePluginFactoryRegister单例对象中。
  • virtual FirmwarePlugin* firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) = 0 纯虚函数 : 依据固件类型,以及组件类型,返回固件插件。
  • virtual QListQGCMAVLink::FirmwareClass_t supportedFirmwareClasses(void) const = 0 纯虚函数;支持的固件种类。
    FirmwareClass_t是MAV_AUTOPILOT枚举的一部分。目前只有
    MAV_AUTOPILOT_PX4
    MAV_AUTOPILOT_ARDUPILOTMEGA
    MAV_AUTOPILOT_GENERIC。
  • virtual QListQGCMAVLink::VehicleClass_t supportedVehicleClasses(void) const 父类已实现,子类中没有重新此函数;支持的无人机类型。
    VehicleClass_t 是MAV_TYPE的一部分。目前只有
    MAV_TYPE_AIRSHIP
    MAV_TYPE_FIXED_WING
    MAV_TYPE_GROUND_ROVER
    MAV_TYPE_SUBMARINE
    MAV_TYPE_QUADROTOR
    MAV_TYPE_VTOL_QUADROTOR
    MAV_TYPE_GENERIC

PX4FirmwarePluginFactory

  • 此工厂只能创建一种插件PX4FirmwarePlugin。
  • 且仅支持一种固件QGCMAVLink::FirmwareClassPX4。

APMFirmwarePluginFactory

  • 此工厂能创建4中插件
    1 ArduCopterFirmwarePlugin
    2 ArduPlaneFirmwarePlugin
    3 ArduRoverFirmwarePlugin
    4 ArduSubFirmwarePlugin
  • 也仅支持一种固件QGCMAVLink::FirmwareClassArduPilot

FirmwarePlugin

固件插件。用于表示实际的固件能力。
飞行模式
控制飞机的方法
参数管理
相机管理控制
支持的命令
支持的组件等

在这里插入图片描述

AutoPilotPlugin

此类用于UI

在这里插入图片描述

  • 此类用处存储当前小车有哪些部件。用于UI显示。部件显示在SetupView.qml。
Repeater {
                id:     componentRepeater
                model:  _fullParameterVehicleAvailable ? QGroundControl.multiVehicleManager.activeVehicle.autopilot.vehicleComponents : 0

                SubMenuButton {
                    imageResource:      modelData.iconResource
                    setupIndicator:     modelData.requiresSetup
                    setupComplete:      modelData.setupComplete
                    exclusiveGroup:     setupButtonGroup
                    text:               modelData.name
                    visible:            modelData.setupSource.toString() !== "" 
                    Layout.fillWidth:   true
                    onClicked:          showVehicleComponentPanel(modelData)
                }
            }

函数说明

  • virtual void parametersReadyPreChecks(void); 检测自动驾驶仪的每个部件是否安装设置完成。此函数会被ParameterManager::_checkInitialLoadComplete函数调用。
    若检测不成功,程序会切换到小车设置界面。
  • virtual const QVariantList& vehicleComponents(void) = 0;自动驾驶仪支持的部件。
  • Q_INVOKABLE virtual QString prerequisiteSetup(VehicleComponent* component) const = 0;检查一个指定的部件是否依赖别的部件。当一个部件依赖的部件未设置完成时,这个部件不能进行用户设置。

创建流程

  • Vehicle构造函数----》Vehicle::_commonInit()
    _firmwarePlugin = _firmwarePluginManager->firmwarePluginForAutopilot(_firmwareType, _vehicleType):依据固件类型,小车类型,创建固件插件
  • Vehicle构造函数中
    _autopilotPlugin = _firmwarePlugin->autopilotPlugin(this); 创建自动驾驶仪

GPSManager

GPSManager提供两种定位功能,gps和rtk。对应的类是GPSProvider和RTCMMavlink。

  • 构造函数中注册了两个元对象。GPS位置信息,GPS卫星信息。

QGCImageProvider

此类用于图片的动态显示。具体使用参考 https://blog.csdn.net/caoshangpa/article/details/83959611

  • 此类在QGCApplication::_initForNormalAppBoot()函数中被注册_qmlAppEngine->addImageProvider(QStringLiteral(“QGCImages”), pImgProvider);
  • 使用到的界面是PX4Flowsensor.qml。

LinkManager

此类用于管理实际的物理连接。在构造函数中注册了三个类LinkManager,LinkConfiguration,LinkInterface。内部有个定时器,每隔1秒就刷新物理连接。可以刷新的连接在AppSetting界面设置的。

  • loadLinkConfigurationList(), saveLinkConfigurationList()用于加载和保存连接到配置文件。QGCApplication::_initForNormalAppBoot()中会调用加载函数。
  • 此类也用户界面交互:连接的增、删、编辑。

LinkInterface

此类是实际物理连接的父类。它继承于QThread。它的构造函数为protected,它的创建只能由友员类LinkManager。在构造函数中将_invokeWriteBytes与槽_writeBytes连接,为了发送数据时的线程安全。

  • 子类有:
    BluetoothLink
    LogReplayLink
    MockLink
    SerialLink
    TCPLink
    UDPLink

LinkConfiguration

此类是连接配置的基类。此类的子类也有六个。这个六个和LinkInterface的子类是一一对应的。此类用于UI界面对连接的配置。

  • 子类
    BluetoothConfiguration
    LogReplayConfiguration
    MockConfiguration
    SerialConfiguration
    TCPConfiguration
    UDPConfiguration

MAVLinkProtocol

  • 此类用于处理实际物理连接收到的字节。在LinkManager::createConnectedLink()中将LinkInterface数据的收发绑定到此类的收发。
 connect(link.get(), &LinkInterface::bytesReceived,       _mavlinkProtocol,    &MAVLinkProtocol::receiveBytes);
 connect(link.get(), &LinkInterface::bytesSent,           _mavlinkProtocol,    &MAVLinkProtocol::logSentBytes);
  • 数据处理完后需要通过信号MAVLinkProtocol::messageReceived往外发送。与这个信号连接的有三个类Vehicle, MAVLinkInspectorController, APMSensorsComponentController。
    后面两个Controller和界面相关。
connect(_mavlink, &MAVLinkProtocol::messageReceived,        this, &Vehicle::_mavlinkMessageReceived);
connect(_mavlink, &MAVLinkProtocol::mavlinkMessageStatus,   this, &Vehicle::_mavlinkMessageStatus);

数据流向

  • LinkInterface信号bytesReceived----->MAVLinkProtocol槽receiveBytes
  • MAVLinkProtocol信号messageReceived----------->Vehicle槽_mavlinkMessageReceived
  • Vehicle信号mavlinkMessageReceived---------------->
    . GCCameraManager::_mavlinkMessageReceived
    . &MissionManager::_mavlinkMessageReceived
    . PlanManager::_mavlinkMessageReceived
    . Vehiclel内类成员变量VehicleLinkManager::mavlinkMessageReceived()用于添加连接
    . Vehiclel内类成员变量UAS::_uas->receiveMessage

QGCMAVLink

此类仅用于UI显示。在QGCApplication::_initCommon()中被注册。

qmlRegisterSingletonType<ShapeFileHelper>           ("MAVLink",                                 1, 0, "MAVLink",                mavlinkSingletonFactory);```

MissionCommandTree

此类存储了小车的任务的UI显示的信息。数据存储在 QMap<QGCMAVLink::FirmwareClass_t, QMap<QGCMAVLink::VehicleClass_t, MissionCommandList*>> _staticCommandTree的变量里。此变量的初始化是在setToolbox函数内。

setToolobx {
1 获取程序支持的固件
2 获取程序里目前支持的6中小车类型。
3 获取每种固件和对应小车的命令描述文件。
4 通过MissionCommandList类将文件解析存储到变量里。
}

  • 查询的时候需要通过固件类型,小车类型进行查询。查询结果是MissionCommandList*类型。
  • MissionCommandList存储的是小车支持的命令列表QList<MAV_CMD> _ids,以及命令对应的命令描述信息QMap<MAV_CMD, MissionCommandUIInfo*> _infoMap;
  • MissionCommandUIInfo存储的是与任务命令相关的UI信息。信息的内容是从json文件解析出来的。例如MavCmdInfoCommon.json。文件内容如下。

在这里插入图片描述

Section类

  • 此类有两个子对象CameraSection和SpeedSection。
  • 此类将存在于VisualMissionItem的子类中。
  • 作用:
    1 当VisualMissionItem列表转MissionItem列表时添加速度设置和相机设置的指令。调用的函数为append函数,例如appendSectionItems
    2 当MissionItem列表转VisualMissionItem列表,去除无用的VisualMissionItem。调用的函数为scan函数,例如scanForSection

VisualMissionItem类梳理

  • 继承关系
    在这里插入图片描述
  • editorQml属性用于设置编辑器。
  • 它有一个FlightPathSegment的类成员变量指针。FlightPathSegment存储航段的基本信息。
  • 此类还存储了当前小车的类型(QGCMAVLink::VehicleClass_t),PlanMasterController*,MissionController*,Vehicle*,父指针VisualMissionItem*,子item,QGCGeoBoundingCube,_flyView.
  • 构造函数里会检测当前的小车类型是否需要获取地形高度。
  • setDistanceFromStart,setAltDifference等设置函数将在MissionController类被调用。

SimpleMissionItem类

  • 编辑器:qrc:/qml/SimpleItemEditor.qml
  • 类成员变量_missionItem。此变量存储了命令的相关数据。编辑器仅用于编辑显示。
  • 静态变量:存储的是一些固定值。
    _altitudeMetaData 高度,设置单位m,增长值1,小数点2
    _commandMetaData存储的是支持的命令枚举(字符串+命令编号)。
    _defaultParamMetaData存在的是参数默认值,只设置了小数点7位,类型位double。
    _frameMetaData存储的是支持的帧枚举(字符串+命令编号)。
    _latitudeMetaData,_longitudeMetaData存储的是经纬度。设置单位为deg,小数点7位。

ComplexMissionItem类

  • ComplexMissionItem继承于VisualMissionItem,它的子类有LandingComplexItem,MissionSettingsItem,StructureScanComplexItem,TransectStyleComplexItem

MultiVehicleManager

  • 此类用于管理连接的小车。小车的添加是通过下面方式添加的。
    setToolbox {
    connect(_mavlinkProtocol, &MAVLinkProtocol::vehicleHeartbeatInfo, this, &MultiVehicleManager::_vehicleHeartbeatInfo);
    }

QGC地图框架

QGC地图框架是基于Qt地图插件机制实现的。Qt地图插件接口是 QGeoServiceProviderFactory。它有四个虚函数要重载。在QGC中它的子类是QGeoServiceProviderFactoryQGC 。
QGeoServiceProviderFactoryQGC 只实现了前两个虚函数。后两个虚函数返回空指针。

  • QGeoServiceProviderFactory会创建四个对象
    QGeoCodingManagerEngine
    QGeoMappingManagerEngine
    QGeoRoutingManagerEngine
    QPlaceManagerEngine
  • QGeoServiceProviderFactoryQGC 创建两个对象
    QGeoCodingManagerEngineQGC
    QGeoTiledMappingManagerEngineQGC
    NULL
    NULL

四个虚函数的介绍参考QGC地图框架(第一集)

QGeoCodingManagerEngineQGC

参考文档QGC地图框架(第三集)

QGeoTiledMappingManagerEngineQGC

  • 构造函数中执行的步骤
  • 1 设置相机功能
  • 2 设置瓦片大小
  • 3 将地图插件名称命名为“QGroundControl”
  • 4 设置支持的地图类型
  • 5 设置瓦片获取类QGeoTileFetcherQGC。
  • 参考文档QGC地图框架(第二集)

QGeoTileFetcherQGC

每次刷新或者请求地图时,函数getTileImage会被调用。此函数依据地图类型,缩放等级,拼装URL。然后创建QGeoTiledMapReplyQGC(父类:QGeoTiledMapReply)。

QGeoTiledMapReplyQGC

在构造函数中会创建请求任务,并将任务添加的任务队列。任务完成后调用调用此类的QGeoTiledMapReplyQGC::cacheReply函数,设置瓦片用于显示。

QGCMapEngine

此类中有两个比较重要的类成员变量UrlFactory和QGCCacheWorker。

  • UrlFactory用于定义当前支持哪些地图
  • QGCCacheWorker用于执行任务队列。

添加高德地图

https://chuhan.blog.csdn.net/article/details/113985988

UASMessageHandler

此类用于显示无人机消息。显示的函数调用的是QGCApplication::showCriticalVehicleMessage

QGCPositionManager

此类用于在界面上显示地面站的位置信息。地面站上也可以装GPS。此类将在FlightMap.qml中被使用。

  • 若有航行
    在这里插入图片描述

  • 若没航向
    在这里插入图片描述

FollowMe

让小车跟随着地面站。发送的是MAVLINK_MSG_ID_FOLLOW_TARGET命令。发送的坐标是地面站的坐标。

VideoManager

视频的配置信息位于类成员变量VideoSettings对象中。

MAVLinkLogManager

Vehicle的mavlink消息日志的管理类。它内部MAVLinkLogProcessor* _logProcessor,用于日志文件的读写。QmlObjectListModel _logFiles;存储有哪些日志文件。

  • 它与vehicle的具体关系
    connect(_vehicle, &Vehicle::armedChanged, this, &MAVLinkLogManager::_armedChanged);
    connect(_vehicle, &Vehicle::mavlinkLogData, this, &MAVLinkLogManager::_mavlinkLogData);
    connect(_vehicle, &Vehicle::mavCommandResult, this, &MAVLinkLogManager::_mavCommandResult);

FactSystem

类的继承关系如下图。FactGroup的子类用于参数设置。SettingGroup的子类用于ini配置文件。

在这里插入图片描述

FactMetaData

参数属性

  • FactMetaData是对普通数据的包装。它用了28个属性对一个数据进行描述。
ValueType_t     _type;                  // must be first for correct constructor init
int             _decimalPlaces;
QVariant        _rawDefaultValue;
bool            _defaultValueAvailable;
QStringList     _bitmaskStrings;
QVariantList    _bitmaskValues;
QStringList     _enumStrings;
QVariantList    _enumValues;
QString         _category;
QString         _group;
QString         _longDescription;
QVariant        _rawMax;
bool            _maxIsDefaultForType;
QVariant        _rawMin;
bool            _minIsDefaultForType;
QString         _name;
QString         _shortDescription;
QString         _rawUnits;
QString         _cookedUnits;
Translator      _rawTranslator;
Translator      _cookedTranslator;
bool            _vehicleRebootRequired;
bool            _qgcRebootRequired;
double          _rawIncrement;
bool            _hasControl;
bool            _readOnly;
bool            _writeOnly;
bool            _volatile;
CustomCookedValidator _customCookedValidator = nullptr;
  • 这些数据的定义是从json文件内读出来。文件中的Key已在类静态变量中定义。
    在这里插入图片描述
  • 此类还封装了单位转换函数。

此类里定义了一些数据类型

类型说明
ValueType_t一些常见数据类型枚举,这些数据类型变量可存入QVariant。
TranslatorQVariant数据转换的函数,入参和返回值都是QVariant
NameToMetaDataMap_tQMap<QString, FactMetaData*>
DefineMap_tQMap<QString, QString>
UnitTypes单位的枚举
AppSettingsTranslation_s单位转换的结构体。
UnitConsts_s精确的转换常数
BuiltInTranslation_s编译时的转换函数

Fact

Fact是对FactMetaData的包装。将数据进行Qt属性的封装,且定义相关的信号和槽,用于界面显示。 注意: 多个Fact可以对应一个FactMetaData。

构造函数

此类有四个构造函数。有的构造函数会new FactMetaData,有的则不会。

// 创建FactMetaData对象
Fact(QObject* parent = nullptr);

// 创建FactMetaData对象
Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObject* parent = nullptr);

// 调用=操作符。this和other都有FactMetaData时才进行数据拷贝。否则将this->FactMetaData设置成nullptr。
Fact(const Fact& other, QObject* parent = nullptr);

// 不创建FactMetaData对象
Fact(const QString& settingsGroup, FactMetaData* metaData, QObject* parent = nullptr);

属性

/ 获取的是单位转换后的值
Q_PROPERTY(QVariant     defaultValue            READ cookedDefaultValue                                 CONSTANT)
Q_PROPERTY(QString      defaultValueString      READ cookedDefaultValueString                           CONSTANT)
Q_PROPERTY(QVariant     max                     READ cookedMax                                          CONSTANT)
Q_PROPERTY(QString      maxString               READ cookedMaxString                                    CONSTANT)
Q_PROPERTY(QVariant     min                     READ cookedMin                                          CONSTANT)
Q_PROPERTY(QString      minString               READ cookedMinString                                    CONSTANT)
Q_PROPERTY(QVariant     value                   READ cookedValue            WRITE setCookedValue        NOTIFY valueChanged)
Q_PROPERTY(QString      valueString             READ cookedValueString                                  NOTIFY valueChanged)
Q_PROPERTY(double       increment               READ cookedIncrement                                    CONSTANT)

// 获取的是Fact类的成员变量,而非FactMetaData的成员变量
Q_PROPERTY(QString      name                    READ name                                               CONSTANT)
Q_PROPERTY(QVariant     rawValue                READ rawValue               WRITE setRawValue           NOTIFY rawValueChanged)

函数

  • Q_INVOKABLE FactValueSliderListModel* valueSliderModel(void);只有调用此函数时,才会创建FactValueSliderListModel对象。

FactValueSliderListModel

提供一个值的列表模型,用于递增/递减 Fact值。

FactGroup

用于将 一组Fact 组织成一个对象层次结构。其主要功能是从指定的json文件中加载参数定义。每一个json文件对应一个FactGroup。

它的子类以及对应的json文件。其中的大部分类将在Vehicle中被new。
FactGroup存储元数据,它的子类会有一个Fact引用元数据。
这些存储的是Vehicle的状态。这些数据会被Mavlink通信获取的消息更新。virtual void handleMessage(Vehicle* vehicle, mavlink_message_t& message);用于更新数据。

l类名json文件
QGCCameraControl
APMSubmarineFactGroup:/json/Vehicle/SubmarineFact.json
GPSRTKFactGroup:/json/Vehicle/GPSRTKFact.json
TerrainFactGroup:/json/Vehicle/TerrainFactGroup.json
Vehicle:/json/Vehicle/VehicleFact.json
VehicleBatteryFactGroup/json/Vehicle/BatteryFact.json
VehicleClockFactGroup:/json/Vehicle/ClockFact.json
VehicleDistanceSensorFactGroup:/json/Vehicle/DistanceSensorFact.json
VehicleEscStatusFactGroup:/json/Vehicle/EscStatusFactGroup.json
VehicleEstimatorStatusFactGroup:/json/Vehicle/EstimatorStatusFactGroup.json
VehicleGPSFactGroup:/json/Vehicle/GPSFact.json
VehicleHygrometerFactGroup:/json/Vehicle/HygrometerFact.json
VehicleLocalPositionFactGroup:/json/Vehicle/LocalPositionFact.json
VehicleLocalPositionSetpointFactGroup:/json/Vehicle/LocalPositionSetpointFact.json
VehicleSetpointFactGroup:/json/Vehicle/SetpointFact.json
VehicleTemperatureFactGroup:/json/Vehicle/TemperatureFact.json
VehicleVibrationFactGroup:/json/Vehicle/VibrationFact.json
VehicleWindFactGroup:/json/Vehicle/WindFact.json

SettingsFact

SettingsFact是一个包含QSettings值的Fact。它比Fact多了两个私有变量QString _settingsGroup;bool _visible;。
该类的主要功能是从QSettings中依据settingsGroup以及_name获取值。
槽函数_rawValueChanged,用于将数据保存到QSettings。
?qgcApp()->toolbox()->corePlugin()->adjustSettingMetaData(settingsGroup, *metaData);目前不明白这行代码什么意思。

在构造函数内将ini文件里的值写入到Fact内。
在槽函数_rawValueChanged内,将Fact值写到ini文件
Ini文件位置:C:\Users\WenlouYin\AppData\Roaming\QGroundControl.org

SettingsGroup

在构造函数中通过json文件来创建QMap<QString, FactMetaData*> _nameToMetaDataMap来存储数据。
加载的json文件位于":/json/%1.SettingsGroup.json";
子类通过_createSettingsFact函数来创建SettingsFact。
它有一个visible属性,用于表示此组数据是否在ui中显示。

  • 下图是其子类。 这些子类在SettingsManager中被new出来。
类名json文件%1QSettings的groupName
AirMapSettingsAirMap,“AirMap”
ADSBVehicleManagerSettingsADSBVehicleManager,“ADSBVehicleManager”
APMMavlinkStreamRateSettingsAPMMavlinkStreamRate,“APMMavlinkStreamRate”
AppSettingsApp,“”
AutoConnectSettingsAutoConnect,“LinkManager”
BrandImageSettingsBrandImage,“Branding”
FirmwareUpgradeSettingsFirmwareUpgrade,“FirmwareUpgrade”
FlightMapSettingsFlightMap,“FlightMap”
FlyViewSettingsFlyView,“FlyView”
OfflineMapsSettingsOfflineMaps,“OfflineMaps”
PlanViewSettingsPlanView,“PlanView”
RTKSettingsRTK,“RTK”
UnitsSettingsUnits,“Units”
VideoSettingsVideo,“Video”

FactPanelController

此类用于vehicle参数的读取。读出的是Fact指针。子类中通过Fact指针对参数进行设置。

  • 构造函数:启动一个QTimer(定时500ms, 且单次触发),去调用_checkForMissingParameters()。
  • Q_INVOKABLE Fact* getParameterFact (int componentId, const QString& name, bool reportMissing = true);
    通过_vehicle->parameterManager()->getParameter()获取Fact。
  • Q_INVOKABLE bool parameterExists (int componentId, const QString& name);
    检查参数是否存在,通过函数_vehicle->parameterManager()->parameterExists(componentId, name)
  • getMissingParameters(QStringList rgNames):添加要检查的丢失的参数。参数存储于_missingParameterWaitList。
  • bool _allParametersExists(int componentId, QStringList names);
    检查names中的参数是否都存在
  • _checkForMissingParameters(): 调用_vehicle->parameterManager()->parameterExists()去检查参数是否存在。
    检查结果若还存在丢失的参数,将重新启动定时器。否则发送missingParametersAvailable信号。

FactSystem

此类用于注册Fact,FactMetaData,FactPanelController,FactGroup。

StateMachine

类的用途,按照子类定义的执行步骤,一步一步往下执行。运行一步就是调用一个函数。函数的类型为StateFn类型。所有的步骤存在子类的StateFn的数组中。

  • advence(void) 执行一步。
  • move(StateFn stateFn) 设置开始的步骤。
  • virtual const StateFn* rgStates(void) const = 0; 此函数会被advanced函数调用,用户获取当前的函数指针。
  • virtual void statesCompleted(void) const;任务完成时将执行此函数。
  • 子类有:RequestMetaDataTypeStateMachine, ComponentInformationManager, InitialConnectStateMachine。

ComponentInformationManager

此类用于存储部件信息。部件信息是从小车里获取来的。目前此类里要获取四类部件信息:CompInfoGeneral,CompInfoParam,CompInfoEvents,CompInfoActuators.
部件信息的获取是通过RequestMetaDataTypeStateMachine来实现的。

  • 基础部件信息的获取是通过小车发送mavlink请求。数据在处理是在static void _requestMessageResultHandler()函数中。
  • CompInfo需要设置Json文件,文件是通过RequestMetaDataTypeStateMachine::_requestFile()函数获取的,获取方式通过uri获取。

InitialConnectStateMachine

此类用于初始化连接。连接步骤:

  1. vehicle->requestMessage获取版本号
  2. vehicle->requestMessage 获取mavlink协议
  3. vehicle->_componentInformationManager->requestAllComponentInformation获取组件信息。此函数会执行ComponentInformationManager类里的请求流程
  4. vehicle->_parameterManager->refreshAllParameters() 刷新参数
  5. vehicle->_missionManager->loadFromVehicle()从小车加载任务
  6. vehicle->_geoFenceManager->loadFromVehicle()从小车加载电子围栏
  7. vehicle->_rallyPointManager->loadFromVehicle()从小车加载集结点。
  8. emit vehicle->initialConnectComplete() 发送小车初始化连接完成。

ParameterManager

  • 此类维护着Vehicle的小车里的参数。涉及到的参数操作有读和写。参数存放在_mapCompId2FactMap类成员变量中。
    QMap<int /* comp id /, QMap<QString / parameter name /, Fact>> _mapCompId2FactMap

  • 需要注意是:_mapCompId2FactMap中Fact所指向的FactMetaData变量不存储在此类中。这些元变量存在与固件类型相关的类中。
    目前有两个类 PX4ParameterMetaData 和 APMParameterMetaData。每一个类都配有一些xml参数定义文件。
    在这里插入图片描述

构造函数

  • 若小车处于离线状态,程序将读取离线文件里的参数值,然后将数值设置到PX4ParameterMetaData里。
    具体步骤如下(PX4说明):调用_loadOfflineEditingParams()
_loadOfflineEditingParams() {
  1. 解析解析V1.4.OfflineEditing.params文件。

  2. 通过解析出来的参数名+类型获取FactMetaData指针:vehicle->compInfoManager()->compInfoParam(defaultComponentId)->factMetaDataForName(paramName, fact->type())
      CompInfoParam::factMetaDataForName() {
          ****
          2.1
          // 通过小车的vehicle->firmwarePlugin()->_loadParameterMetaData(metaDataFile)函数创建 PX4ParameterMetaData对象。
          // 入参metaDataFile = PX4ParameterFactMetaData.xml
          QObject* opaqueMetaData = _getOpaqueParameterMetaData(); 

          // 2.2
          if (opaqueMetaData) {
              // 若opaqueMetaData没有此参数,会在opaqueMetaData内创建。
              factMetaData = vehicle->firmwarePlugin()->_getMetaDataForFact(opaqueMetaData, name, type, vehicle->vehicleType());
          }
          ****
          return opaqueMetaData
       }

  3. 将离线文件里的值更新到FactMetaData。

  4. 将Fact存储到类成员变量_mapCompId2FactMap
}
  • 若小车处于在线状态。参数的值通过mavlink连接获取。在连接初始化的时候,会调用refreshAllParameters函数更新参数。

参数的读函数

  • void refreshAllParameters(uint8_t componentID = MAV_COMP_ID_ALL); 发送的消息 MAVLINK_MSG_ID_PARAM_REQUEST_LIST
  • void refreshParameter(int componentId, const QString& paramName); 发送的消息MAVLINK_MSG_ID_PARAM_REQUEST_READ

参数解析

  • void mavlinkMessageReceived(mavlink_message_t message);接收mavlink消息。此函数调用 _handleParamValue来处理消息单个参数。
  • _handleParamValue(部件id, 参数名, 一共有多少参数, 当前是第几个参数, 参数类型, 参数值);
若是px4,读缓存文件。

if (新部件ID) {
  //更新此部件的参数个数
  _paramCountMap[componentId] = parameterCount;
  // 更新总部件的参数个数
  _totalParamCount += parameterCount;
}

if (新部件ID) {
  for (int waitingIndex=0; waitingIndex<parameterCount; waitingIndex++) {
   初始化每个参数下标的重读次数为0
    _waitingReadParamIndexMap[componentId][waitingIndex] = 0;
  }

   // 清空组件参数中需要重读或重启的参数的,以及重读的次数。
   _waitingReadParamNameMap[componentId] = QMap<QString, int>();
   _waitingWriteParamNameMap[componentId] = QMap<QString, int>();
}

参数的发送

参数文件的读写

信号的传递

  • 若小车的通信连接是高延时连接,refreshAllParameters会触发两个信号
  1. emit parametersReadyChanged(_parametersReady);此信号会触发四个槽函数
    Vehicle::_parametersReady:1 给小车下发时间。 2 将参数autoDisarm参数与Vehicle::autoDisarmChanged信号信息绑定。3 重新初始化连接。
    MultiVehicleManager::_vehicleParametersReadyChanged:触发emit MultiVehicleManager::parameterReadyVehicleAvailableChanged(parametersReady);
    GeoFenceController::_parametersReady:将参数px4ParamCircularFenceFact参数与GeoFenceController::paramCircularFenceChanged信号绑定。
    APMAutoPilotPlugin::_checkForBadCubeBlack。
  2. emit missingParametersChanged(_missingParameters);

变量的工作流程

  • QTimer _initialRequestTimeoutTimer;当刷新所有参数时,若连接不是高延时类型,计时器启动。计时5秒钟。5秒内必须收到小车的参数信息。在处理参数信息函数中会将计时器关闭。若超时,会再次启动计时器,并重新调用刷新函数。最多执行4次。

QGCCorePlugin

此类用于对UI全局的一些设置。如创建QML引擎;创建主界面;创建Analysis和AppSetting界面;创建toolBarIndicator;第一次打开程序时,用户选择单位;能够获得所有mavlink信息;能设置室外室内的图片…

AirspaceManager

空域管理类。

ADSBVehicleManager

管理通过ADSB模块采集到的小车。ADSB是什么?

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值