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
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。 |
Translator | QVariant数据转换的函数,入参和返回值都是QVariant |
NameToMetaDataMap_t | QMap<QString, FactMetaData*> |
DefineMap_t | QMap<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文件%1 | QSettings的groupName |
---|---|---|
AirMapSettings | AirMap, | “AirMap” |
ADSBVehicleManagerSettings | ADSBVehicleManager, | “ADSBVehicleManager” |
APMMavlinkStreamRateSettings | APMMavlinkStreamRate, | “APMMavlinkStreamRate” |
AppSettings | App, | “” |
AutoConnectSettings | AutoConnect, | “LinkManager” |
BrandImageSettings | BrandImage, | “Branding” |
FirmwareUpgradeSettings | FirmwareUpgrade, | “FirmwareUpgrade” |
FlightMapSettings | FlightMap, | “FlightMap” |
FlyViewSettings | FlyView, | “FlyView” |
OfflineMapsSettings | OfflineMaps, | “OfflineMaps” |
PlanViewSettings | PlanView, | “PlanView” |
RTKSettings | RTK, | “RTK” |
UnitsSettings | Units, | “Units” |
VideoSettings | Video, | “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
此类用于初始化连接。连接步骤:
- vehicle->requestMessage获取版本号
- vehicle->requestMessage 获取mavlink协议
- vehicle->_componentInformationManager->requestAllComponentInformation获取组件信息。此函数会执行ComponentInformationManager类里的请求流程
- vehicle->_parameterManager->refreshAllParameters() 刷新参数
- vehicle->_missionManager->loadFromVehicle()从小车加载任务
- vehicle->_geoFenceManager->loadFromVehicle()从小车加载电子围栏
- vehicle->_rallyPointManager->loadFromVehicle()从小车加载集结点。
- 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会触发两个信号
- emit parametersReadyChanged(_parametersReady);此信号会触发四个槽函数
Vehicle::_parametersReady:1 给小车下发时间。 2 将参数autoDisarm参数与Vehicle::autoDisarmChanged信号信息绑定。3 重新初始化连接。
MultiVehicleManager::_vehicleParametersReadyChanged:触发emit MultiVehicleManager::parameterReadyVehicleAvailableChanged(parametersReady);
GeoFenceController::_parametersReady:将参数px4ParamCircularFenceFact参数与GeoFenceController::paramCircularFenceChanged信号绑定。
APMAutoPilotPlugin::_checkForBadCubeBlack。 - emit missingParametersChanged(_missingParameters);
变量的工作流程
- QTimer _initialRequestTimeoutTimer;当刷新所有参数时,若连接不是高延时类型,计时器启动。计时5秒钟。5秒内必须收到小车的参数信息。在处理参数信息函数中会将计时器关闭。若超时,会再次启动计时器,并重新调用刷新函数。最多执行4次。
QGCCorePlugin
此类用于对UI全局的一些设置。如创建QML引擎;创建主界面;创建Analysis和AppSetting界面;创建toolBarIndicator;第一次打开程序时,用户选择单位;能够获得所有mavlink信息;能设置室外室内的图片…
AirspaceManager
空域管理类。
ADSBVehicleManager
管理通过ADSB模块采集到的小车。ADSB是什么?