基于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)
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)連接。
系統(tǒng)中只有一個(gè)MAVLinkProtocol對(duì)象。它的任務(wù)是從一個(gè)鏈接獲取傳入的字節(jié)并將它們轉(zhuǎn)換為MAVLink消息。MAVLink HEARTBEAT消息被發(fā)送到MultiVehicleManager。所有MAVLink消息都被發(fā)送到與鏈路關(guān)聯(lián)的vehicle。
系統(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í)例。
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ō)明及其背后的原理。
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ò)程中的平均值。
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ī)(任何小屏幕)。
在上面指定的情況下,此時(shí)較小的手機(jī)大小的屏幕是QGC的最低優(yōu)先級(jí)。更多的重點(diǎn)放在使飛行視圖更加實(shí)用的主動(dòng)飛行級(jí)別顯示上。設(shè)置和航跡規(guī)劃等視圖不太關(guān)注。這些具體的視圖經(jīng)過(guò)測(cè)試可以在小屏幕上實(shí)用,但使用起來(lái)可能很痛苦。
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)性模式。
QGC內(nèi)部是一個(gè)系統(tǒng),用于管理系統(tǒng)內(nèi)的所有單個(gè)數(shù)據(jù)。這個(gè)數(shù)據(jù)模型是他們連接到控件。
QGC UI是從一組可重用控件和UI元素開(kāi)發(fā)而來(lái)的。這樣,添加到可重用控件的任何新功能現(xiàn)在都可以在整個(gè)UI中使用。這些可重復(fù)使用的控件還連接到FactSystem Facts,然后自動(dòng)提供適當(dāng)?shù)挠脩?hù)界面。
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ì)新功能所需的時(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)重要
提高手機(jī)(小屏幕)級(jí)別的優(yōu)先級(jí),使其與平板電腦相當(dāng)。目前的想法是,直到3.3版本發(fā)布時(shí)間框架(當(dāng)前正在開(kāi)發(fā)之后發(fā)布)才會(huì)發(fā)生。
QGC有一套標(biāo)準(zhǔn)的字體和調(diào)色板,應(yīng)該被所有用戶(hù)界面使用。
importQGroundControl.Palette1.0
importQGroundControl.ScreenTools1.0
此項(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)格中更改。
地圖調(diào)色板用于繪制地圖的顏色。由于地圖樣式不同,特別是衛(wèi)星和街道,您需要使用不同的顏色來(lái)清晰地繪制它們。衛(wèi)星地圖需要看到較淺的顏色,而街道地圖需要較暗的顏色才能看到。該QGCMapPalette項(xiàng)目為此提供了一組顏色,以及通過(guò)地圖在淺色和深色之間切換的功能。
ScreenTools項(xiàng)目提供了可用于指定字體大小的值。它還提供屏幕大小和QGC是否在移動(dòng)設(shè)備上運(yùn)行的信息。
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獨(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)的值。
本節(jié)包含有關(guān)頂級(jí)視圖代碼的主題:配置,設(shè)置,計(jì)劃和飛行。
頂級(jí)QML代碼是AppSettings.qml
每個(gè)按鈕加載一個(gè)單獨(dú)的QML頁(yè)面
在SetupView.qml中實(shí)現(xiàn)的頂級(jí)QML代碼
固定的一組按鈕/頁(yè)面:摘要,固件
按鈕/頁(yè)面的其余部分來(lái)自AutoPilotPlugin VehicleComponent列表
頂級(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使用/支持的文件格式的主題
# 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ù)。
除非另有說(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ì)象的版本。當(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)度和高度。
一個(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
一個(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命令要求您指定要跳轉(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)。
調(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。
該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ò)多邊形邊的距離。
該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傳感器尺寸以毫米為單位。
{
"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
}
{
"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
}
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)志)
要檢查您的數(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í)間戳,以微秒為單位)。
下面的代碼片段顯示了如何使用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;
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ú)效,您將收到警告,如下所示。
開(kāi)發(fā)人員可以使用QML語(yǔ)言的任何特性。以下部分顯示了解決主要(預(yù)期)用例的情況:
創(chuàng)建一個(gè)按鈕發(fā)送自定義命令(MAVLink?COMMAND_LONG消息)
定義一個(gè)參數(shù)編輯器
即使按下重置(這些緩存),您也必須重新啟動(dòng)QGroundControl才能獲取QML文件中的任何更改。
該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)}
該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文件結(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)啟動(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)/命令行參數(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)行。
高級(jí)風(fēng)格信息:
選項(xiàng)卡擴(kuò)展到4個(gè)空格
Pascal / CamelCase命名約定
樣式本身是以下示例文件中的文檔:
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中找到。
所有的請(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(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的許可證是一個(gè)許可證,它允許QGC待建并在任何環(huán)境中使用,包括專(zhuān)用應(yīng)用程序。它允許QGC為移動(dòng)應(yīng)用程序商店構(gòu)建。使用Apache 2.0構(gòu)建商業(yè)Qt許可證是必需的。
在GPL v3的許可是一種強(qiáng)的copyleft許可證。在根據(jù)此許可證構(gòu)建QGC時(shí),可以使用Qt的開(kāi)源版本。我們的許可授予許可使用許可的更高版本,但是,貢獻(xiàn)必須在3.0以下。
QGroundControl文檔,藝術(shù)作品和圖像在CC BY 4.0下獲得許可。