MAVLink入门教程09.04:界面控件显示数据

系列索引:MAVLink入门教程索引

目的

本文介绍如何使用添加自定义界面控件显示数据。

界面控件

首先说明一下界面控件是什么。

打开QGC

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; }

// Overrides from FactGroup
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

PlaneStatusFactGroup.cc

同样基于规则添加

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);
// Start out as not available "--.--"
_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;}

Vehicle.cc

在合适的位置添加

1
2
3
4
5
const char* Vehicle::_planeStatusFactGroupName =        "planeStatus";
...
, _planeStatusFactGroup (this) //两处 182 332
...
_addFactGroup(&_planeStatusFactGroup, _planeStatusFactGroupName);//472行

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,编辑显示控件,添加新控件

新控件

双击需要显示的数字,弹出数据源设置

数据源设置

在下拉列表选择刚刚创建的数据源

数据源

自动显示可用数据字段

可用字段

设置完成

设置标签

启动仿真数据发送,控件显示新数据

显示数据


MAVLink入门教程09.04:界面控件显示数据
https://blog.jackeylea.com/mavlink/display-data-on-qgc-witch-native-component/
作者
JackeyLea
发布于
2024年6月15日
许可协议