系列索引:MAVLink入门教程索引
目的
本文介绍如何使用添加自定义界面控件显示数据。
界面控件
首先说明一下界面控件是什么。
打开QGC
QGC默认界面下方有个数据显示控件
将鼠标放置在控件上面,点击笔进入编辑状态
下方和右方有+/-
符号
点击+
,出现新数据显示区域
界面控件就是,由QGC控制显示隐藏位置,使用QGC统一显示接口,使用QGC统一数据通信接口的控件,自己用QML写的界面只能通过修改代码来修改显示效果。
新建文件
进入qgroundcontrol/src/Vehicle
目录,创建一个新类PlaneStatusFactGroup.h/cc/json
从名称可以看出,这个类基于FactGroup,用于显示飞机状态
PlaneStatusFactGroup.h
基于标准规则接口添加自定义接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #pragma once
#include "FactGroup.h" #include "QGCMAVLink.h"
class TestInfoFactGroup : public FactGroup { Q_OBJECT
public: TestInfoFactGroup(QObject* parent = nullptr);
Q_PROPERTY(Fact* test1 READ test1 CONSTANT) Q_PROPERTY(Fact* test2 READ test2 CONSTANT) Q_PROPERTY(Fact* test3 READ test3 CONSTANT) Q_PROPERTY(Fact* test4 READ test4 CONSTANT)
Fact* test1 () { return &_test1Fact; } Fact* test2 () { return &_test2Fact; } Fact* test3 () { return &_test3Fact; } Fact* test4 () { return &_test4Fact; }
void handleMessage(Vehicle* vehicle,mavlink_message_t& message) override;
static const char* _test1FactName; static const char* _test2FactName; static const char* _test3FactName; static const char* _test4FactName;
private: Fact _test1Fact; Fact _test2Fact; Fact _test3Fact; Fact _test4Fact; };
|
将此文件添加到qgroundcontrol.pro
同样基于规则添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include "TestInfoFactGroup.h" #include "Vehicle.h" const char* TestInfoFactGroup::_test1FactName = "test1"; const char* TestInfoFactGroup::_test2FactName = "test2"; const char* TestInfoFactGroup::_test3FactName = "test3"; const char* TestInfoFactGroup::_test4FactName = "test4";
TestInfoFactGroup::TestInfoFactGroup(QObject* parent) : FactGroup(1000, ":/json/Vehicle/TestInfoFact.json", parent) , _test1Fact (0, _test1FactName, FactMetaData::valueTypeDouble) , _test2Fact (0, _test2FactName, FactMetaData::valueTypeDouble) , _test3Fact (0, _test3FactName, FactMetaData::valueTypeDouble) , _test4Fact (0, _test4FactName, FactMetaData::valueTypeUint32) { _addFact(&_test1Fact, _test1FactName); _addFact(&_test2Fact, _test2FactName); _addFact(&_test3Fact, _test3FactName); _addFact(&_test4Fact, _test4FactName); _test1Fact.setRawValue(qQNaN()); _test2Fact.setRawValue(qQNaN()); _test3Fact.setRawValue(qQNaN()); _test4Fact.setRawValue(qQNaN()); }
void TestInfoFactGroup::handleMessage(Vehicle*, mavlink_message_t& message) { if (message.msgid != MAVLINK_MSG_ID_ALTITUDE) { return; } mavlink_altitude_t altitude; mavlink_msg_altitude_decode(&message, &altitude); test1()->setRawValue(altitude.altitude_relative); _setTelemetryAvailable(true); }
|
Vehicle.h
同时在Vehicle.h
中添加头文件PlaneStatusFactGroup.h
在_terrainProtocolHandler下添加
1
| PlaneStatusFactGroup _planeStatusFactGroup;
|
在_joystickEnabledSettingsKey下添加
1
| static const char* _planeStatusFactGroupName;
|
在distanceSensors下添加
1
| Q_PROPERTY(FactGroup* planeStatus READ planeStatusFactGroup CONSTANT)
|
在terrainFactGroup下添加
1
| FactGroup* planeStatusFactGroup () { return &_planeStatusFactGroup;}
|
在合适的位置添加
1 2 3 4 5
| const char* Vehicle::_planeStatusFactGroupName = "planeStatus"; ... , _planeStatusFactGroup (this) ... _addFactGroup(&_planeStatusFactGroup, _planeStatusFactGroupName);
|
PlaneStatusFactGroup.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| { "version": 1, "fileType": "FactMetaData", "QGC.MetaData.Facts": [ { "name": "test1", "shortDesc": "测试1", "type": "double", "decimalPlaces": 2, "units": "v" }, { "name": "test2", "shortDesc": "测试2", "type": "double", "decimalPlaces": 2, "units": "v" }, { "name": "test3", "shortDesc": "测试3", "type": "double", "decimalPlaces": 2, "units": "v" }, { "name": "test4", "shortDesc": "测试4", "type": "uint32" } ] }
|
其中参数表示:
- “name”:对应程序中的名字FactName
- “shortDesc”: 对应页面中显示的名字
- “type”: 对应类型
- “decimalPlaces”: 对应小数点后几位
- “units”: 对应单位
并将其添加到qgroundcontrol.qrc里面,设置别名Vehicle/PlaneStatusFactGroup.json
测试
编译,运行程序
打开QGC,编辑显示控件,添加新控件
双击需要显示的数字,弹出数据源设置
在下拉列表选择刚刚创建的数据源
自动显示可用数据字段
设置完成
启动仿真数据发送,控件显示新数据