QGC本開(kāi)發(fā)人員指南--轉(zhuǎn)自csdn

基于QGC3.3.0(翻譯的很爛)

本指南解釋了QGroundControl(QGC)如何在內(nèi)部工作,并提供了為項(xiàng)目貢獻(xiàn)代碼的指導(dǎo)原則。它旨在供開(kāi)發(fā)人員使用!

支持

本開(kāi)發(fā)人員指南最終將成為有關(guān)QGroundControl開(kāi)發(fā)信息的主要提供者。如果您發(fā)現(xiàn)它缺少有用信息或者有錯(cuò)誤的信息,請(qǐng)?zhí)岢?a target="_blank" rel="nofollow">問(wèn)題。

開(kāi)發(fā)問(wèn)題可以在QGroundControl Developer里討論或者通過(guò)QGroundControlGitter?Gitter的方式。

設(shè)計(jì)理念

QGC提供了一套單一的代碼庫(kù),可以在多個(gè)系統(tǒng)平臺(tái)以及不同尺寸和樣式的設(shè)備上運(yùn)行。

QGC用戶(hù)界面使用Qt QML實(shí)現(xiàn)。QML提供硬件加速功能,這是平板電腦或手機(jī)等低功耗設(shè)備的主要特征。QML還提供了一些功能,使我們能夠更輕松地創(chuàng)建單一用戶(hù)界面,從而適應(yīng)不同的屏幕尺寸和分辨率。

+

QGC用戶(hù)界面的目標(biāo)更多的是平板電腦+觸摸式UI,而不是基于桌面鼠標(biāo)的用戶(hù)界面。這使得單一的用戶(hù)界面更容易創(chuàng)建,因?yàn)槠桨咫娔X風(fēng)格的用戶(hù)界面也可以在桌面/筆記本電腦上正常工作。

通信流

設(shè)備自動(dòng)連接期間發(fā)生的高層通信流的描述。

LinkManager始終打開(kāi)一個(gè)UDP鏈接,等待Vehicle心跳

LinkManager檢測(cè)連接到計(jì)算機(jī)的新的已知設(shè)備(Pixhawk,SiK Radio,PX4 Flow)->創(chuàng)建一個(gè)連接到Vehicle的新SerialLink

字節(jié)通過(guò)Link?發(fā)送到MAVLinkProtocol

MAVLinkProtocol將字節(jié)轉(zhuǎn)換為MAVLink消息

如果該消息是HEARTBEAT,則通知MultiVehicleManager

HEARTBEAT通知到MultiVehicleManager 后,會(huì)根據(jù)HEARTBEAT消息中的信息創(chuàng)建一個(gè)新的Vehicle

Vehicle實(shí)例化與Vehicle類(lèi)型匹配的插件

與Vehicle相關(guān)聯(lián)的ParameterLoader將使用參數(shù)協(xié)議向Vehicle發(fā)送加載參數(shù)的指令PARAM_REQUEST_LIST

一旦參數(shù)加載完成,與Vehicle關(guān)聯(lián)的MissionManager將使用任務(wù)項(xiàng)協(xié)議從Vehicle中請(qǐng)求任務(wù)項(xiàng)。

參數(shù)加載完成后,VehicleComponents將在“設(shè)置”視圖中顯示其UI

固件插件

盡管MAVLink規(guī)范定義了與Vehicle進(jìn)行通信的標(biāo)準(zhǔn)通信協(xié)議。該規(guī)范有很多方面可供固件開(kāi)發(fā)人員解釋。因此,有很多情況下,與運(yùn)行一個(gè)固件的Vehicle的通信必須與運(yùn)行不同固件的Vehicle的通信略有不同,以完成相同的任務(wù)。每個(gè)固件也可以實(shí)現(xiàn)MAVLink命令集的子集。

另一個(gè)主要問(wèn)題是MAVLink規(guī)范不包括Vehicle配置或通用參數(shù)集。由于這個(gè)與Vehicle配置有關(guān)的所有代碼最終都是固件特定的。另外,任何必須引用特定參數(shù)的代碼也是固件特定的。

鑒于固件實(shí)現(xiàn)之間的所有這些差異,創(chuàng)建一個(gè)單一的地面站應(yīng)用程序可能非常困難,該應(yīng)用程序可以支持每個(gè)應(yīng)用程序,而無(wú)需將代碼庫(kù)降級(jí)為基于Vehicle固件使用的固件隨處可見(jiàn)的大量if / then / else語(yǔ)句。

QGC使用插件架構(gòu)將固件特定代碼與所有固件通用的代碼隔離開(kāi)來(lái)。

FirmwarePluginManager,F(xiàn)irmwarePlugin

類(lèi)層次結(jié)構(gòu)

LinkManager,LinkInterface

QGC中的“鏈接”是與vehicle?的特定類(lèi)型的通信管道,例如串口或WiFi上的UDP。所有鏈接的基類(lèi)是LinkInterface。每個(gè)鏈接運(yùn)行在它自己的線程上并發(fā)送字節(jié)到MAVLinkProtocol。

該LinkManager對(duì)象跟蹤系統(tǒng)中所有打開(kāi)的鏈接。LinkManager還通過(guò)串口和UDP鏈接管理自動(dòng)連接。

MAVLinkProtocol

系統(tǒng)中只有一個(gè)MAVLinkProtocol對(duì)象。它的任務(wù)是從一個(gè)鏈接獲取傳入的字節(jié)并將它們轉(zhuǎn)換為MAVLink消息。MAVLink HEARTBEAT消息被發(fā)送到MultiVehicleManager。所有MAVLink消息都被發(fā)送到與鏈路關(guān)聯(lián)的vehicle。

MultiVehicleManager

系統(tǒng)中有一個(gè)MultiVehicleManager對(duì)象。當(dāng)它在以前沒(méi)有看到的鏈接上收到HEARTBEAT時(shí),它會(huì)創(chuàng)建一個(gè)Vehicle對(duì)象。`MultiVehicleManager還可以跟蹤系統(tǒng)中的所有vehicle,并處理從一輛活動(dòng)的vehicle到另一個(gè)的切換,并正確處理正在移除的vehicle。

Vehicle

Vehicle對(duì)象是QGC代碼通過(guò)其與物理設(shè)備通信的主接口。

注意:還有一個(gè)與每個(gè)Vehicle相關(guān)的UAS對(duì)象,這是一個(gè)棄用的類(lèi),正在慢慢地逐步淘汰,所有的功能都轉(zhuǎn)移到Vehicle類(lèi)。這里不應(yīng)該添加新的代碼。

FirmwarePlugin,F(xiàn)irmwarePluginManager

FirmwarePlugin類(lèi)被用作固件插件的基類(lèi)。固件插件包含特定于固件的代碼,這樣Vehicle對(duì)象就是干凈的,支持UI的單個(gè)標(biāo)準(zhǔn)接口。

FirmwarePluginManager是一個(gè)工廠類(lèi),它根據(jù)vehicle的MAV_AUTOPILOT / MAV_TYPE組合創(chuàng)建一個(gè)FirmwarePlugin實(shí)例。

用戶(hù)界面設(shè)計(jì)

QGC中UI設(shè)計(jì)的主要模式是用QML編寫(xiě)的UI頁(yè)面,多次與用C ++編寫(xiě)的定制“控制器”進(jìn)行通信。類(lèi)似MVC的設(shè)計(jì)模式。

QML代碼通過(guò)以下機(jī)制綁定到與系統(tǒng)相關(guān)的信息:

自定義控制器

QGroundControl提供訪問(wèn)活動(dòng)Vehicle對(duì)象的全局對(duì)象

FactSystem提供對(duì)參數(shù)的訪問(wèn),并且在某些情況下提供自定義Facts

注意:由于QGC中使用的QML的復(fù)雜性以及它依賴(lài)與C ++對(duì)象的通信來(lái)驅(qū)動(dòng)ui,所以不可能使用Qt提供的QML Designer來(lái)編輯QML。

多設(shè)備設(shè)計(jì)模式

QGroundControl被設(shè)計(jì)用于使用鼠標(biāo)和觸摸在多種設(shè)備類(lèi)型上運(yùn)行,從臺(tái)式機(jī)到筆記本電腦到平板電腦,再到小型手機(jī)大小的屏幕。以下是QGC如何做的說(shuō)明及其背后的原理。

高效的1人開(kāi)發(fā)團(tuán)隊(duì)

QGC開(kāi)發(fā)用于解決此問(wèn)題的設(shè)計(jì)模式基于快速開(kāi)發(fā)新功能開(kāi)發(fā),并允許代碼庫(kù)由一個(gè)非常小的團(tuán)隊(duì)(假設(shè)1位開(kāi)發(fā)人員為默認(rèn)開(kāi)發(fā)團(tuán)隊(duì)規(guī)模)進(jìn)行測(cè)試和維護(hù)。實(shí)現(xiàn)這一目標(biāo)的模式非常嚴(yán)格,因?yàn)椴蛔裱鼤?huì)導(dǎo)致更慢的開(kāi)發(fā)時(shí)間和更低的質(zhì)量。

支持這個(gè)1人開(kāi)發(fā)團(tuán)隊(duì)的概念會(huì)導(dǎo)致一些艱難的決定,而不是每個(gè)人都會(huì)為此感到高興。但它確實(shí)導(dǎo)致QGC在許多操作系統(tǒng)和外形因素上使用單個(gè)代碼庫(kù)進(jìn)行發(fā)布。這是他們其他大多數(shù)其他地面站無(wú)法實(shí)現(xiàn)的。

你問(wèn)的貢獻(xiàn)者呢?QGC有相當(dāng)數(shù)量的貢獻(xiàn)者。他們難道不能幫助我們將事情從這個(gè)1人開(kāi)發(fā)團(tuán)隊(duì)的概念中移除?是的,QGC有不少貢獻(xiàn)者。但不幸的是,他們隨著時(shí)間的推移而來(lái)。當(dāng)他們離開(kāi)時(shí),他們提供的代碼仍然必須保留。因此,您可以回到1人開(kāi)發(fā)團(tuán)隊(duì)的概念,這個(gè)概念大部分是過(guò)去三年發(fā)展過(guò)程中的平均值。

目標(biāo)設(shè)備

QGC UI設(shè)計(jì)的優(yōu)先目標(biāo)是平板電腦,無(wú)論是從觸摸角度還是屏幕尺寸角度考慮(例如10英寸Samsung Galaxy標(biāo)簽)。其他設(shè)備類(lèi)型和尺寸可能會(huì)因此決定而犧牲一些視覺(jué)效果和/或可用性。基于優(yōu)先級(jí)決定的當(dāng)前訂單是平板電腦,筆記本電腦,臺(tái)式機(jī),手機(jī)(任何小屏幕)。

手機(jī)大小的屏幕支持

在上面指定的情況下,此時(shí)較小的手機(jī)大小的屏幕是QGC的最低優(yōu)先級(jí)。更多的重點(diǎn)放在使飛行視圖更加實(shí)用的主動(dòng)飛行級(jí)別顯示上。設(shè)置和航跡規(guī)劃等視圖不太關(guān)注。這些具體的視圖經(jīng)過(guò)測(cè)試可以在小屏幕上實(shí)用,但使用起來(lái)可能很痛苦。

使用的開(kāi)發(fā)工具

Qt Layout controls?

QGC沒(méi)有針對(duì)不同屏幕尺寸和/或形狀因素的不同編碼的UI。一般來(lái)說(shuō),它使用QML Layout功能來(lái)重排一組QML UI代碼以適應(yīng)不同的外觀因素。在某些情況下,它在小屏幕尺寸上提供較少的細(xì)節(jié)以使其適合。但這是一個(gè)簡(jiǎn)單的可見(jiàn)性模式。

FactSystem

QGC內(nèi)部是一個(gè)系統(tǒng),用于管理系統(tǒng)內(nèi)的所有單個(gè)數(shù)據(jù)。這個(gè)數(shù)據(jù)模型是他們連接到控件。

嚴(yán)重依賴(lài)可重用控件

QGC UI是從一組可重用控件和UI元素開(kāi)發(fā)而來(lái)的。這樣,添加到可重用控件的任何新功能現(xiàn)在都可以在整個(gè)UI中使用。這些可重復(fù)使用的控件還連接到FactSystem Facts,然后自動(dòng)提供適當(dāng)?shù)挠脩?hù)界面。

這種設(shè)計(jì)模式的缺點(diǎn)

QGC用戶(hù)界面最終成為臺(tái)式機(jī)/筆記本電腦/平板電腦/手機(jī)的混合風(fēng)格。因此,不一定是看起來(lái)或感覺(jué)像它被優(yōu)化到任何這些。

鑒于目標(biāo)設(shè)備優(yōu)先級(jí)列表以及QGC傾向于重新布局相同UI元素以適應(yīng)不同外形因素的事實(shí),您會(huì)發(fā)現(xiàn)隨著距離優(yōu)先級(jí)目標(biāo)越遠(yuǎn),這種混合方法越嚴(yán)重。因此,小型手機(jī)大小的屏幕在可用性方面遭遇最嚴(yán)重的打擊

在某些情況下,QGC可重用控件集可能無(wú)法提供絕對(duì)最佳UI。但它仍用于防止創(chuàng)建額外的維護(hù)表面區(qū)域。

由于QGC UI對(duì)所有操作系統(tǒng)使用相同的UI代碼,因此QGC不遵循操作系統(tǒng)本身指定的UI設(shè)計(jì)準(zhǔn)則。它具有自己的視覺(jué)風(fēng)格,這是從每個(gè)操作系統(tǒng)挑選出來(lái)的混合物。因此,UI在所有操作系統(tǒng)上的外觀和工作方式都基本相同。再一次,這意味著例如在Android上運(yùn)行的QGC不一定會(huì)看起來(lái)像一個(gè)Android應(yīng)用程序。或者在iPhone上運(yùn)行的QGC不會(huì)像大多數(shù)其他iPhone應(yīng)用程序那樣看起來(lái)或工作。這就是說(shuō)QGC的視覺(jué)/功能風(fēng)格對(duì)于這些操作系統(tǒng)用戶(hù)應(yīng)該是可以理解的。

這種設(shè)計(jì)模式的優(yōu)點(diǎn)

設(shè)計(jì)新功能所需的時(shí)間更少,因?yàn)槭褂么嘶旌夏P秃涂刂萍M(jìn)行UI編碼一次。布局回流在Qt QML中是非常有用的,一旦習(xí)慣了它,它就成為第二性質(zhì)。

因?yàn)楣δ艽a在所有形狀因子中都是相同的,所以只能在平臺(tái)上對(duì)一塊UI進(jìn)行功能測(cè)試。只有布局流程必須在多個(gè)設(shè)備上進(jìn)行可視化檢查,但使用移動(dòng)模擬器很容易完成。在大多數(shù)情況下,這是所需要的:

使用桌面版本,調(diào)整窗口大小以測(cè)試回流。通常也會(huì)覆蓋平板電腦大小的屏幕。

使用移動(dòng)模擬器可視化驗(yàn)證手機(jī)大小的屏幕。在OSX XCode iPhone模擬器上工作得很好。

以上所有內(nèi)容對(duì)于保持假想的1人開(kāi)發(fā)團(tuán)隊(duì)的高效和高質(zhì)量至關(guān)重要

未來(lái)發(fā)展方向

提高手機(jī)(小屏幕)級(jí)別的優(yōu)先級(jí),使其與平板電腦相當(dāng)。目前的想法是,直到3.3版本發(fā)布時(shí)間框架(當(dāng)前正在開(kāi)發(fā)之后發(fā)布)才會(huì)發(fā)生。

字體和調(diào)色板

QGC有一套標(biāo)準(zhǔn)的字體和調(diào)色板,應(yīng)該被所有用戶(hù)界面使用。

importQGroundControl.Palette1.0

importQGroundControl.ScreenTools1.0

QGCPalette

此項(xiàng)目公開(kāi)QGC調(diào)色板。這個(gè)調(diào)色板有兩個(gè)變種:明亮和黑暗。調(diào)色板適用于戶(hù)外使用,黑色調(diào)色板適用于室內(nèi)。通常,您不應(yīng)該直接為UI指定顏色,您應(yīng)該始終使用調(diào)色板中的顏色。如果您不遵循此規(guī)則,則您創(chuàng)建的用戶(hù)界面將無(wú)法從明暗風(fēng)格中更改。

QGCMapPalette

地圖調(diào)色板用于繪制地圖的顏色。由于地圖樣式不同,特別是衛(wèi)星和街道,您需要使用不同的顏色來(lái)清晰地繪制它們。衛(wèi)星地圖需要看到較淺的顏色,而街道地圖需要較暗的顏色才能看到。該QGCMapPalette項(xiàng)目為此提供了一組顏色,以及通過(guò)地圖在淺色和深色之間切換的功能。

ScreenTools

ScreenTools項(xiàng)目提供了可用于指定字體大小的值。它還提供屏幕大小和QGC是否在移動(dòng)設(shè)備上運(yùn)行的信息。

用戶(hù)界面控件

QGC為構(gòu)建用戶(hù)界面提供了一套基礎(chǔ)控件。一般而言,它們傾向于Qt支持的基礎(chǔ)QML控件之上的薄層,這與QGC調(diào)色板相關(guān)。

importQGroundControl.Controls1.0

以下控件是標(biāo)準(zhǔn)Qt QML控件的QGC變體。它們提供與相應(yīng)的Qt控件相同的功能,除了它們是使用QGC調(diào)色板繪制的。

QGCButton

QGCCheckBox

QGCColoredImage

QGCComboBox

QGCFlickable

QGCLabel

QGCMovableItem

QGCRadioButton

QGCSlider

QGCTextField

QGC控制

這些自定義控件是QGC獨(dú)有的,用于創(chuàng)建標(biāo)準(zhǔn)的UI元素。

DropButton - RoundButton,它在點(diǎn)擊時(shí)刪除一組選項(xiàng)。示例是平面視圖中的同步按鈕。

ExclusiveGroupItem - 對(duì)支持QML ExclusiveGroup概念的自定義控件使用aa base Item。

QGCView - 系統(tǒng)中所有頂級(jí)視圖的基本控制。為FactPanels提供支持并顯示QGCViewDialogs和QGCViewMessages。

QGCViewDialog - 從QGCView右側(cè)彈出的對(duì)話(huà)框。您可以指定對(duì)話(huà)框的接受/拒絕按鈕以及對(duì)話(huà)框內(nèi)容。用法的例子是當(dāng)你點(diǎn)擊一個(gè)參數(shù)時(shí),它會(huì)打開(kāi)值編輯器對(duì)話(huà)框。

QGCViewMessage - QGCViewDialog的簡(jiǎn)化版本,它允許您指定按鈕和簡(jiǎn)單的文本消息。

QGCViewPanel - QGCView中的主視圖內(nèi)容。

RoundButton - 使用圖像作為內(nèi)容的圓形按鈕控件。

SetupPage - 所有Setupvehicle?

組件頁(yè)面的基礎(chǔ)控件。

提供標(biāo)題,說(shuō)明和組件頁(yè)面內(nèi)容區(qū)域。

Fact System?

Fact System?提供了一組標(biāo)準(zhǔn)化和簡(jiǎn)化QGC用戶(hù)界面創(chuàng)建的功能

Fact

fact表示系統(tǒng)內(nèi)的單個(gè)值

FactMetaData

這FactMetaData與每個(gè)fact都有關(guān)聯(lián)。它提供了Fact的詳細(xì)信息,以推動(dòng)自動(dòng)用戶(hù)界面的生成和驗(yàn)證

Fact Controls?

Fact Control是一個(gè)QML用戶(hù)界面控件,它連接到一個(gè)Fact,并且FactMetaData提供一個(gè)控件給用戶(hù)修改/顯示與Fact相關(guān)的值。

FactGroup

頂級(jí)視圖

本節(jié)包含有關(guān)頂級(jí)視圖代碼的主題:配置,設(shè)置,計(jì)劃和飛行。

配置視圖

頂級(jí)QML代碼是AppSettings.qml

每個(gè)按鈕加載一個(gè)單獨(dú)的QML頁(yè)面

設(shè)置視圖

在SetupView.qml中實(shí)現(xiàn)的頂級(jí)QML代碼

固定的一組按鈕/頁(yè)面:摘要,固件

按鈕/頁(yè)面的其余部分來(lái)自AutoPilotPlugin VehicleComponent列表

計(jì)劃視圖

頂級(jí)QML代碼位于MissionEditor.qml中

主要的可視化UI是一個(gè)FlightMap控件

QML與MissionController(C ++)通信,該視圖提供了任務(wù)項(xiàng)目數(shù)據(jù)和方法的視圖

飛行視圖

頂級(jí)QML代碼位于FlightDisplayView.qml中

QML代碼與MissionController(C ++)進(jìn)行通信以用于任務(wù)顯示

儀器小部件與活動(dòng)的Vehicle對(duì)象進(jìn)行通信

兩個(gè)主要的頁(yè)面是:

FlightDisplayViewMap

FlightDisplayViewVideo

文件格式

本節(jié)包含有關(guān)QGroundControl使用/支持的文件格式的主題

參數(shù)文件格式

# Onboard parameters for Vehicle 1

#

# # Vehicle-Id Component-Id Name Value Type

11ACRO_LOCKING02

11ACRO_PITCH_RATE1804

11ACRO_ROLL_RATE1804

11ADSB_ENABLE02

以上是帶有四個(gè)參數(shù)的參數(shù)文件的示例。該文件可以包含所需的參數(shù)。

注釋以#開(kāi)頭。

這個(gè)標(biāo)題:# MAV ID COMPONENT ID PARAM NAME VALUE描述了每一行的格式:

Vehicle-Id?vehicle ID

Component-Id?參數(shù)的組件ID

Name?參數(shù)名稱(chēng)

Value?參數(shù)值

Type使用MAVLink?MAV_PARAM_TYPE_*枚舉值的參數(shù)類(lèi)型

參數(shù)文件包含單個(gè)vehicle的參數(shù)。它可以包含該vehicle內(nèi)多個(gè)組件的參數(shù)。

飛行計(jì)劃文件格式

除非另有說(shuō)明,否則單位為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": {

...

},

}

在上面,您可以看到計(jì)劃文件的頂級(jí)格式。計(jì)劃文件以JSON文件格式存儲(chǔ),并包含與飛行計(jì)劃相關(guān)的任務(wù),地理圍欄和集會(huì)點(diǎn)。

鍵描述

文件類(lèi)型必須是“計(jì)劃”。

版該文件的版本。當(dāng)前版本是1。

地面站創(chuàng)建此文件的地面站的名稱(chēng)。

任務(wù)與此飛行計(jì)劃相關(guān)的任務(wù)。

柵欄(可選的)

rallyPoints(集會(huì))(可選的)

任務(wù)對(duì)象

以下值是必需的:

鍵描述

版任務(wù)對(duì)象的版本。當(dāng)前版本是2。

firmwareType此任務(wù)創(chuàng)建的固件類(lèi)型使用MAVLink MAV_AUTOPILOT枚舉值。

飛機(jī)類(lèi)型此任務(wù)創(chuàng)建的車(chē)型使用MAVLink MAV_TYPE枚舉值。

cruiseSpeed?

hoverSpeed?

項(xiàng)目與任務(wù)相關(guān)的任務(wù)項(xiàng)目對(duì)象列表。

plannedHomePosition當(dāng)您編輯任務(wù)時(shí),您計(jì)劃在地圖上顯示的主要位置。數(shù)組的值是緯度,經(jīng)度和高度。

任務(wù)項(xiàng)目 -?SimpleItem

一個(gè)簡(jiǎn)單的項(xiàng)目代表單個(gè)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

任務(wù)項(xiàng)目 -?ComplexItem

一個(gè)復(fù)雜的項(xiàng)目是將多個(gè)MISSION_ITEMS作為單個(gè)實(shí)體處理的更高級(jí)別的封裝。

{

"complexItemType":"survey",

"type":"ComplexItem",

"version":3,

...

},

復(fù)雜的項(xiàng)目有兩個(gè)與它們相關(guān)的附加值:

鍵描述

complexItemType指定復(fù)雜項(xiàng)目的類(lèi)型。QGroundControl目前支持以下類(lèi)型:survey,fwLandingPattern

版指定此復(fù)雜項(xiàng)目的版本。

DO_JUMP任務(wù)項(xiàng)的特殊處理

由于DO_JUMP命令要求您指定要跳轉(zhuǎn)到的序列號(hào),并且任務(wù)文件格式不指定序列號(hào),所以需要進(jìn)行特殊處理。

首先,您必須為要跳轉(zhuǎn)到的任務(wù)項(xiàng)目分配一個(gè)唯一標(biāo)識(shí)符:

{

...

"doJumpId":100

}

的doJumpId可以是大于0的任何值,且必須唯一地識(shí)別目標(biāo)DO_JUMP。

然后在實(shí)際的DO_JUMP任務(wù)項(xiàng)目中,您可以在MISSION_ITEM.param1值中引用此唯一ID:

{

...

"command":177,

"params": [

100,

...

],

...

},

加載任務(wù)時(shí),將確定并填寫(xiě)實(shí)際的DO_JUMP序列號(hào)。

復(fù)雜項(xiàng)目 - 勘測(cè)

調(diào)查在任務(wù)中的多邊形區(qū)域上創(chuàng)建了一條飛行路線。

{

"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被表示為存儲(chǔ)在items數(shù)組中的JSON對(duì)象。它存儲(chǔ)與調(diào)查相關(guān)的所有元數(shù)據(jù)。它不存儲(chǔ)調(diào)查中的各個(gè)航點(diǎn)。這些是在QGroundControl加載任務(wù)時(shí)生成的。

鍵描述

相機(jī)指定與用于調(diào)查的相機(jī)關(guān)聯(lián)的值的對(duì)象。僅在必要時(shí)manualGrid為false。

cameraTrigger指定是否應(yīng)以指定的cameraTriggerDistance時(shí)間間隔觸發(fā)相機(jī)。

complexItemType將這個(gè)復(fù)雜的任務(wù)項(xiàng)目標(biāo)識(shí)為一個(gè)survey。

fixedValueIsAltitude指定在修改Survey用戶(hù)界面的其他值時(shí)是否保持Altitude不變。僅供QGroundControl UI使用。

格指定與測(cè)量網(wǎng)格關(guān)聯(lián)的值的對(duì)象。

manualGridtrue:網(wǎng)格值由用戶(hù)手動(dòng)指定false:網(wǎng)格值基于camera對(duì)象指定的相機(jī)設(shè)置。

多邊形表示多邊形調(diào)查區(qū)域的多邊形數(shù)組。每個(gè)點(diǎn)都是多邊形頂點(diǎn)的緯度和經(jīng)度對(duì)。

類(lèi)型指定這個(gè)項(xiàng)目是一個(gè)ComplexItem。

版調(diào)查復(fù)雜任務(wù)項(xiàng)目格式的版本號(hào)。當(dāng)前版本是3。

網(wǎng)格對(duì)象

該grid對(duì)象指定與調(diào)查網(wǎng)格關(guān)聯(lián)的值。

"grid": {

"altitude":50,

"angle":0,

"relativeAltitude":true,

"spacing":30,

"turnAroundDistance":0

},

鍵描述

高度網(wǎng)格內(nèi)所有橫斷面航點(diǎn)的高度。

角度橫斷面路徑的角度(度)。

relativeAltitudetrue:altitude是相對(duì)于家庭的,false:altitude是AMSL

間距每個(gè)樣線之間的間距。

turnAroundDistance在轉(zhuǎn)向下一個(gè)橫斷面之前飛過(guò)多邊形邊的距離。

相機(jī)對(duì)象

該camera對(duì)象指定與用于調(diào)查的相機(jī)相關(guān)的值。該對(duì)象僅在manualGridis時(shí)是必需的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

},

鍵描述

長(zhǎng)焦點(diǎn)相機(jī)鏡頭的焦距,單位為毫米。

groundResolution目標(biāo)地面分辨率,單位為cm / px。

imageFrontalOverlap正面圖像重疊的百分比。

imageSideOverlap側(cè)面圖像重疊的百分比。

名稱(chēng)正在使用的照相機(jī)的名稱(chēng)。應(yīng)該對(duì)應(yīng)于QGroundControl已知的攝像頭之一。使用"Custom Camera Grid"自定義攝像頭規(guī)格,

orientationLandscapetrue:照相機(jī)橫向安裝在車(chē)輛上,false:照相機(jī)以縱向方向安裝在車(chē)輛上

resolutionHeight,resolutionWidth圖像像素分辨率。

sensorHeight,sensorWidth傳感器尺寸以毫米為單位。

集會(huì)點(diǎn)文件格式

{

"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允許您生成可重播的簡(jiǎn)單MAVLink數(shù)據(jù)包日志(使用QGroundControl)以再次觀看任務(wù)以進(jìn)行分析。

格式是二進(jìn)制的:

字節(jié)1-8:Unix時(shí)代以來(lái)的時(shí)間戳,以微秒為無(wú)符號(hào)64位整數(shù)

字節(jié)9-271:MAVLink數(shù)據(jù)包(最大數(shù)據(jù)包長(zhǎng)度為263字節(jié),并非所有字節(jié)都必須是實(shí)際數(shù)據(jù),數(shù)據(jù)包可能較短,包括數(shù)據(jù)包開(kāi)始標(biāo)志)

調(diào)試

要檢查您的數(shù)據(jù),請(qǐng)?jiān)谑M(jìn)制編輯器中打開(kāi)您的書(shū)面文件。你應(yīng)該在8字節(jié)后看到0x55。前8個(gè)字節(jié)也應(yīng)該轉(zhuǎn)換為有效的時(shí)間戳,所以要么接近于零,要么圍繞數(shù)字1294571828792000(這是當(dāng)前Unix紀(jì)元時(shí)間戳,以微秒為單位)。

用于記錄MAVLink的C ++ Sketch

下面的代碼片段顯示了如何使用C ++標(biāo)準(zhǔn)庫(kù)中的C ++流實(shí)現(xiàn)日志記錄。

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

開(kāi)發(fā)者工具

QGroundControl在調(diào)試版本中提供了許多工具。這些簡(jiǎn)化了常見(jiàn)的開(kāi)發(fā)人員任務(wù),包括設(shè)置用于測(cè)試的模擬連接以及通過(guò)MAVLink訪問(wèn)System Shell。

工具包括:

模擬鏈接?- 創(chuàng)建和停止多個(gè)模擬vehicle鏈接。

模擬鏈接

模擬鏈接允許您在QGroundControl調(diào)試版本中創(chuàng)建和停止多個(gè)模擬(模擬)vehicle的鏈接。

該模擬不支持飛行,但確實(shí)可以輕松測(cè)試:

任務(wù)上傳/下載

查看和更改參數(shù)

測(cè)試大多數(shù)設(shè)置頁(yè)面

多個(gè)vehicle用戶(hù)界面

它對(duì)于任務(wù)上傳/下載的單元測(cè)試錯(cuò)誤情況特別有用。

使用模擬鏈接

要使用模擬鏈接:

通過(guò)構(gòu)建源代碼創(chuàng)建一個(gè)調(diào)試版本。

通過(guò)選擇頂部工具欄中的應(yīng)用程序設(shè)置圖標(biāo)訪問(wèn)模擬鏈接,然后選擇邊欄中的模擬鏈接:

點(diǎn)擊面板上的按鈕可創(chuàng)建關(guān)聯(lián)類(lèi)型的vehicle鏈接。

每次點(diǎn)擊一個(gè)按鈕,都會(huì)創(chuàng)建一個(gè)新的連接。

當(dāng)有多個(gè)連接時(shí),多vehicle用戶(hù)界面將出現(xiàn)。

點(diǎn)擊停止一個(gè)模擬鏈接停止當(dāng)前活動(dòng)的vehicle。

使用模擬鏈接與使用任何其他vehicle差不多,除了模擬不允許飛行。

自定義命令小部件

自定義命令的widget功能允許開(kāi)發(fā)加載QML的UI在運(yùn)行時(shí)(而不必重新生成QGroundControl或了解其內(nèi)部結(jié)構(gòu))。一次可以加載一個(gè)小部件,在QGroundControl重新啟動(dòng)之間將被“記住”?。

開(kāi)發(fā)人員可以使用QML語(yǔ)言的任何功能以及任何暴露于QML的vehiccle功能(包括許多有用的“標(biāo)準(zhǔn)vehicle信息”,但不是任意的MAVLink流量或自定義類(lèi)型)。

該功能主要用于創(chuàng)建簡(jiǎn)單的UI以發(fā)送自定義命令和更改參數(shù)。

此功能僅在桌面版本(Windows,Linux,Mac OS)上受支持。雖然它出現(xiàn)在最終用戶(hù)的構(gòu)建中,但僅供開(kāi)發(fā)人員使用。

如何加載自定義小部件

加載一個(gè)小部件:

從任何屏幕打開(kāi)菜單窗口小部件>自定義命令。

該自定義命令將顯示選擇對(duì)話(huà)框。

選擇加載自定義Qml文件...,然后使用文件選擇器找到用于小部件加載的QML文件(下圖顯示了示例小部件)

重新啟動(dòng)QGroundControl以激活小部件。

您可以按重置以刪除當(dāng)前的小部件或加載自定義Qml文件...以選擇一個(gè)新的小部件。如果QML文件無(wú)效,您將收到警告,如下所示。

創(chuàng)建一個(gè)Widget QML文件

開(kāi)發(fā)人員可以使用QML語(yǔ)言的任何特性。以下部分顯示了解決主要(預(yù)期)用例的情況:

創(chuàng)建一個(gè)按鈕發(fā)送自定義命令(MAVLink?COMMAND_LONG消息)

定義一個(gè)參數(shù)編輯器

即使按下重置(這些緩存),您也必須重新啟動(dòng)QGroundControl才能獲取QML文件中的任何更改。

發(fā)送自定義命令

該QGCButton控件由...提供QGroundControl.Controls。它是標(biāo)準(zhǔn)QML Button元素的包裝,它使用默認(rèn)的QGC字體和調(diào)色板。

該按鈕連接到controller.sendCommand()發(fā)送MAVLink?COMMAND_LONG消息的方法(在這種情況下,設(shè)置原始位置)。

QGCButton{text:"Set Home to current position"http:// 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)}

參數(shù)編輯器

該FactTextField控件由Fact System(GroundControl.FactControls)提供。它是QML TextField元素的一個(gè)包裝,它允許你直接綁定到任何參數(shù)。當(dāng)您單擊輸入或單擊字段時(shí),參數(shù)會(huì)自動(dòng)更改。

目前沒(méi)有值驗(yàn)證。因此,您可能會(huì)通過(guò)將參數(shù)設(shè)置為不正確的值來(lái)使您的車(chē)輛墜毀。驗(yàn)證將在未來(lái)進(jìn)行。

引用參數(shù)時(shí)要非常小心。如果您指定了一個(gè)不存在的參數(shù),QGroundControl將發(fā)出警告并關(guān)閉。

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文件結(jié)合了上一節(jié)中介紹的控件。

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"http:// 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")}}}

命令行選項(xiàng)

您可以使用命令行選項(xiàng)啟動(dòng)QGroundControl。這些用于啟用日志記錄,運(yùn)行單元測(cè)試以及模擬不同的主機(jī)環(huán)境進(jìn)行測(cè)試。

使用選項(xiàng)啟動(dòng)QGroundControl

您需要打開(kāi)命令提示符或終端,將目錄更改為qgroundcontrol.exe的存儲(chǔ)位置,然后運(yùn)行它。下面顯示了每個(gè)平臺(tái)(使用該--logging:full選項(xiàng)):

Windows命令提示符:

cd"\Program Files (x86)\qgroundcontrol"

qgroundcontrol --logging:full

OSX終端應(yīng)用程序(應(yīng)用程序/實(shí)用程序):

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

./qgroundcontrol --logging:full

Linux終端:

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

選項(xiàng)

下表列出了選項(xiàng)/命令行參數(shù)。

選項(xiàng)描述

--clear-settings清除應(yīng)用程序設(shè)置(將QGroundControl恢復(fù)為默認(rèn)設(shè)置)。

--logging:full打開(kāi)完整日志記錄。請(qǐng)參閱控制臺(tái)記錄

--logging:full,LinkManagerVerboseLog,ParameterLoaderLog打開(kāi)完整日志記錄并關(guān)閉以下列出的以逗號(hào)分隔的日志記錄選項(xiàng)。

--logging:LinkManagerLog,ParameterLoaderLog打開(kāi)指定的逗號(hào)分隔記錄選項(xiàng)

--unittest:name(僅限D(zhuǎn)ebug版本)運(yùn)行指定的單元測(cè)試。離開(kāi):name去運(yùn)行所有測(cè)試。

--unittest-stress:name(僅限D(zhuǎn)ebug版本)連續(xù)運(yùn)行指定的單元測(cè)試20次。離開(kāi):姓名以運(yùn)行所有測(cè)試。

--fake-mobile模擬在移動(dòng)設(shè)備上運(yùn)行。

--test-high-dpi模擬在高DPI設(shè)備上運(yùn)行QGroundControl。

筆記:

+

單元測(cè)試自動(dòng)包含在調(diào)試版本中(作為QGroundControl的一部分)。QGroundControl在單元測(cè)試的控制下運(yùn)行(它不能正常啟動(dòng))。

代碼提交

本節(jié)包含有關(guān)貢獻(xiàn)代碼的主題,包括編碼風(fēng)格,測(cè)試和請(qǐng)求格式。

QGroundControl(QGC)作為Apache 2.0和GPLv3雙重許可。所有捐款都必須在兩個(gè)許可下進(jìn)行。

編碼風(fēng)格

高級(jí)風(fēng)格信息:

選項(xiàng)卡擴(kuò)展到4個(gè)空格

Pascal / CamelCase命名約定

樣式本身是以下示例文件中的文檔:

CodingStyle.cc

CodingStyle.h

CodingStyle.qml

單元測(cè)試

QGC包含一組必須通過(guò)的單元測(cè)試,才能通過(guò)拉取請(qǐng)求考慮更改。為QGC增加新的復(fù)雜子系統(tǒng)應(yīng)該包括一個(gè)相應(yīng)的新單元測(cè)試來(lái)測(cè)試它。

您可以使用--unittest命令行選項(xiàng)從命令行運(yùn)行單元測(cè)試,該選項(xiàng)將運(yùn)行所有測(cè)試。您可以通過(guò)指定它來(lái)運(yùn)行特定的單元測(cè)試:--unittest:RadioConfigTest。

單元測(cè)試的完整列表可以在UnitTestList.cc中找到。

Pull Requests

所有的請(qǐng)求都通過(guò)QGC CI構(gòu)建系統(tǒng),構(gòu)建發(fā)布和調(diào)試版本。如果有編譯器警告,構(gòu)建將失敗。單元測(cè)試也針對(duì)支持的操作系統(tǒng)調(diào)試版本運(yùn)行。

許可證

QGroundControl許可證

QGroundControl(QGC)作為Apache 2.0和GPLv3雙重許可。所有捐款都必須在兩個(gè)許可下進(jìn)行。代碼庫(kù)的用戶(hù)可以根據(jù)任何許可證免費(fèi)使用它。

QGroundControl許可排除了任何copyleft(例如GPL)許可代碼的重復(fù)使用。所有貢獻(xiàn)必須是原始的或來(lái)自兼容許可證(BSD 2/3條款,MIT,Apache 2.0)。

為了能夠通過(guò)iOS和Android應(yīng)用商店提供QGroundControl并提供開(kāi)源社區(qū)選擇,雙重方法是必要的。

Apache 2.0許可證

Apache 2.0的許可證是一個(gè)許可證,它允許QGC待建并在任何環(huán)境中使用,包括專(zhuān)用應(yīng)用程序。它允許QGC為移動(dòng)應(yīng)用程序商店構(gòu)建。使用Apache 2.0構(gòu)建商業(yè)Qt許可證是必需的。

GPL v3許可證

GPL v3的許可是一種強(qiáng)的copyleft許可證。在根據(jù)此許可證構(gòu)建QGC時(shí),可以使用Qt的開(kāi)源版本。我們的許可授予許可使用許可的更高版本,但是,貢獻(xiàn)必須在3.0以下。

文檔,圖稿,圖像

QGroundControl文檔,藝術(shù)作品和圖像在CC BY 4.0下獲得許可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 專(zhuān)業(yè)考題類(lèi)型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚(yú)閱讀 9,051評(píng)論 0 13
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,124評(píng)論 25 708
  • <芳齡27||不迷茫 正青春> 壹 2017年,我二十七歲。 過(guò)了二十五歲以后,當(dāng)別人問(wèn)我多大的時(shí)候,我一般說(shuō),九...
    Micco伍語(yǔ)閱讀 381評(píng)論 0 0
  • 說(shuō)在前面的話(huà):聲音的練習(xí)沒(méi)有捷徑,正文我會(huì)詳細(xì)介紹聲音的進(jìn)階過(guò)程,但請(qǐng)?jiān)试S我在前面念叨兩句。 《綻放聲音》算是我嚴(yán)...
    HI趣浪閱讀 3,185評(píng)論 0 6
  • 【課后實(shí)踐】這是2018年2月6日崔律“時(shí)間記錄app”系列第2講的課后實(shí)踐。實(shí)踐事項(xiàng)(Do):1、調(diào)整你的類(lèi)別 ...
    央曰閱讀 120評(píng)論 0 0