QGC二次开发入门教程(一):课程大纲

news2024/11/15 21:51:40

文章目录

  • 前言
  • 一、课程大纲
  • 二、修改软件名称
  • 三、修改软件图标
  • 四、官方QGC中文版BUG修复
  • 五、汉化
  • 六、修改商标
  • 七、添加信号-槽
    • 1、添加文件到QGC工程
    • 2、添加界面
    • 3、QML和C++交互
    • 4、信号与槽
    • 5、测试
  • 八、添加QML和C++交互
  • 九、MAVLINK的解析与发送
  • 十、换地图
  • 十一、添加自定义mavlink消息
  • 十二、在主工具栏添加一个自定义图标
  • 十三、解析自定义mavlink数据并在自定义图标上显示
  • 十四、同时显示多机轨迹
  • 十五、在地图上画一个点

前言

QGC版本:4.2.4稳定版
需要的基础:少量的C++、QT基础
飞控固件:PX4、Ardupilot

课程答疑微(18362086993)

课程所用虚拟机(已配置好开发环境)

链接:https://pan.baidu.com/s/12zes9Jk2OB_c2ghNsAKv1w?pwd=7o4u
提取码:7o4u
–来自百度网盘超级会员V6的分享

VMware下载(使用VM17)
链接:https://pan.baidu.com/s/1lBCMX1O3U-T64gzM5c0IYg?pwd=ylf6
提取码:ylf6
–来自百度网盘超级会员V6的分享

虚拟机的安装和打开:
https://cwkj-tech.yuque.com/bsge84/uav-m1/cuut9sq5sci8c5wr#rdB9k

独家汉化版QGC下载地址:
链接:https://pan.baidu.com/s/16G97kfid-tDQq2kZCEYjnQ?pwd=es97
提取码:es97
–来自百度网盘超级会员V6的分享

编译环境安装可以参考:

6.1、QGC编译环境安装(ubuntu)

课程目录(暂时想到这么多,后续会不断更新)

一、课程大纲

二、修改软件名称

改一行代码就行
修改
QGCApplication.cc

setApplicationName("cwkj");

在这里插入图片描述
修改后效果如下:

在这里插入图片描述

三、修改软件图标

添加图片资源
新建一个文件夹img_add,放入需要添加的图片资源
在这里插入图片描述

然后在qgcimages.qrc中点击添加->添加文件,选择上面添加的图片,然后填写别名,回车然后ctrl+s保存qgcimages.qrc

在这里插入图片描述
在这里插入图片描述
然后就可以在程序中使用添加的图片了,注意程序中填写的是图片的别名
修改主工具栏图标:
修改MainToolBar.qml,在下图位置修改图片资源的路径为自己添加的资源(以软件设置按钮为例):

icon.source:            "/qmlimages/软件图标.png"

在这里插入图片描述
效果如下:
在这里插入图片描述
修改软件设置图标:
修改MainRootWindow.qml
需要修改两个地方:

showTool(qsTr("Application Settings"), "AppSettings.qml", "/qmlimages/软件图标.png")

在这里插入图片描述

imageResource:      "/qmlimages/软件图标.png"

在这里插入图片描述

四、官方QGC中文版BUG修复

QGC中文bug解决教程

五、汉化

打开QGC源码工程,点击工具->外部->Linguist->Update Translations(lupdate),弹窗选全是
在这里插入图片描述
然后打开Qt Linguist
在这里插入图片描述
在Qt Linguist中点击file->open,打开汉化脚本
在这里插入图片描述
打开后,在左侧会显示总个数和已汉化的个数,点击没有全部汉化的Context,在右侧对有问号的进行汉化,在简体中文下面的输入框写入对应的汉化结果,然后点击上方的勾号,勾完后对应的问号就变成了勾号,然后点击上方的保存按钮。

在这里插入图片描述
保存后打开QGC工程源码,如果出现下面的提示,选全是,然后编译
在这里插入图片描述
编译后效果如下:
在这里插入图片描述

六、修改商标

修改PX4FirmwarePlugin.h下图位置,将图片改成自己想显示的图片:

QString             brandImageIndoor                (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/软件图标.png"); }
QString             brandImageOutdoor               (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/软件图标.png"); }

在这里插入图片描述
修改后效果如下:
在这里插入图片描述

七、添加信号-槽

1、添加文件到QGC工程

在qgroundcontrol/src目录下创建SimpleTest文件夹
请添加图片描述

在文件夹中创建SimpleTest.cppSimpleTest.hSimpleTest.qml三个文件

请添加图片描述

qgroundcontrol.pro中添加下图位置添加src/SimpleTest/SimpleTest.h\

请添加图片描述

下图位置添加src/SimpleTest/SimpleTest.cpp\

请添加图片描述
然后即可将添加的test.cpp和test.h编译到QGC中。

SimpleTest.cpp填入内容如下:

#include "SimpleTest.h"
#include <QtCharts/QLineSeries>
#include<qdebug.h>

SimpleTest::SimpleTest()
{
    connect(this,&SimpleTest::valueChanged,this,&SimpleTest::_test);
}

SimpleTest::~SimpleTest()
{
}

void SimpleTest::setTest1(QString test)
{
_test1=test;
qDebug()<<test;
emit valueChanged();
}

void SimpleTest::setTest2(QString test)
{
_test2=test;
qDebug()<<test;
emit valueChanged2();
}
void SimpleTest::_test()
{
    qDebug()<<"in C++ slot";
    emit _testChanged();
}

SimpleTest.h填入内容如下:

#pragma once
#include <QObject>
#include <QString>
#include <QMetaObject>
#include <QStringListModel>

// Fordward decls
class Vehicle;

class SimpleTest : public QObject
{
    Q_OBJECT

public:
    SimpleTest();
    virtual ~SimpleTest();

    Q_PROPERTY(QString          test1       READ test1   WRITE setTest1   NOTIFY valueChanged)
    Q_PROPERTY(QString          test2       READ test2   WRITE setTest2   NOTIFY valueChanged2)

    QString         test1           ()
    {
        return _test1;
    }
    QString         test2           ()
    {
        return _test2;
    }

    void setTest1(QString test1);
    void setTest2(QString test2);

signals:
    void    valueChanged();
    void    valueChanged2();
    void    _testChanged();

private slots:
    void _test(void);

private:
    QString     _test1="A";
    QString     _test2="a";
};

SimpleTest.qml填入内容如下:

import QtQuick          2.3
import QtQuick.Controls 1.2
import QtQuick.Dialogs  1.2
import QtQuick.Layouts      1.2

import QGroundControl               1.0
import QGroundControl.Palette       1.0
import QGroundControl.FactSystem    1.0
import QGroundControl.FactControls  1.0
import QGroundControl.Controls      1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Controllers   1.0
import SimpleTest 1.0
AnalyzePage {
    id:              mavlinkConsolePage
    pageComponent:   pageComponent
    pageName:        qsTr("SimpleTest")

    SimpleTest {
       id: _SimpleTest
    }

    Connections
    {
        target: _SimpleTest
        function on_testChanged()
        {
        _SimpleTest.test2="c"
    }
    }

    TextEdit {
        id: textEdit
        x: 285
        y: 189
        width: 81
        height: 25
        color: "#f5f3f3"
        text: qsTr(_SimpleTest.test1)
        font.family: "Times New Roman"
        font.pixelSize: 12
    }
    TextEdit {
        id: textEdit1
        x: 285
        y: 229
        width: 81
        height: 25
        color: "#f5f3f3"
        text: qsTr(_SimpleTest.test2)
        font.family: "Times New Roman"
        font.pixelSize: 12
    }
    Button {
        id: button
        x: 372
        y: 189
        text: qsTr("发送")
        onClicked: {
       _SimpleTest.test1="C"
        }
    }

}

2、添加界面

在qgroundcontrol.qrc中将上面创建的QML资源添加进去,点击Add Files选择上面创建的QML文件。取别名叫SimpleTest.qml。注意添加完后一定不要忘了把下面别名那个输入框填上别名,注意别名不要写错,不要忘了加上后缀.qml。否则如果后面QGCCorePlugin.cc引用的时候和别名不一样,会导致页面里是空的

请添加图片描述
然后修改QGCCorePlugin.cc文件
添加一行

_p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("SimpleTest"),     QUrl::fromUserInput("qrc:/qml/SimpleTest.qml"),      QUrl::fromUserInput("qrc:/qmlimages/MavlinkConsoleIcon"))));

请添加图片描述

3、QML和C++交互

1.C++类如果想被QML访问,需要满足两个条件:
(1)继承自QObject类
(2)添加Q_OBJECT宏
对应本例如下:
请添加图片描述
2.C++实例注册到qml
QT可以通过qmlRegisterUncreatableType或者qmlRegisterType将 C++的类声明为 qml 中可以访问的类型:

首先在QGCApplication.cc中添加头文件:

#include "SimpleTest/SimpleTest.h"

请添加图片描述
(1)qmlRegisterType
qmlRegisterType 声明的 C++类型可以在 qml 文件中直接构造,在 qml 中通过 id来访问属性和方法。
qmlRegisterType里总共4个参数:第一个参数指的是QML中import后的内容,相当于头文件名;第二个第三个参数分别是主次版本号;第四个指的是QML中类的名字。

在本例中,在QGCApplication.cc中下图位置添加:

qmlRegisterType<SimpleTest> ("SimpleTest", 1, 0, "SimpleTest");

请添加图片描述
然后先在SimpleTest.qmlimport SimpleTest 1.0,再

 SimpleTest {
       id: _SimpleTest
    }

就可以通过_SimpleTest访问SimpleTest类中的属性和方法。

请添加图片描述

注册属性或者方法
通过上面的方式将 C++类注册入 Qt 的元对象系统中后 ,可以通过 Q_PROPERTY 注册qml 可以调用的属性,同时可以通过在函数声明前添加Q_INVOKABLE 来声明 qml 可以调用的方法。

属性声明
主要存在以下几种形式:
Q_PROPERTY(int
test
READ
test
CONSTANT)
当该属性的值一旦被赋值,在整个程序运行期间 C++中不会修改该属性。

Q_PROPERTY(int
test
READ
test
NOTIFY valueChanged)
这种方法声明的属性只有在C++中会更改,当更改时,发射 valueChanged 信号来通知 qml 。

Q_PROPERTY(int
test
READ
test
WRITE
settest
NOTIFY valueChanged)
这种方法声明的属性在C++和QML中都可能被更改,当在 C++中改变该参数值时,发射 valueChanged 信号来通知 qml 。在 qml 中也可以对test进行赋值,触发 C++中的 settest 函数,来实现相关属性的更改。

方法声明
方法声明只需要我们在函数定义前面添加 Q_INVOKABLE 即可。
如:Q_INVOKABLE void test(void);

本例声明了下面两个属性,test1和test2在C++和QML中都可能被更改,当值更改时,触发valueChanged信号
请添加图片描述在QML中将输入框textEdit显示的内容设置为_SimpleTest.test1_SimpleTest.test1对应C++中的:

QString         test1           ()
{
    return _test1;
}

_test1定义如下,默认值为“A”,所以框中默认显示A

 QString     _test1="A";

请添加图片描述
在QML中通过_SimpleTest.test1对属性进行赋值,点击按钮后将test1赋值为“C”
请添加图片描述_SimpleTest.test1调用了C++的setTest1方法,在该方法中将形参(也就是“C”)赋值给_test1,同时触发valueChanged()信号,通知QML相关的属性已发生改变,来更新相关的显示。

void SimpleTest::setTest1(QString test)
{
_test1=test;
qDebug()<<test;
emit valueChanged();
}

所以本例中在点击按钮后,输入框textEdit显示的值将从“A”变为“C”

以单例形式访问:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面的步骤完成后,在qml中可以直接使用
在这里插入图片描述
在这里插入图片描述

4、信号与槽

信号(Signal)就是在特定情况下被发射的事件(如上一节的valueChanged()),槽函数相当于回调函数,在触发特定的信号后执行。

槽函数的声明
请添加图片描述
C++中连接信号与槽
一般在构造函数中连接。
请添加图片描述connect的参数的含义如下:

connect(
const QObject *sender, //信号发送者
const char *signal, //发送的信号
const QObject *receiver, //信号接收者
const char *method, //表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionType type = Qt::AutoConnection //连接方式,默认自动连接
)

本例中信号是valueChanged(),槽函数是_test()。
槽函数的实现如下:

void SimpleTest::_test()
{
    qDebug()<<"in C++ slot";
    emit _testChanged();
}

在槽函数中发射了_testChanged()信号。

QML中连接信号与槽
QML通过Connections类型连接信号与槽函数。本例如下:
请添加图片描述Connections分为两部分:一个是target属性,表示发出信号的对象。另一个是对应信号的槽函数。
使用示例如下:

Connections {
	target: targetA;
	function onAsignal1() {
		// 信号处理槽函数
	}
}

本例中信号发出的对象来自_SimpleTest,具体的信号为_testChanged(),在槽函数中将
_SimpleTest.test2设置为“c”

也就是说,点击按钮后,会触发valueChanged()信号,进入到C++的_test()槽函数中,发射_testChanged()信号,进入到QML的on_testChanged,将test2设置为“c”。

5、测试

编译QGC,进入下面的页面。
请添加图片描述点击“发送”按钮,原来的A和a会变成C和c。
请添加图片描述

八、添加QML和C++交互

九、MAVLINK的解析与发送

十、换地图

十一、添加自定义mavlink消息

十二、在主工具栏添加一个自定义图标

十三、解析自定义mavlink数据并在自定义图标上显示

十四、同时显示多机轨迹

十五、在地图上画一个点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3. 手势识别(LeNet、Vgg16、ResNet50)

手势识别 Show me your code1. 模型 model.py2. LeNet 实现手势识别&#xff08;详细&#xff09;2.1 数据打包2.2 搭建模型2.3 训练模型2.4 结果分析2.5 推理过程 3. Vgg16 手势识别4. ResNet50 手势识别 Show me your code 1. 模型 model.py import torch from torch impor…

基于单片机的智能台灯设计

摘 要 &#xff1a; 随着电子产品智能化的发展 &#xff0c; 生活中人们使用的照明工具也逐渐智能化 &#xff0c; 功能也越来越丰富 。 本文介绍了使用单片机进行可调光台灯系统的设计。 通过控制单片机输出高低电平的持续时间 &#xff0c; 从而改变 PWM 的占空比 &#…

el-tree树添加向下移动按钮,前端界面调整顺序

需求&#xff1a;树上添加向下按钮&#xff0c;再不调用接口的情况下&#xff0c;调整树的顺序结构 遇到的问题&#xff1a;第一次点击更新的&#xff0c;数据和视图是调整好的&#xff0c;再次点击页面调整顺序&#xff0c;只有数据被调整了&#xff0c;视图没有发生改变。 &…

【音视频之SDL2】bmp图片与绘制bmp

文章目录 前言BMP是什么SDL2绘制BMP的原理SDL2绘制BMP的流程SDL_LoadBMP作用函数原型参数返回值示例代码 SDL_BlitSurface作用函数原型参数返回值 示例代码效果展示总结 前言 在现代多媒体应用中&#xff0c;图像的处理和显示是非常重要的一部分。无论是在游戏开发还是在视频处…

Qt SQLite数据库编程学习总结

到此为止&#xff0c;就使用Qt进行SQLite数据库的操作&#xff0c;做一次总结 1. Qt中数据库操作的相关概念和类 Qt 数据库编程相关基本概念https://blog.csdn.net/castlooo/article/details/140497177 2.表的只读查询--QSqlQueryModel QSqlQueryModel单表查询的使用总结htt…

Nuxt.js 环境变量配置与使用

title: Nuxt.js 环境变量配置与使用 date: 2024/7/25 updated: 2024/7/25 author: cmdragon excerpt: 摘要&#xff1a;“该文探讨了Nuxt.js框架下环境变量配置的详细过程&#xff0c;涉及.env文件配置、运行时访问、安全性考量、在不同场景下的实践&#xff08;如Vue应用、…

华为OD机试 - 分配土地 (Java 2024年C卷D卷)

华为OD机试&#xff08;C卷D卷&#xff09;2024真题目录(Java & c & python) 题目描述 从前有个村庄&#xff0c;村民们喜欢在各种田地上插上小旗子&#xff0c;旗子上标识了各种不同的数字。 某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡…

本地电脑连接阿里云

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、方法1二、使用步骤1.引入库 前言 一、方法1 本地连接远程服务器的时候提示出现身份验证错误的几种解决方法 二、使用步骤 …

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外&#xff0c;还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相&#xff0c;成为赛场上另一道亮丽的风景线。 在新时代的浪潮中&#xff0c;中国制造业坚…

大道云行,位居中国分布式存储市场挑战者象限!

近日&#xff0c;中国市场咨询机构赛迪顾问发布了《中国分布式存储市场研究报告&#xff08;2024&#xff09;》&#xff08;简称“报告”&#xff09;。报告基于对中国分布式存储市场的深入研究&#xff0c;从发展现状、厂商竞争力、未来趋势入手&#xff0c;结合新环境、新规…

【RHCE】综合真机实验(shell完成)

目录 题目&#xff1a; 需求描述 实操 一、服务端&#xff08;servera&#xff09; 1.ip配置 2.更改主机名 3.创建本地仓库 4.DNS服务 1.下载软件包和防火墙允许 2.配置主配置文件 3.配置区域文件 1.named.exam 2.named.fangxiang 4.重启服务 5.验证结果&#x…

OCDM水下通信仿真代码

一、代码介绍 MATLAB实现&#xff0c;基于OCDM水下基带通信仿真&#xff0c;对比了不同子载波激活的下OCDM水下通信性能&#xff0c;引入多径信道&#xff0c;采用相同信道估计方法,并对比了不同子载波数下的MMSE均衡效果。 信道估计方法参考论文 Robust Channel Estimation …

一款基于Cortex-M0+的单片机音频编解码 - CJC2100

USBCodec芯片可以对数字音频信号进行多种处理&#xff0c;例如增加音量、均衡调节、音效处理等。这些处理可以通过耳机的控制按钮来实现&#xff0c;让用户可以根据自己的喜好来调整音频效果。USBCodec芯片还可以控制噪声和失真的水平&#xff0c;以提供高品质的音频输出。噪声…

单证不一致清关难题 | 国际贸易综合服务平台 | 箱讯科技

什么是单证一致&#xff1f; 单证一致出口方所提供的所有单据要严格符合进口方开证银行所开信用证的要求&#xff0c;或者说出口方制作和提供的所有与本项货物买卖有关的单据&#xff0c;与进口方申请开立的信用证对单据的要求完全吻合&#xff0c;没有矛盾。 添加图片注释&am…

batch norm记录

文章目录 概要整体架构流程训练阶段推理阶段模型中使用的注意事项 概要 面试百度时候被问到了BN 内部详细的训练阶段&#xff0c;推理阶段的计算过程。没回答好&#xff0c;来记录一下 推荐一下b站up: Enzo_Mi。视频做的确实不错 bn 讲解视频 整体架构流程 训练阶段 均值和标…

多模态大模型技术白皮书 2024

不同于语言大模型只对文本进行处理&#xff0c;多模态大模型将文本、语音、图像、视频等多模态数据联合起来进行学习。多模态大模型融合了多种感知途径与表达形态&#xff0c;能够同时处理和理解来自不同感知通道&#xff08;例如视觉、听觉、语言和触觉等&#xff09;的信息&a…

构建生成工具cmake的使用(1)

ps:本文是对cmake的基础讲解&#xff0c;掌握后解决70-80%情况是足以应对的&#xff0c;后续会对cmake有进阶内容。 一 前言 CMake 是一个工具&#xff0c;帮助开发者管理和自动化软件项目的构建过程。它使用一个叫做CMakeLists.txt 的文本文件来描述项目的组织结构、编译选项…

matlab实验:实验六MATLAB 数值计算与符号运算

题目1&#xff1a;&#xff08;线性方程组数值求解&#xff09; 1&#xff0e; 用不同的方法求解下面方程&#xff1a;&#xff08;方程原式参考 P369 实验 10&#xff0c;第 1 题&#xff09; 第 1 种&#xff0c;左除和求逆函数(inv) 第 2 种 &#xff0c; 用 符 号 运 算 的…

大语言模型-对比学习-Contrastive Learning

一、对比学习概念 对比学习是一种特殊的无监督学习方法。 旨在通过拉近相关样本的距离并且推远不相关样本的距离&#xff0c;来学习数据表示。 通常使用一种高自由度、自定义的规则来生成正负样本。在模型预训练中有着广泛的应用。 二、对比学习小案例 对比学习主要分为三个…

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍&#xff1a; Clipper2在Github上的地址&#xff1a;https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集&#xff08;Intersection&#xff09;、并集&#xff08;Union&#xff09;、差分&#xff08;Difference&…