添加測繪后1號航點序號丟失的問題
一. BUG和版本介紹 二. 流程分析
三. 程式流程總結
所有的熱愛都要不遺余力,真正喜歡它便給它更高的優先級,和更多的時間吧!
關于QGC地面站其它文章請點擊這里: QGC地面站
一. BUG和版本介紹
● BUG介紹:
添加航點時候順序本該為 0 1 2 3, 但添加測繪區域/走廊掃描/建筑掃描后,變為 0 2 3 4,如視頻所示,一般來說缺1號航點,也不影響使用,但定制的時候,需對 0 1 2 號航點做特定的處理,就有影響了,
為了看清楚航點序號,我把字體調大了,注意看左小角的地勢高度面板,
QGC原始碼:
修改之后:
● 版本介紹:
測驗時用的版本為 v4.0.0, 查看最新代碼 v4.0.11 也沒有解決此問題,
接下來讓我們順著添加測繪區域的呼叫邏輯,來解決此BUG,并分析其執行流程(只顯示關鍵代碼),如果只想結果,可以點擊這里,跳到最后,
二. 流程分析
呼叫流程很復雜,可以直接點擊呼叫流程圖
1. QML前端
PlanView.qml :565
ToolStrip {
id: toolStrip
...
model: [
{
dropPanelComponent: _singleComplexItem ? undefined : patternDropPanel
...
ToolStrip.qml :113
...
onClicked: {
if ( modelData. dropPanelComponent === undefined) {
...
} else if ( checked) {
dropPanel. show ( panelEdgeTopPoint, height, modelData. dropPanelComponent)
}
}
dropPanel 中Loader了 modelData.dropPanelComponent;另外還繪制那個外框,還包括了三角形:
而 modelData.dropPanelComponent 就是 planview.qml 下的 patternDropPanel 它定義如下:
Component {
id: patternDropPanel
...
Repeater {
model: _missionController. complexMissionItemNames
QGCButton {
onClicked: {
insertComplexItemAfterCurrent ( modelData)
...
}
可以直接按照陣列的方式直接取model中的項,如下:
_missionController. complexMissionItemNames[ 0 ] // 測繪
_missionController. complexMissionItemNames[ 1 ] // 走廊掃描
_missionController. complexMissionItemNames[ 2 ] // 建筑掃描
insertComplexItemAfterCurrent 中:
function insertComplexItemAfterCurrent ( complexItemName) {
...
_missionController. insertComplexMissionItem ( complexItemName, mapCenter ( ) , nextIndex, true /* makeCurrentItem */ )
}
2. c++后端
src\MissionManager\MissionController.cc:463 中:
VisualMissionItem* MissionController:: insertComplexMissionItem ( QString itemName, QGeoCoordinate mapCenterCoordinate, int visualItemIndex, bool makeCurrentItem)
{
. . .
//實體化測繪的復雜航點
if ( itemName == patternSurveyName) {
newItem = new SurveyComplexItem ( _controllerVehicle, _flyView, QString ( ) /* kmlFile */ , _visualItems /* parent */ ) ;
}
_insertComplexMissionItemWorker ( mapCenterCoordinate, newItem, visualItemIndex, makeCurrentItem) ;
. . .
}
_insertComplexMissionItemWorker 函式:
void MissionController:: _insertComplexMissionItemWorker ( const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem)
{
. . .
//經除錯發現問題出在這里
cameraSection- > setSpecifyCameraMode ( true ) ;
. . .
}
如何確認問題了? 可以debug單步除錯,查看關鍵變數,這樣很耗電腦資源,我是直接列印除錯的,可以在部分陳述句或者每條陳述句下加入如下:
qDebug ( ) << "[2]count" << _visualItems- > count ( ) ;
for ( int i= 0 ; i < _visualItems- > count ( ) ; i++ ) {
VisualMissionItem* visualItem = qobject_cast< VisualMissionItem* > ( _visualItems- > get ( i) ) ;
qDebug ( ) << "i:" << i << " " << visualItem- > sequenceNumber ( ) ;
}
具體操作如下: setSpecifyCameraMode 函式定義:
void CameraSection:: setSpecifyCameraMode ( bool specifyCameraMode)
{
if ( specifyCameraMode != _specifyCameraMode) {
_specifyCameraMode = specifyCameraMode;
emit specifyCameraModeChanged ( specifyCameraMode) ;
}
}
● 第一條路:specifyCameraModeChanged 信號的流程
可以點擊這里查看流程圖
//CameraSection.cc
connect ( this , & CameraSection:: specifyCameraModeChanged, this , & CameraSection:: _specifyChanged) ;
specifyCameraModeChanged 信號的槽為_specifyChanged函式:
//CameraSection.cc
void CameraSection:: _specifyChanged ( void )
{
_setDirtyAndUpdateItemCount ( ) ;
_updateSettingsSpecified ( ) ;
}
繼續:_setDirtyAndUpdateItemCount函式
//CameraSection.cc
void CameraSection:: _setDirtyAndUpdateItemCount ( void )
{
emit itemCountChanged ( itemCount ( ) ) ;
setDirty ( true ) ;
}
itemCountChanged 信號的槽為 _setDirtyAndUpdateLastSequenceNumber,如下:
// MissionSettingsItem.cc
connect ( & _cameraSection, & CameraSection:: itemCountChanged, this , & MissionSettingsItem:: _setDirtyAndUpdateLastSequenceNumber) ;
// MissionSettingsItem.cc
void MissionSettingsItem:: _setDirtyAndUpdateLastSequenceNumber ( void )
{
emit lastSequenceNumberChanged ( lastSequenceNumber ( ) ) ;
setDirty ( true ) ;
}
而關鍵就是lastSequenceNumber() 函式:
//MissionSettingsItem.cc
int MissionSettingsItem:: lastSequenceNumber ( void ) const
{
int lastSequenceNumber = _sequenceNumber;
lastSequenceNumber + = _cameraSection. itemCount ( ) ;
lastSequenceNumber + = _speedSection. itemCount ( ) ;
return lastSequenceNumber;
}
//CameraSection.cc:92
int CameraSection:: itemCount ( void ) const
{
if ( _specifyGimbal) {
itemCount++ ;
}
. . .
return itemCount;
}
答案就明顯了,MissionSettingItem代表的是第一個航點的設定,也就是起始的launch點,而我們序號亂的問題也出在了launch點后, 而 MissionSettingsItem 也是繼承了復雜航點 ComplexMissionItem ,
如下注釋后,在添加測繪區域/走廊掃描/建筑掃描后,航點順序為 0 1 2 號,完全正確,
//MissionSettingsItem.cc:63
int MissionSettingsItem:: lastSequenceNumber ( void ) const
{
int lastSequenceNumber = _sequenceNumber;
// lastSequenceNumber += _cameraSection.itemCount();
// lastSequenceNumber += _speedSection.itemCount();
return lastSequenceNumber;
}
而未修改的時候,再指定相機模式下,launch點后,確實多算了一個航點總數,我個人認為是一個BUG,因為沒有發現哪里有 new 一下1號航點,如果確實用到了,歡迎指正~
● 再看第二條路, _recalcAllWithCoordinate(mapCenterCoordinate)
void MissionController:: _insertComplexMissionItemWorker ( const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem)
{
. . .
//第一條路已分析
cameraSection- > setSpecifyCameraMode ( true ) ;
//第二條路
_recalcAllWithCoordinate ( mapCenterCoordinate) ;
}
為什么是它?也是一樣的除錯發現的(需要關閉第一條路的影響哦)
void MissionController:: _recalcAllWithCoordinate ( const QGeoCoordinate& coordinate)
{
_recalcSequence ( ) ;
. . .
}
// This will update the sequence numbers to be sequential starting from 0
void MissionController:: _recalcSequence ( void )
{
. . .
for ( int i= 0 ; i< _visualItems- > count ( ) ; i++ ) {
VisualMissionItem* item = qobject_cast< VisualMissionItem* > ( _visualItems- > get ( i) ) ;
item- > setSequenceNumber ( sequenceNumber) ;
sequenceNumber = item- > lastSequenceNumber ( ) + 1 ;
}
}
item[0] 就是 MissionSettingsItem,就是呼叫了:
int MissionSettingsItem::lastSequenceNumber(void) const { int lastSequenceNumber = _sequenceNumber;
// lastSequenceNumber += _cameraSection.itemCount(); // lastSequenceNumber += _speedSection.itemCount();
return lastSequenceNumber;
} 上文已介紹哦
搜索發現與之最相關的是:
int CameraSection:: itemCount ( void ) const
{
. . .
if ( _specifyCameraMode) {
itemCount++ ;
}
. . .
return itemCount;
}
三. 程式流程總結
好,讓我們再梳理下流程,另外注明下QML是事件觸發的,
<style>#mermaid-svg-EsvTtKsgW8yw1XWH .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .label text{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .node rect,#mermaid-svg-EsvTtKsgW8yw1XWH .node circle,#mermaid-svg-EsvTtKsgW8yw1XWH .node ellipse,#mermaid-svg-EsvTtKsgW8yw1XWH .node polygon,#mermaid-svg-EsvTtKsgW8yw1XWH .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-EsvTtKsgW8yw1XWH .node .label{text-align:center;fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .node.clickable{cursor:pointer}#mermaid-svg-EsvTtKsgW8yw1XWH .arrowheadPath{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-EsvTtKsgW8yw1XWH .flowchart-link{stroke:#333;fill:none}#mermaid-svg-EsvTtKsgW8yw1XWH .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-EsvTtKsgW8yw1XWH .edgeLabel rect{opacity:0.9}#mermaid-svg-EsvTtKsgW8yw1XWH .edgeLabel span{color:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-EsvTtKsgW8yw1XWH .cluster text{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-EsvTtKsgW8yw1XWH .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-EsvTtKsgW8yw1XWH text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-EsvTtKsgW8yw1XWH .actor-line{stroke:grey}#mermaid-svg-EsvTtKsgW8yw1XWH .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-EsvTtKsgW8yw1XWH #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .sequenceNumber{fill:#fff}#mermaid-svg-EsvTtKsgW8yw1XWH #sequencenumber{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH #crosshead path{fill:#333;stroke:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .messageText{fill:#333;stroke:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-EsvTtKsgW8yw1XWH .labelText,#mermaid-svg-EsvTtKsgW8yw1XWH .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-EsvTtKsgW8yw1XWH .loopText,#mermaid-svg-EsvTtKsgW8yw1XWH .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-EsvTtKsgW8yw1XWH .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-EsvTtKsgW8yw1XWH .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-EsvTtKsgW8yw1XWH .noteText,#mermaid-svg-EsvTtKsgW8yw1XWH .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-EsvTtKsgW8yw1XWH .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-EsvTtKsgW8yw1XWH .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-EsvTtKsgW8yw1XWH .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-EsvTtKsgW8yw1XWH .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .section{stroke:none;opacity:0.2}#mermaid-svg-EsvTtKsgW8yw1XWH .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-EsvTtKsgW8yw1XWH .section2{fill:#fff400}#mermaid-svg-EsvTtKsgW8yw1XWH .section1,#mermaid-svg-EsvTtKsgW8yw1XWH .section3{fill:#fff;opacity:0.2}#mermaid-svg-EsvTtKsgW8yw1XWH .sectionTitle0{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .sectionTitle1{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .sectionTitle2{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .sectionTitle3{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-EsvTtKsgW8yw1XWH .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .grid path{stroke-width:0}#mermaid-svg-EsvTtKsgW8yw1XWH .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-EsvTtKsgW8yw1XWH .task{stroke-width:2}#mermaid-svg-EsvTtKsgW8yw1XWH .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .taskText:not([font-size]){font-size:11px}#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-EsvTtKsgW8yw1XWH .task.clickable{cursor:pointer}#mermaid-svg-EsvTtKsgW8yw1XWH .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-EsvTtKsgW8yw1XWH .taskText0,#mermaid-svg-EsvTtKsgW8yw1XWH .taskText1,#mermaid-svg-EsvTtKsgW8yw1XWH .taskText2,#mermaid-svg-EsvTtKsgW8yw1XWH .taskText3{fill:#fff}#mermaid-svg-EsvTtKsgW8yw1XWH .task0,#mermaid-svg-EsvTtKsgW8yw1XWH .task1,#mermaid-svg-EsvTtKsgW8yw1XWH .task2,#mermaid-svg-EsvTtKsgW8yw1XWH .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutside0,#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutside2{fill:#000}#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutside1,#mermaid-svg-EsvTtKsgW8yw1XWH .taskTextOutside3{fill:#000}#mermaid-svg-EsvTtKsgW8yw1XWH .active0,#mermaid-svg-EsvTtKsgW8yw1XWH .active1,#mermaid-svg-EsvTtKsgW8yw1XWH .active2,#mermaid-svg-EsvTtKsgW8yw1XWH .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-EsvTtKsgW8yw1XWH .activeText0,#mermaid-svg-EsvTtKsgW8yw1XWH .activeText1,#mermaid-svg-EsvTtKsgW8yw1XWH .activeText2,#mermaid-svg-EsvTtKsgW8yw1XWH .activeText3{fill:#000 !important}#mermaid-svg-EsvTtKsgW8yw1XWH .done0,#mermaid-svg-EsvTtKsgW8yw1XWH .done1,#mermaid-svg-EsvTtKsgW8yw1XWH .done2,#mermaid-svg-EsvTtKsgW8yw1XWH .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-EsvTtKsgW8yw1XWH .doneText0,#mermaid-svg-EsvTtKsgW8yw1XWH .doneText1,#mermaid-svg-EsvTtKsgW8yw1XWH .doneText2,#mermaid-svg-EsvTtKsgW8yw1XWH .doneText3{fill:#000 !important}#mermaid-svg-EsvTtKsgW8yw1XWH .crit0,#mermaid-svg-EsvTtKsgW8yw1XWH .crit1,#mermaid-svg-EsvTtKsgW8yw1XWH .crit2,#mermaid-svg-EsvTtKsgW8yw1XWH .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-EsvTtKsgW8yw1XWH .activeCrit0,#mermaid-svg-EsvTtKsgW8yw1XWH .activeCrit1,#mermaid-svg-EsvTtKsgW8yw1XWH .activeCrit2,#mermaid-svg-EsvTtKsgW8yw1XWH .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-EsvTtKsgW8yw1XWH .doneCrit0,#mermaid-svg-EsvTtKsgW8yw1XWH .doneCrit1,#mermaid-svg-EsvTtKsgW8yw1XWH .doneCrit2,#mermaid-svg-EsvTtKsgW8yw1XWH .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-EsvTtKsgW8yw1XWH .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-EsvTtKsgW8yw1XWH .milestoneText{font-style:italic}#mermaid-svg-EsvTtKsgW8yw1XWH .doneCritText0,#mermaid-svg-EsvTtKsgW8yw1XWH .doneCritText1,#mermaid-svg-EsvTtKsgW8yw1XWH .doneCritText2,#mermaid-svg-EsvTtKsgW8yw1XWH .doneCritText3{fill:#000 !important}#mermaid-svg-EsvTtKsgW8yw1XWH .activeCritText0,#mermaid-svg-EsvTtKsgW8yw1XWH .activeCritText1,#mermaid-svg-EsvTtKsgW8yw1XWH .activeCritText2,#mermaid-svg-EsvTtKsgW8yw1XWH .activeCritText3{fill:#000 !important}#mermaid-svg-EsvTtKsgW8yw1XWH .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-EsvTtKsgW8yw1XWH g.classGroup text .title{font-weight:bolder}#mermaid-svg-EsvTtKsgW8yw1XWH g.clickable{cursor:pointer}#mermaid-svg-EsvTtKsgW8yw1XWH g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-EsvTtKsgW8yw1XWH g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-EsvTtKsgW8yw1XWH .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-EsvTtKsgW8yw1XWH .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-EsvTtKsgW8yw1XWH .dashed-line{stroke-dasharray:3}#mermaid-svg-EsvTtKsgW8yw1XWH #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH .commit-id,#mermaid-svg-EsvTtKsgW8yw1XWH .commit-msg,#mermaid-svg-EsvTtKsgW8yw1XWH .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-EsvTtKsgW8yw1XWH g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-EsvTtKsgW8yw1XWH g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-EsvTtKsgW8yw1XWH g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-EsvTtKsgW8yw1XWH .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-EsvTtKsgW8yw1XWH .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-EsvTtKsgW8yw1XWH .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-EsvTtKsgW8yw1XWH .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-EsvTtKsgW8yw1XWH .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-EsvTtKsgW8yw1XWH .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-EsvTtKsgW8yw1XWH .edgeLabel text{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EsvTtKsgW8yw1XWH .node circle.state-start{fill:black;stroke:black}#mermaid-svg-EsvTtKsgW8yw1XWH .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-EsvTtKsgW8yw1XWH #statediagram-barbEnd{fill:#9370db}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-state .divider{stroke:#9370db}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-EsvTtKsgW8yw1XWH .note-edge{stroke-dasharray:5}#mermaid-svg-EsvTtKsgW8yw1XWH .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-EsvTtKsgW8yw1XWH .error-icon{fill:#522}#mermaid-svg-EsvTtKsgW8yw1XWH .error-text{fill:#522;stroke:#522}#mermaid-svg-EsvTtKsgW8yw1XWH .edge-thickness-normal{stroke-width:2px}#mermaid-svg-EsvTtKsgW8yw1XWH .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-EsvTtKsgW8yw1XWH .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-EsvTtKsgW8yw1XWH .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-EsvTtKsgW8yw1XWH .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-EsvTtKsgW8yw1XWH .marker{fill:#333}#mermaid-svg-EsvTtKsgW8yw1XWH .marker.cross{stroke:#333}
:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}</style>
<style>#mermaid-svg-EsvTtKsgW8yw1XWH {
color: rgba(0, 0, 0, 0.75);
font: ;
}</style>
傳入 patternDropPanel
點擊工具列的圖案
點擊測繪
路線一
specifyCameraModeChanged 信號連接到槽 _specifyChanged
itemCountChanged 信號連接到槽 _setDirtyAndUpdateLastSequenceNumber
只需要屏蔽 lastSequenceNumber += _cameraSection.itemCount 即可
路線二
檔案: PlanView.qml
檔案: ToolStrip.qml
通過dropPanel 打開 patternDropPanel
用戶點擊一級目錄
用戶點擊二級目錄
planview.qml函式: insertComplexItemAfterCurrent
MissionController.cc 函式: insertComplexMissionItem
MissionController.cc 函式: _insertComplexMissionItemWorker
上述函式中內容: cameraSection->setSpecifyCameraMode
CameraSection.cc中函式: _setDirtyAndUpdateItemCount
呼叫: lastSequenceNumber函式
_cameraSection.itemCount
itemCount++
上述函式中內容: _recalcAllWithCoordinate
MissionController.cc 函式 _recalcSequence
item->lastSequenceNumber
● 你也可以不看流程的分析,只需要注釋如下,再添加測繪區域/走廊掃描/建筑掃描后,航點順序為 0 1 2 號,完全正確,
//MissionSettingsItem.cc:63
int MissionSettingsItem:: lastSequenceNumber ( void ) const
{
int lastSequenceNumber = _sequenceNumber;
// lastSequenceNumber += _cameraSection.itemCount();
// lastSequenceNumber += _speedSection.itemCount();
return lastSequenceNumber;
}
如果對QGC地面站有開發需求,歡迎點個關注哈,后面會不定時更新的~
關于QGC地面站其它文章請點擊這里: QGC地面站