QGC本开发人员指南--转自csdn

基于QGC3.3.0(翻译的很烂)

本指南解释了QGroundControl(QGC)如何在内部工作,并提供了为项目贡献代码的指导原则。它旨在供开发人员使用!

支持

本开发人员指南最终将成为有关QGroundControl开发信息的主要提供者。如果您发现它缺少有用信息或者有错误的信息,请提出问题

开发问题可以在QGroundControl Developer里讨论或者通过QGroundControlGitter Gitter的方式。

设计理念

QGC提供了一套单一的代码库,可以在多个系统平台以及不同尺寸和样式的设备上运行。

QGC用户界面使用Qt QML实现。QML提供硬件加速功能,这是平板电脑或手机等低功耗设备的主要特征。QML还提供了一些功能,使我们能够更轻松地创建单一用户界面,从而适应不同的屏幕尺寸和分辨率。

+

QGC用户界面的目标更多的是平板电脑+触摸式UI,而不是基于桌面鼠标的用户界面。这使得单一的用户界面更容易创建,因为平板电脑风格的用户界面也可以在桌面/笔记本电脑上正常工作。

通信流

设备自动连接期间发生的高层通信流的描述。

LinkManager始终打开一个UDP链接,等待Vehicle心跳

LinkManager检测连接到计算机的新的已知设备(Pixhawk,SiK Radio,PX4 Flow)->创建一个连接到Vehicle的新SerialLink

字节通过Link 发送到MAVLinkProtocol

MAVLinkProtocol将字节转换为MAVLink消息

如果该消息是HEARTBEAT,则通知MultiVehicleManager

HEARTBEAT通知到MultiVehicleManager 后,会根据HEARTBEAT消息中的信息创建一个新的Vehicle

Vehicle实例化与Vehicle类型匹配的插件

与Vehicle相关联的ParameterLoader将使用参数协议向Vehicle发送加载参数的指令PARAM_REQUEST_LIST

一旦参数加载完成,与Vehicle关联的MissionManager将使用任务项协议从Vehicle中请求任务项。

参数加载完成后,VehicleComponents将在“设置”视图中显示其UI

固件插件

尽管MAVLink规范定义了与Vehicle进行通信的标准通信协议。该规范有很多方面可供固件开发人员解释。因此,有很多情况下,与运行一个固件的Vehicle的通信必须与运行不同固件的Vehicle的通信略有不同,以完成相同的任务。每个固件也可以实现MAVLink命令集的子集。

另一个主要问题是MAVLink规范不包括Vehicle配置或通用参数集。由于这个与Vehicle配置有关的所有代码最终都是固件特定的。另外,任何必须引用特定参数的代码也是固件特定的。

鉴于固件实现之间的所有这些差异,创建一个单一的地面站应用程序可能非常困难,该应用程序可以支持每个应用程序,而无需将代码库降级为基于Vehicle固件使用的固件随处可见的大量if / then / else语句。

QGC使用插件架构将固件特定代码与所有固件通用的代码隔离开来。

FirmwarePluginManager,FirmwarePlugin

类层次结构

LinkManager,LinkInterface

QGC中的“链接”是与vehicle 的特定类型的通信管道,例如串口或WiFi上的UDP。所有链接的基类是LinkInterface。每个链接运行在它自己的线程上并发送字节到MAVLinkProtocol。

该LinkManager对象跟踪系统中所有打开的链接。LinkManager还通过串口和UDP链接管理自动连接。

MAVLinkProtocol

系统中只有一个MAVLinkProtocol对象。它的任务是从一个链接获取传入的字节并将它们转换为MAVLink消息。MAVLink HEARTBEAT消息被发送到MultiVehicleManager。所有MAVLink消息都被发送到与链路关联的vehicle。

MultiVehicleManager

系统中有一个MultiVehicleManager对象。当它在以前没有看到的链接上收到HEARTBEAT时,它会创建一个Vehicle对象。`MultiVehicleManager还可以跟踪系统中的所有vehicle,并处理从一辆活动的vehicle到另一个的切换,并正确处理正在移除的vehicle。

Vehicle

Vehicle对象是QGC代码通过其与物理设备通信的主接口。

注意:还有一个与每个Vehicle相关的UAS对象,这是一个弃用的类,正在慢慢地逐步淘汰,所有的功能都转移到Vehicle类。这里不应该添加新的代码。

FirmwarePlugin,FirmwarePluginManager

FirmwarePlugin类被用作固件插件的基类。固件插件包含特定于固件的代码,这样Vehicle对象就是干净的,支持UI的单个标准接口。

FirmwarePluginManager是一个工厂类,它根据vehicle的MAV_AUTOPILOT / MAV_TYPE组合创建一个FirmwarePlugin实例。

用户界面设计

QGC中UI设计的主要模式是用QML编写的UI页面,多次与用C ++编写的定制“控制器”进行通信。类似MVC的设计模式。

QML代码通过以下机制绑定到与系统相关的信息:

自定义控制器

QGroundControl提供访问活动Vehicle对象的全局对象

FactSystem提供对参数的访问,并且在某些情况下提供自定义Facts

注意:由于QGC中使用的QML的复杂性以及它依赖与C ++对象的通信来驱动ui,所以不可能使用Qt提供的QML Designer来编辑QML。

多设备设计模式

QGroundControl被设计用于使用鼠标和触摸在多种设备类型上运行,从台式机到笔记本电脑到平板电脑,再到小型手机大小的屏幕。以下是QGC如何做的说明及其背后的原理。

高效的1人开发团队

QGC开发用于解决此问题的设计模式基于快速开发新功能开发,并允许代码库由一个非常小的团队(假设1位开发人员为默认开发团队规模)进行测试和维护。实现这一目标的模式非常严格,因为不遵循它会导致更慢的开发时间和更低的质量。

支持这个1人开发团队的概念会导致一些艰难的决定,而不是每个人都会为此感到高兴。但它确实导致QGC在许多操作系统和外形因素上使用单个代码库进行发布。这是他们其他大多数其他地面站无法实现的。

你问的贡献者呢?QGC有相当数量的贡献者。他们难道不能帮助我们将事情从这个1人开发团队的概念中移除 是的,QGC有不少贡献者。但不幸的是,他们随着时间的推移而来。当他们离开时,他们提供的代码仍然必须保留。因此,您可以回到1人开发团队的概念,这个概念大部分是过去三年发展过程中的平均值。

目标设备

QGC UI设计的优先目标是平板电脑,无论是从触摸角度还是屏幕尺寸角度考虑(例如10英寸Samsung Galaxy标签)。其他设备类型和尺寸可能会因此决定而牺牲一些视觉效果和/或可用性。基于优先级决定的当前订单是平板电脑,笔记本电脑,台式机,手机(任何小屏幕)。

手机大小的屏幕支持

在上面指定的情况下,此时较小的手机大小的屏幕是QGC的最低优先级。更多的重点放在使飞行视图更加实用的主动飞行级别显示上。设置和航迹规划等视图不太关注。这些具体的视图经过测试可以在小屏幕上实用,但使用起来可能很痛苦。

使用的开发工具

Qt Layout controls 

QGC没有针对不同屏幕尺寸和/或形状因素的不同编码的UI。一般来说,它使用QML Layout功能来重排一组QML UI代码以适应不同的外观因素。在某些情况下,它在小屏幕尺寸上提供较少的细节以使其适合。但这是一个简单的可见性模式。

FactSystem

QGC内部是一个系统,用于管理系统内的所有单个数据。这个数据模型是他们连接到控件。

严重依赖可重用控件

QGC UI是从一组可重用控件和UI元素开发而来的。这样,添加到可重用控件的任何新功能现在都可以在整个UI中使用。这些可重复使用的控件还连接到FactSystem Facts,然后自动提供适当的用户界面。

这种设计模式的缺点

QGC用户界面最终成为台式机/笔记本电脑/平板电脑/手机的混合风格。因此,不一定是看起来或感觉像它被优化到任何这些。

鉴于目标设备优先级列表以及QGC倾向于重新布局相同UI元素以适应不同外形因素的事实,您会发现随着距离优先级目标越远,这种混合方法越严重。因此,小型手机大小的屏幕在可用性方面遭遇最严重的打击

在某些情况下,QGC可重用控件集可能无法提供绝对最佳UI。但它仍用于防止创建额外的维护表面区域。

由于QGC UI对所有操作系统使用相同的UI代码,因此QGC不遵循操作系统本身指定的UI设计准则。它具有自己的视觉风格,这是从每个操作系统挑选出来的混合物。因此,UI在所有操作系统上的外观和工作方式都基本相同。再一次,这意味着例如在Android上运行的QGC不一定会看起来像一个Android应用程序。或者在iPhone上运行的QGC不会像大多数其他iPhone应用程序那样看起来或工作。这就是说QGC的视觉/功能风格对于这些操作系统用户应该是可以理解的。

这种设计模式的优点

设计新功能所需的时间更少,因为使用此混合模型和控制集进行UI编码一次。布局回流在Qt QML中是非常有用的,一旦习惯了它,它就成为第二性质。

因为功能代码在所有形状因子中都是相同的,所以只能在平台上对一块UI进行功能测试。只有布局流程必须在多个设备上进行可视化检查,但使用移动模拟器很容易完成。在大多数情况下,这是所需要的:

使用桌面版本,调整窗口大小以测试回流。通常也会覆盖平板电脑大小的屏幕。

使用移动模拟器可视化验证手机大小的屏幕。在OSX XCode iPhone模拟器上工作得很好。

以上所有内容对于保持假想的1人开发团队的高效和高质量至关重要

未来发展方向

提高手机(小屏幕)级别的优先级,使其与平板电脑相当。目前的想法是,直到3.3版本发布时间框架(当前正在开发之后发布)才会发生。

字体和调色板

QGC有一套标准的字体和调色板,应该被所有用户界面使用。

importQGroundControl.Palette1.0

importQGroundControl.ScreenTools1.0

QGCPalette

此项目公开QGC调色板。这个调色板有两个变种:明亮和黑暗。调色板适用于户外使用,黑色调色板适用于室内。通常,您不应该直接为UI指定颜色,您应该始终使用调色板中的颜色。如果您不遵循此规则,则您创建的用户界面将无法从明暗风格中更改。

QGCMapPalette

地图调色板用于绘制地图的颜色。由于地图样式不同,特别是卫星和街道,您需要使用不同的颜色来清晰地绘制它们。卫星地图需要看到较浅的颜色,而街道地图需要较暗的颜色才能看到。该QGCMapPalette项目为此提供了一组颜色,以及通过地图在浅色和深色之间切换的功能。

ScreenTools

ScreenTools项目提供了可用于指定字体大小的值。它还提供屏幕大小和QGC是否在移动设备上运行的信息。

用户界面控件

QGC为构建用户界面提供了一套基础控件。一般而言,它们倾向于Qt支持的基础QML控件之上的薄层,这与QGC调色板相关。

importQGroundControl.Controls1.0

以下控件是标准Qt QML控件的QGC变体。它们提供与相应的Qt控件相同的功能,除了它们是使用QGC调色板绘制的。

QGCButton

QGCCheckBox

QGCColoredImage

QGCComboBox

QGCFlickable

QGCLabel

QGCMovableItem

QGCRadioButton

QGCSlider

QGCTextField

QGC控制

这些自定义控件是QGC独有的,用于创建标准的UI元素。

DropButton - RoundButton,它在点击时删除一组选项。示例是平面视图中的同步按钮。

ExclusiveGroupItem - 对支持QML ExclusiveGroup概念的自定义控件使用aa base Item。

QGCView - 系统中所有顶级视图的基本控制。为FactPanels提供支持并显示QGCViewDialogs和QGCViewMessages。

QGCViewDialog - 从QGCView右侧弹出的对话框。您可以指定对话框的接受/拒绝按钮以及对话框内容。用法的例子是当你点击一个参数时,它会打开值编辑器对话框。

QGCViewMessage - QGCViewDialog的简化版本,它允许您指定按钮和简单的文本消息。

QGCViewPanel - QGCView中的主视图内容。

RoundButton - 使用图像作为内容的圆形按钮控件。

SetupPage - 所有Setupvehicle 

组件页面的基础控件。

提供标题,说明和组件页面内容区域。

Fact System 

Fact System 提供了一组标准化和简化QGC用户界面创建的功能

Fact

fact表示系统内的单个值

FactMetaData

这FactMetaData与每个fact都有关联。它提供了Fact的详细信息,以推动自动用户界面的生成和验证

Fact Controls 

Fact Control是一个QML用户界面控件,它连接到一个Fact,并且FactMetaData提供一个控件给用户修改/显示与Fact相关的值。

FactGroup

顶级视图

本节包含有关顶级视图代码的主题:配置,设置,计划和飞行。

配置视图

顶级QML代码是AppSettings.qml

每个按钮加载一个单独的QML页面

设置视图

在SetupView.qml中实现的顶级QML代码

固定的一组按钮/页面:摘要,固件

按钮/页面的其余部分来自AutoPilotPlugin VehicleComponent列表

计划视图

顶级QML代码位于MissionEditor.qml中

主要的可视化UI是一个FlightMap控件

QML与MissionController(C ++)通信,该视图提供了任务项目数据和方法的视图

飞行视图

顶级QML代码位于FlightDisplayView.qml中

QML代码与MissionController(C ++)进行通信以用于任务显示

仪器小部件与活动的Vehicle对象进行通信

两个主要的页面是:

FlightDisplayViewMap

FlightDisplayViewVideo

文件格式

本节包含有关QGroundControl使用/支持的文件格式的主题

参数文件格式

# Onboard parameters for Vehicle 1

#

# # Vehicle-Id Component-Id Name Value Type

11ACRO_LOCKING02

11ACRO_PITCH_RATE1804

11ACRO_ROLL_RATE1804

11ADSB_ENABLE02

以上是带有四个参数的参数文件的示例。该文件可以包含所需的参数。

注释以#开头。

这个标题:# MAV ID COMPONENT ID PARAM NAME VALUE描述了每一行的格式:

Vehicle-Id vehicle ID

Component-Id 参数的组件ID

Name 参数名称

Value 参数值

Type使用MAVLink MAV_PARAM_TYPE_*枚举值的参数类型

参数文件包含单个vehicle的参数。它可以包含该vehicle内多个组件的参数。

飞行计划文件格式

除非另有说明,否则单位为m.

{

"fileType":"Plan",

"version":1

"groundStation":"QGroundControl",

"mission": {

"version":2

"firmwareType":12,

"vehicleType":2,

"cruiseSpeed":15,

"hoverSpeed":5,

"plannedHomePosition": [

47.632939716176864,

-122.08905141,

40

],

"items": [

...

],

},

"geoFence": {

...

},

"rallyPoints": {

...

},

}

在上面,您可以看到计划文件的顶级格式。计划文件以JSON文件格式存储,并包含与飞行计划相关的任务,地理围栏和集会点。

键描述

文件类型必须是“计划”。

版该文件的版本。当前版本是1。

地面站创建此文件的地面站的名称。

任务与此飞行计划相关的任务。

栅栏(可选的)

rallyPoints(集会)(可选的)

任务对象

以下值是必需的:

键描述

版任务对象的版本。当前版本是2。

firmwareType此任务创建的固件类型使用MAVLink MAV_AUTOPILOT枚举值。

飞机类型此任务创建的车型使用MAVLink MAV_TYPE枚举值。

cruiseSpeed 

hoverSpeed 

项目与任务相关的任务项目对象列表。

plannedHomePosition当您编辑任务时,您计划在地图上显示的主要位置。数组的值是纬度,经度和高度。

任务项目 - SimpleItem

一个简单的项目代表单个MAVLink MISSION_ITEM命令。

{

"autoContinue":true,

"command":22,

"frame":2,

"params": [

0,

0,

0,

0,

47.633127690000002,

-122.08867133,

50

],

"type":"SimpleItem"

},

在这些值SimpleItem直接映射到在值MISSION_ITEM

在这些值SimpleItem直接映射到在值MISSION_ITEM

键描述

AUTOCONTINUEMISSION_ITEM.autoContinue

命令MISSION_ITEM.command

帧MISSION_ITEM.frame

PARAMSMISSION_ITEM.param1,2,3,4,X,Y,Z

任务项目 - ComplexItem

一个复杂的项目是将多个MISSION_ITEMS作为单个实体处理的更高级别的封装。

{

"complexItemType":"survey",

"type":"ComplexItem",

"version":3,

...

},

复杂的项目有两个与它们相关的附加值:

键描述

complexItemType指定复杂项目的类型。QGroundControl目前支持以下类型:survey,fwLandingPattern

版指定此复杂项目的版本。

DO_JUMP任务项的特殊处理

由于DO_JUMP命令要求您指定要跳转到的序列号,并且任务文件格式不指定序列号,所以需要进行特殊处理。

首先,您必须为要跳转到的任务项目分配一个唯一标识符:

{

...

"doJumpId":100

}

的doJumpId可以是大于0的任何值,且必须唯一地识别目标DO_JUMP。

然后在实际的DO_JUMP任务项目中,您可以在MISSION_ITEM.param1值中引用此唯一ID:

{

...

"command":177,

"params": [

100,

...

],

...

},

加载任务时,将确定并填写实际的DO_JUMP序列号。

复杂项目 - 勘测

调查在任务中的多边形区域上创建了一条飞行路线。

{

"camera": {

"focalLength":16,

"groundResolution":3,

"imageFrontalOverlap":10,

"imageSideOverlap":10,

"name":"Sony ILCE-QX1",

"orientationLandscape":true,

"resolutionHeight":3632,

"resolutionWidth":5456,

"sensorHeight":15.4,

"sensorWidth":23.199999999999999

},

"cameraTrigger":true,

"cameraTriggerDistance":25,

"complexItemType":"survey",

"fixedValueIsAltitude":false,

"grid": {

"altitude":50,

"angle":0,

"relativeAltitude":true,

"spacing":30,

"turnAroundDistance":0

},

"manualGrid":true,

"polygon": [

[

47.633933816132817,

-122.08937942845

],

[

47.634139864633021,

-122.08781838280333

],

[

47.633395194285789,

-122.08872496945037

]

],

"type":"ComplexItem",

"version":3

}

Survey被表示为存储在items数组中的JSON对象。它存储与调查相关的所有元数据。它不存储调查中的各个航点。这些是在QGroundControl加载任务时生成的。

键描述

相机指定与用于调查的相机关联的值的对象。仅在必要时manualGrid为false。

cameraTrigger指定是否应以指定的cameraTriggerDistance时间间隔触发相机。

complexItemType将这个复杂的任务项目标识为一个survey。

fixedValueIsAltitude指定在修改Survey用户界面的其他值时是否保持Altitude不变。仅供QGroundControl UI使用。

格指定与测量网格关联的值的对象。

manualGridtrue:网格值由用户手动指定false:网格值基于camera对象指定的相机设置。

多边形表示多边形调查区域的多边形数组。每个点都是多边形顶点的纬度和经度对。

类型指定这个项目是一个ComplexItem。

版调查复杂任务项目格式的版本号。当前版本是3。

网格对象

该grid对象指定与调查网格关联的值。

"grid": {

"altitude":50,

"angle":0,

"relativeAltitude":true,

"spacing":30,

"turnAroundDistance":0

},

键描述

高度网格内所有横断面航点的高度。

角度横断面路径的角度(度)。

relativeAltitudetrue:altitude是相对于家庭的,false:altitude是AMSL

间距每个样线之间的间距。

turnAroundDistance在转向下一个横断面之前飞过多边形边的距离。

相机对象

该camera对象指定与用于调查的相机相关的值。该对象仅在manualGridis时是必需的false。

"camera": {

"focalLength":16,

"groundResolution":3,

"imageFrontalOverlap":10,

"imageSideOverlap":10,

"name":"Sony ILCE-QX1",

"orientationLandscape":true,

"resolutionHeight":3632,

"resolutionWidth":5456,

"sensorHeight":15.4,

"sensorWidth":23.199999999999999

},

键描述

长焦点相机镜头的焦距,单位为毫米。

groundResolution目标地面分辨率,单位为cm / px。

imageFrontalOverlap正面图像重叠的百分比。

imageSideOverlap侧面图像重叠的百分比。

名称正在使用的照相机的名称。应该对应于QGroundControl已知的摄像头之一。使用"Custom Camera Grid"自定义摄像头规格,

orientationLandscapetrue:照相机横向安装在车辆上,false:照相机以纵向方向安装在车辆上

resolutionHeight,resolutionWidth图像像素分辨率。

sensorHeight,sensorWidth传感器尺寸以毫米为单位。

集会点文件格式

{

"fileType":"RallyPoints",

"groundStation":"QGroundControl",

"points": [

[

47.634309760000001,

-122.08936869999999,

50

],

[

47.634244700000004,

-122.08700836,

50

],

[

47.632784270000002,

-122.08712101,

50

],

[

47.632769809999999,

-122.08939552,

50

]

],

"version":1

}

GeoFence文件格式

{

"fileType":"GeoFence",

"groundStation":"QGroundControl",

"parameters": [

{

"compId":1,

"name":"FENCE_ENABLE",

"value":1

},

{

"compId":1,

"name":"FENCE_TYPE",

"value":4

},

{

"compId":1,

"name":"FENCE_ACTION",

"value":0

},

{

"compId":1,

"name":"FENCE_ALT_MAX",

"value":0

},

{

"compId":1,

"name":"FENCE_RADIUS",

"value":0

},

{

"compId":1,

"name":"FENCE_MARGIN",

"value":0

}

],

"polygon": [

[

47.634457973002796,

-122.08958864075316

],

[

47.634371216366716,

-122.08675086361541

],

[

47.632610748511105,

-122.08689033848418

],

[

47.632610748511105,

-122.08967983585967

]

],

"version":1

}

MAVLink日志格式

QGroundControl允许您生成可重播的简单MAVLink数据包日志(使用QGroundControl)以再次观看任务以进行分析。

格式是二进制的:

字节1-8:Unix时代以来的时间戳,以微秒为无符号64位整数

字节9-271:MAVLink数据包(最大数据包长度为263字节,并非所有字节都必须是实际数据,数据包可能较短,包括数据包开始标志)

调试

要检查您的数据,请在十六进制编辑器中打开您的书面文件。你应该在8字节后看到0x55。前8个字节也应该转换为有效的时间戳,所以要么接近于零,要么围绕数字1294571828792000(这是当前Unix纪元时间戳,以微秒为单位)。

用于记录MAVLink的C ++ Sketch

下面的代码片段显示了如何使用C ++标准库中的C ++流实现日志记录。

//write into mavlink logfile

constintlen = MAVLINK_MAX_PACKET_LEN+sizeof(uint64_t);

uint8_tbuf[len];

uint64_ttime = getSystemTimeUsecs();

memcpy(buf, (void*)&time,sizeof(uint64_t));

mavlink_msg_to_send_buffer(buf+sizeof(uint64_t), msg);

mavlinkFile << buf << flush;

开发者工具

QGroundControl在调试版本中提供了许多工具。这些简化了常见的开发人员任务,包括设置用于测试的模拟连接以及通过MAVLink访问System Shell。

工具包括:

模拟链接 - 创建和停止多个模拟vehicle链接。

模拟链接

模拟链接允许您在QGroundControl调试版本中创建和停止多个模拟(模拟)vehicle的链接。

该模拟不支持飞行,但确实可以轻松测试:

任务上传/下载

查看和更改参数

测试大多数设置页面

多个vehicle用户界面

它对于任务上传/下载的单元测试错误情况特别有用。

使用模拟链接

要使用模拟链接:

通过构建源代码创建一个调试版本。

通过选择顶部工具栏中的应用程序设置图标访问模拟链接,然后选择边栏中的模拟链接:

点击面板上的按钮可创建关联类型的vehicle链接。

每次点击一个按钮,都会创建一个新的连接。

当有多个连接时,多vehicle用户界面将出现。

点击停止一个模拟链接停止当前活动的vehicle。

使用模拟链接与使用任何其他vehicle差不多,除了模拟不允许飞行。

自定义命令小部件

自定义命令的widget功能允许开发加载QML的UI在运行时(而不必重新生成QGroundControl或了解其内部结构)。一次可以加载一个小部件,在QGroundControl重新启动之间将被“记住” 。

开发人员可以使用QML语言的任何功能以及任何暴露于QML的vehiccle功能(包括许多有用的“标准vehicle信息”,但不是任意的MAVLink流量或自定义类型)。

该功能主要用于创建简单的UI以发送自定义命令和更改参数。

此功能仅在桌面版本(Windows,Linux,Mac OS)上受支持。虽然它出现在最终用户的构建中,但仅供开发人员使用。

如何加载自定义小部件

加载一个小部件:

从任何屏幕打开菜单窗口小部件>自定义命令。

该自定义命令将显示选择对话框。

选择加载自定义Qml文件...,然后使用文件选择器找到用于小部件加载的QML文件(下图显示了示例小部件)

重新启动QGroundControl以激活小部件。

您可以按重置以删除当前的小部件或加载自定义Qml文件...以选择一个新的小部件。如果QML文件无效,您将收到警告,如下所示。

创建一个Widget QML文件

开发人员可以使用QML语言的任何特性。以下部分显示了解决主要(预期)用例的情况:

创建一个按钮发送自定义命令(MAVLink COMMAND_LONG消息)

定义一个参数编辑器

即使按下重置(这些缓存),您也必须重新启动QGroundControl才能获取QML文件中的任何更改。

发送自定义命令

该QGCButton控件由...提供QGroundControl.Controls。它是标准QML Button元素的包装,它使用默认的QGC字体和调色板。

该按钮连接到controller.sendCommand()发送MAVLink COMMAND_LONG消息的方法(在这种情况下,设置原始位置)。

QGCButton{text:"Set Home to current position"// Arguments to CustomCommandWidgetController::sendCommand (MAVLink COMMAND_LONG)//  command id//  component id//  confirmation//  param 1-7onClicked: controller.sendCommand(179,50,0,1,0,0,0,0,0,0)}

参数编辑器

该FactTextField控件由Fact System(GroundControl.FactControls)提供。它是QML TextField元素的一个包装,它允许你直接绑定到任何参数。当您单击输入或单击字段时,参数会自动更改。

目前没有值验证。因此,您可能会通过将参数设置为不正确的值来使您的车辆坠毁。验证将在未来进行。

引用参数时要非常小心。如果您指定了一个不存在的参数,QGroundControl将发出警告并关闭。

FactTextField{// The -1 signals default component id.// You can replace it with a specific component id if you likefact: controller.getParameterFact(-1,"MAV_SYS_ID")}

示例QML文件

下面的示例自定义命令窗口小部件QML文件结合了上一节中介绍的控件。

import QtQuick 2.2import QGroundControl.Controls      1.0import QGroundControl.FactSystem    1.0import QGroundControl.FactControls  1.0import QGroundControl.Palette      1.0import QGroundControl.ScreenTools  1.0import QGroundControl.Controllers  1.0Rectangle{anchors.fill:parentcolor:          qgcPal.windowCustomCommandWidgetController{id:        controllerfactPanel:  panel}QGCPalette{id: qgcPal;colorGroupEnabled: enabled }Column{spacing: ScreenTools.defaultFontPixelHeightQGCButton{text:"Set Home to current position"// Arguments to CustomCommandWidgetController::sendCommand (MAVLink COMMAND_LONG)//  command id//  component id//  confirmation//  param 1-7onClicked: controller.sendCommand(179,50,0,1,0,0,0,0,0,0)}// The FactTextField control is bound to the specified parameter. Note that there is no validation.FactTextField{// The -1 signals default component id.// You can replace it with a specific component id if you likefact: controller.getParameterFact(-1,"MAV_SYS_ID")}}}

命令行选项

您可以使用命令行选项启动QGroundControl。这些用于启用日志记录,运行单元测试以及模拟不同的主机环境进行测试。

使用选项启动QGroundControl

您需要打开命令提示符或终端,将目录更改为qgroundcontrol.exe的存储位置,然后运行它。下面显示了每个平台(使用该--logging:full选项):

Windows命令提示符:

cd"\Program Files (x86)\qgroundcontrol"

qgroundcontrol --logging:full

OSX终端应用程序(应用程序/实用程序):

cd/Applications/qgroundcontrol.app/Contents/MacOS/

./qgroundcontrol --logging:full

Linux终端:

./qgroundcontrol-start.sh --logging:full

选项

下表列出了选项/命令行参数。

选项描述

--clear-settings清除应用程序设置(将QGroundControl恢复为默认设置)。

--logging:full打开完整日志记录。请参阅控制台记录

--logging:full,LinkManagerVerboseLog,ParameterLoaderLog打开完整日志记录并关闭以下列出的以逗号分隔的日志记录选项。

--logging:LinkManagerLog,ParameterLoaderLog打开指定的逗号分隔记录选项

--unittest:name(仅限Debug版本)运行指定的单元测试。离开:name去运行所有测试。

--unittest-stress:name(仅限Debug版本)连续运行指定的单元测试20次。离开:姓名以运行所有测试。

--fake-mobile模拟在移动设备上运行。

--test-high-dpi模拟在高DPI设备上运行QGroundControl。

笔记:

+

单元测试自动包含在调试版本中(作为QGroundControl的一部分)。QGroundControl在单元测试的控制下运行(它不能正常启动)。

代码提交

本节包含有关贡献代码的主题,包括编码风格,测试和请求格式。

QGroundControl(QGC)作为Apache 2.0和GPLv3双重许可。所有捐款都必须在两个许可下进行。

编码风格

高级风格信息:

选项卡扩展到4个空格

Pascal / CamelCase命名约定

样式本身是以下示例文件中的文档:

CodingStyle.cc

CodingStyle.h

CodingStyle.qml

单元测试

QGC包含一组必须通过的单元测试,才能通过拉取请求考虑更改。为QGC增加新的复杂子系统应该包括一个相应的新单元测试来测试它。

您可以使用--unittest命令行选项从命令行运行单元测试,该选项将运行所有测试。您可以通过指定它来运行特定的单元测试:--unittest:RadioConfigTest。

单元测试的完整列表可以在UnitTestList.cc中找到。

Pull Requests

所有的请求都通过QGC CI构建系统,构建发布和调试版本。如果有编译器警告,构建将失败。单元测试也针对支持的操作系统调试版本运行。

许可证

QGroundControl许可证

QGroundControl(QGC)作为Apache 2.0和GPLv3双重许可。所有捐款都必须在两个许可下进行。代码库的用户可以根据任何许可证免费使用它。

QGroundControl许可排除了任何copyleft(例如GPL)许可代码的重复使用。所有贡献必须是原始的或来自兼容许可证(BSD 2/3条款,MIT,Apache 2.0)。

为了能够通过iOS和Android应用商店提供QGroundControl并提供开源社区选择,双重方法是必要的。

Apache 2.0许可证

Apache 2.0的许可证是一个许可证,它允许QGC待建并在任何环境中使用,包括专用应用程序。它允许QGC为移动应用程序商店构建。使用Apache 2.0构建商业Qt许可证是必需的。

GPL v3许可证

GPL v3的许可是一种强的copyleft许可证。在根据此许可证构建QGC时,可以使用Qt的开源版本。我们的许可授予许可使用许可的更高版本,但是,贡献必须在3.0以下。

文档,图稿,图像

QGroundControl文档,艺术作品和图像在CC BY 4.0下获得许可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,892评论 0 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • <芳龄27||不迷茫 正青春> 壹 2017年,我二十七岁。 过了二十五岁以后,当别人问我多大的时候,我一般说,九...
    Micco伍语阅读 335评论 0 0
  • 说在前面的话:声音的练习没有捷径,正文我会详细介绍声音的进阶过程,但请允许我在前面念叨两句。 《绽放声音》算是我严...
    HI趣浪阅读 3,116评论 0 6
  • 【课后实践】这是2018年2月6日崔律“时间记录app”系列第2讲的课后实践。实践事项(Do):1、调整你的类别 ...
    央曰阅读 84评论 0 0