999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于OSG和OSDK的無人機標校系統設計及實現

2022-12-26 12:54:58虞炳文蔡紅維丁思煒
計算機測量與控制 2022年12期
關鍵詞:設置

虞炳文,蔡紅維,丁思煒,楊 波,王 康

(西昌衛星發射中心,四川 西昌 615000)

0 引言

目前的標校,根據跟蹤目標的屬性,可以區分為對靜態目標的標校以及對動態目標的標校。

對靜態目標的跟蹤標校實現較為簡單,但是需要標校塔或者標校桿配合進行,因此受到場地限制的約束較為明顯。

通過對動態目標的跟蹤標校,較為常見的有三種方式,分別是利用標校衛星、利用飛機、利用無人機進行標校。

利用標校衛星,即利用天平衛星進行標校,優點是簡單可行,但是此種方法只能對測控設備的跟蹤性能(基帶指標)進行標校,對設備的動態性能(伺服指標)則無法進行有效標校。

利用飛機標校,優點是對設備的跟蹤性能和動態性能都能進行有效的檢驗,但缺點也很明顯,就是成本高昂。

利用無人機進行標校,優點是成本較低,起飛在一定程度上不受場地限制,對測控設備的跟蹤和動態性能在理論上都能進行有效的驗證,但是缺點是,目前所使用的無人機上可攜帶的應答機較為簡單,以及無人機容易受到天氣等因素影響,驗證精度無法得到有效保證。

而文中通過對無人機、應答機等的硬件指標設計,對標校相關軟件設計,提高無人機的標校可靠性,保證其精度,從而保證無人機標校的可行性。通過對無人機標校系統進行功能需求分析,提出了對于標校軟件功能和無人機、應答機等硬件指標的設計與實現,對于進一步提高無人機標校精度與可靠性,推動無人機標校的應用有較強的現實意義。

1 無人機標校存在的問題

在前期開展的無人機標校過程中,暴露出一些問題。

1)無人機在高空中穩定性差,容易受到高空風等因素影響,導致不能按照既定飛行軌跡飛行。

2)目前基地正在使用的標校無人機,攜帶的是信標機,并非應答機,無應答模式。

3)無人機攜帶的信標機的發射頻點與信號強度不支持修改。

4)因機載信標機較為簡易,未配備頻標設備,頻率的穩定性較差。

5)飛行軌跡的設計依靠無人機產家提供的商業軟件,例如DJI Pilot,并非專業的標校軟件,因此使用上有很多限制,例如在手動添加飛行軌跡的路徑點時,難以避免地會出現點密度較低,點分布不均勻等情況。另外,在飛行軌跡的導入導出格式上,也會出現不匹配的情況。

6)專業的無人機標校軟件的缺失,導致無人機的飛行軌跡的設計無法考慮到很多重要因素,例如被標校設備的指標參數,當時當地的自然因素等。

2 無人機標校軟硬件分析設計

在此對無人機標校系統進行一個分析及設計,涉及硬件及軟件內容。

2.1 應答機需求分析及設計

應答機應包含六個模塊,依次為:控制天線、無線通信模塊、控制模塊、應答模塊、射頻天線、供電模塊,應答機示意圖見圖1。

圖1 應答機平面示意圖

對機載應答機作如下要求:

1)應答機的重量主要來源于應答機保護外殼、無線通信模塊、應答模塊、電池。應答機總重量小于15 kg。

2)供電模塊的輸入端電壓為12 V,電流為2 A,即功率為24 W。

3)應答機外接3S電池。

4)可通過地面控制臺無線控制應答機信號開關,調整信號頻點、調整信號強度,切換應答及信標模式等。

2.2 標校無人機需求分析及設計

標校無人機的重要指標為:無人機載重與飛行穩定性。

1)無人機載重量與無人機的電機、螺旋槳槳葉長度、螺距等密切相關。電池、電機、螺旋槳選型與搭配很重要,一般情況下,整機重量,應該小于電機最大動力的2/5。

2)飛行穩定性受飛控影響較大。選擇大疆A3 Pro飛控,搭載D-RTK-GNSS,可使得飛行懸停精度達到垂直方向約0.02 m,水平方向約0.01 m。

3)機架選用六旋翼機架,材質輕且堅固。

4)電池的選擇需要綜合考慮電池的重量及容量。無人機電池容量保證載重10 kg下,可飛行30 min。

5)無人機遙控天線與應答機射頻天線、應答機通信控制天線區分開。

6)無人機可同時接收來自遙控器及地面控制臺的控制信號。遙控器控制無人機進行飛行操作,地面控制臺通過上傳規劃好的航線驅動無人機啟動航線飛行。

無人機示意圖見圖2。

圖2 無人機俯視圖

2.3 無人機標校軟件需求分析及設計

無人機標校軟件是為標校無人機專用設計的桌面端應用軟件,運行在地面控制臺服務器上,其作用是能夠根據測控設備及機載應答機的性能參數、指標要求以及當地環境因素,綜合生成一條滿足標校需求的飛行軌跡,并且能夠將飛行軌跡上傳至無人機飛控,驅動標校無人機實施飛行計劃。同時,無人機標校軟件可以實現對機載應答機的遠程控制。

2.3.1 軟件功能

無人機標校軟件需要實現以下三個功能:

1)生成一條可靠的飛行軌跡;

2)將飛行軌跡導入飛控,并實施;

3)遠程控制機載應答機。

2.3.2 開發環境

軟件部分使用較為成熟的C++開發框架:

1)操作系統:Linux操作系統。

2)開發語言:C++。

3)開發工具:Qt及QtCreator。

4)編譯器:GCC 5.4.0/5.5.0以上版本。

2.3.3 功能設計

軟件功能設計分為三部分進行闡述。

2.3.3.1 生成飛行軌跡功能

生成飛行軌跡的功能是整個軟件部分的基礎內容。

2.3.3.1.1 功能分析

飛行軌跡的規劃,需要考慮以下幾個方面的情況:

1)標校的目的。跟蹤靜態目標與跟蹤動態目標所要達成的目標是不同的。跟蹤靜態目標的通常是為了檢查測控設備的極性、AGC曲線標定。跟蹤動態目標通常是為了測試設備的伺服性能,即設備方位俯仰上的速度、加速度、加加速度等,能否達到指標要求,因此在設計飛行軌跡時,需考慮其極限值。

2)飛行軌跡的約束條件。標校無人機允許飛行的最大高度與起飛點位置相關。測控設備與應答機之間的最小距離與電磁波傳輸特性有關,即電磁波遠場距離公式,見公式(1),其中D為天線口徑,λ為電磁波頻率;最遠距離與測控設備與應答機的發射信號強度、接收靈敏度有關。

3)無人機飛行的干擾因素。主要是環境因素,包括高空風、大氣折射率、溫濕壓、太陽夾角、月球夾角等。

4)飛行軌跡的模擬仿真。搭建三維立體場景進行模擬仿真,一方面實現飛行軌跡可視化,一方面驗證各參數的正確性,可選用OpenSceneGraph及osgEarth函數庫實現。

2.3.3.1.2 程序設計

根據上述影響分析,對飛行軌跡的功能作如下設計。

1)設計飛行軌跡生成函數類,QGenerateTraj。

2)設計一個結構體trajStruct,包含每個飛行軌跡跡點的數據格式值,見代碼 1,其中T為相對時間,X、Y、Z分別為地心固定坐標系下的X軸值、Y軸值、Z軸值,Vx、Vy、Vz分別為在X軸、Y軸、Z軸方向的速度分量。

代碼1:飛行軌跡點結構體

struct trajStruct{

int T;

int X;

int Y;

int Z;

int Vx;

int Vy;

int Vz;

}

3)函數emulateTrajectory(),無返回值,功能為根據生成的飛行軌跡在三維環境中進行仿真。

4)函數getFlyTrajectory(),返回值為保存為QList的飛行軌跡,即保存為每個跡點的數據的容器,功能為根據輸入的參數生成飛行軌跡,該函數在emulateTrajectory()中被調用。

5)setOsgSceneParaAndDisplay(QList traj)函數,返回值為QList的飛行軌跡,輸入值為getFlyTrajectory()輸出的結果數據,功能為在三維空間中演示輸入的飛行軌跡。該函數在emulateTrajectory()中被調用。

6)函數setFlyTrajPara(),無返回值,輸入值為各指標參數,功能為設置飛行軌跡設計中需要用到的基本參數,如測站地理坐標、測試指標、飛行限制條件、環境干擾因素、數據輸出格式等。該函數在getFlyTrajectory()函數中被調用。

7)函數setFlyTrajPara(),無返回值,輸入值為測試指標參數,功能為設置測試期望達到的指標參數。該函數在setFlyTrajPara()被調用。在該函數下,根據指標參數的不同,分別調用setElSpeed(int val)設置方位速度,調用setElAcceleration(int val)設置方位加速度,調用setElJerk(int val)設置方位加加速度,調用setAzSpeed(int val)設置方位速度,調用setAzAcceleration(int val)設置方位加速度,調用setAzJerk(int val)設置方位加加速度。

8)函數setFlyLimitPara(),無返回值,輸入值為飛行軌跡的限制條件,功能為設置因設備性能帶來的限制條件。該函數在setFlyTrajPara()被調用。在該函數下,根據指標參數的不同,分別調用setRadarEmitPower (int val)設置測控設備的發送功率,調用setRadarRecvMinVal (int val)設置測控設備的接收靈敏度,調用setRespEmitPower (int val)設置應答機的發送功率,調用setRespRecvMinVal (int val)設置應答機的接收靈敏度,調用setRemoteDist (int val,int fr)設置并計算遠場距離,其中val為天線口徑,fr為電磁波頻率。

9)函數setFlyInterPara(),無返回值,輸入值為環境因素帶來的干擾參數,功能為設置因環境因素帶來的干擾。該函數在setFlyTrajPara()被調用。在該函數下,根據指標參數的不同,分別調用ifUpperAirWinds(bool ok)設置是否啟用高空風誤差修正,調用ifAtmosRef(bool ok)設置是否啟用大氣折射修正,調用ifTempHumiPressure(bool ok)設置是否啟用溫濕壓修正,調用ifSunAngle(bool ok)設置是否避開太陽夾角干擾,調用ifMoonAngle(bool ok)設置是否避開月球夾角干擾。

函數調用關系見圖3。

圖3 生成飛行軌跡函數設計

2.3.3.1.3 關鍵技術實現

關鍵技術主要圍繞與OSG相關的內容。

2.3.3.1.3.1 三維環境的搭建

為搭建一個高還原度、可測量、準確可靠的三維世界,選用開源的osgEarth函數庫來實現。osgEarth是基于OSG函數庫二次開發的,專門用于地理信息系統建模的函數庫,使用范圍廣,可配置性強。選用osgEarth2.10版本及OSG3.6.4版本進行二次開發。

通過osgEarth實現三維建模主要有兩種方法,一種是純代碼形式,所有的配置項通過代碼中調用函數庫實現;另一種是代碼加配置文件形式,三維地理模型的絕大部分配置內容,都可以通過*.earth文件中的配置項實現配置。在無人機標校軟件的設計中使用第二種方式。

2.3.3.1.3.1.1 編寫*.earth文件

編寫*.earth文件,可以將其命名為simple.earth配置文件,earth后綴的文件格式,類似于*.xml文件,是用作配置三維地理模型的配置文件。定義地理信息模型,需要最少包含五部分內容,一是確定空間參考系,二是確定地形渲染參數,三是加載高程數據,四是加載紋理信息,五是確定數據緩存方式。

1)確定空間參考系??臻g參考系配置選用geocentric,地固系坐標系,即地心為質心的空間直角坐標系。

代碼2:空間參考系配置項

2)定義地形引擎如何渲染影像數據和高程數據。可對地理模型的插值方式、是否開啟地形表面的光照、加載地形數據(瓦片)的策略、多影像數據疊加時集成最終影像數據的方式、地形瓦片分割的最大層數、瓦片范圍系數、瓦片的采樣率、瓦片邊緣率、高程夸張系數、邊緣緩沖率等參數進行設置。

代碼3:地形渲染方式配置項

3)加載高程數據。使用加載DEM圖的方式加載高程數據,DEM圖是一種每個圖元像素都包含了地理信息,如經緯度、高程信息的TIF格式圖。在此使用的DEM圖為包含了中國范圍內的1Km精度的高程信息。加載高程數據的操作,可以先貼上一張高程精度較低的DEM圖,然后在此基礎上,根據需求在特定區域貼上精度更高的DEM圖,如下圖所示。之所以要選擇不同精度的不同范圍的DEM圖,是因為精度如果太高,就會導致DEM圖非常大,加載起來就會非常困難,因此要合理安排DEM圖的精度。

代碼4:加載高程數據配置項

4)加載紋理信息,即貼圖操作。是為了使得地理模型可以更直觀且美觀的展現,如果沒有貼圖操作,則顯示的地理模型就是一個密密麻麻的點云。貼圖操作可以先貼上一張分辨率較低的全球影像圖,然后在此基礎上,根據需求在特定區域貼上分辨率更高的影像圖。原因同高程數據。

代碼5:加載紋理信息配置項

5)確定數據緩存的方式和存儲位置。緩存在三維建模中顯得較為重要,因為加載一次高程和紋理圖的數據量較大,需要較長時間,如果在每一次運行時都去重新加載,那顯然是不可接受的,因此osgEarth給出的一種方案是,第一次加載完成后,就會生成緩存數據,以后每次加載,則從緩存數據進行加載,這樣會顯著提升效率。

代碼6:數據緩存的配置項

/media/ybw/SSD/OSG_DATA/MAIN_DATA/FileCache

2.3.3.1.3.1.2 運行并顯示三維世界

因為選用Qt作為開發工具,要將osgEarth顯示的地理模型,顯示在Qt的窗口中。在osgEarth開發中,至少需要配置兩部分內容,一是加載三維模型,二是設置相機操作器。

1)加載*.earth模型。

代碼7:讀取模型的代碼

osg::Node* pNode =

osgDB::readNodeFile("./Data/simple.earth");

osgEarth::MapNode* mapNode =

osgEarth::MapNode::findMapNode(pNode.get());

2)初始化相機操作器,即相機參數。osgEarth的界面顯示,實際上是將顯示界面當作一個攝像頭,顯示的是攝像機視角。

代碼8:設置相機操作器的代碼

osgEarth::Util::EarthManipulator *em = new osgEarth::Util::EarthManipulator;

if(mapNode.valid())

{

em.get()->setNode(mapNode);

}

em.get()->getSettings()->setArcViewpointTransitions(true);

osgViewer::Viewer * pViewer=this->getOsgViewer();

pViewer->setCameraManipulator(em.get());

pViewer->setSceneData(mRoot.get());//添加到場景

pViewer->realize();

2.3.3.2 航線導入飛控并實施功能

在生成了航線之后,就需要考慮如何將該航線轉換為無人機可識別的格式并上傳使用。

2.3.3.2.1 功能分析

實現飛行軌跡的導入,需要解決幾方面的問題。

1)將生成的飛行軌跡數據整理成飛控程序能識別的格式。

2)將整理后的飛行軌跡數據上傳至飛控。

3)驅動飛行器按既定飛行軌跡飛行。

2.3.3.2.2 程序設計

大疆無人機設備基于C++的二次開發,大疆官方提供了OSDK開發工具包,目前最新的版本為V4.0.0。

2.3.3.2.2.1 DJI OSDK簡介

在此介紹OSDK開發包。

1)DJI OSDK是由大疆自主開發的一個運行于桌面端的軟件庫,貼合用戶自主進行二次開發的需要,可個性定制對無人機在飛行中與自動化相關的的需求,其提供了一些基礎的API,用于實現基本的運動規劃功能;開發者在使用調用規劃相關的庫的同時,可以根據個人需要,對功能進一步擴展,可根據實際的使用需求,設計并編寫相應的航點任務以及熱點任務,制定一套個性化控制無人機自動化飛行的控制邏輯。

2)在無人機標校中主要用到的功能是航點規劃的功能。航點規劃,簡單來說就是通過設置一系列的軌跡點,連接成線,然后將航跡上傳給無人機,指令控制無人機按照指定的航線啟動飛行,實現無人機根據既定航線自動化飛行的控制功能。開發者通過調用DJI OSDK 的API接口,能夠控制無人機以指定的高度、方向飛往既定的位置,并且執行約定好的動作,根據任務需求,還可以編寫更多的任務動作,控制無人機多次重復執行該任務,以此實現多輪次標校的功能。

3)開發者在代碼開發中,調用航點任務相關的API,需要指定的參數為航點數量和對應的航點類型。航點數量在最新版本的API中,最多可設置65535個點。航點類型主要包含三種飛行模式,分別為曲率飛行、直線飛行和協調轉彎。

4)OSDK庫文件同時還為開發者提供了更多方便簡潔的功能,以便直接調用,比如對速度的控制功能,開發者能夠按照既定任務要求,為不同的航點配置不同的速度,當然,也可以為同一個航點設置多個速度。另外,在無人機執行航線飛行任務時,修改或查詢無人機全局巡航速度等的狀態數據的函數,也是事先寫好,可以直接調用的。

2.3.3.2.2.2 主要函數類

為實現航點任務功能,利用OSDK函數庫,主要將設計到以下幾個代碼文件:

1)dji_mission_type.hpp文件。該文件主要用于定義在航線自動飛行中會用到的一些數據的結構體文件,主要的內容為WaypointV2結構體,其中主要涉及到的內容有:longitude為精度值,latitude為緯度值,relativeHeight為高程值,maxFlightSpeed為最大速度值,autoFlightSpeed為自動巡航速度值。

代碼9:WaypointV2結構體內容

typedef struct WaypointV2

{

float64_t longitude;

float64_t latitude;

float32_t relativeHeight; /*! relative to takeoff height*/

DJIWaypointV2FlightPathMode waypointType;

DJIWaypointV2HeadingMode headingMode;

WaypointV2Config config;

uint16_t dampingDistance;

float32_t heading;

DJIWaypointV2TurnMode turnMode;

RelativePosition pointOfInterest;

float32_t maxFlightSpeed;

float32_t autoFlightSpeed;

}WaypointV2;

2)dji_mission_base.hpp文件。在這部分代碼中,主要實現的是對航線任務的控制函數,start()實現啟動任務,stop()實現停止任務,pause()實現暫停任務,resume()實現重啟任務。

代碼10:dji_mission_base.hpp主要代碼

virtual void start(VehicleCallBack callback = 0, UserData userData=0)=0;

virtual ACK::ErrorCode start(int timer) = 0;

virtual void stop(VehicleCallBack callback = 0, UserData userData = 0) = 0;

virtual ACK::ErrorCode stop(int timer) = 0;

virtual void pause(VehicleCallBack callback = 0, UserData userData = 0) = 0;

virtual ACK::ErrorCode pause(int timer) = 0;

virtual void resume(VehicleCallBack callback = 0, UserData userData = 0)=0;

virtual ACK::ErrorCode resume(int timer) = 0;

3)dji_waypoint_v2.hpp、dji_waypoint_v2.cpp代碼文件。其中的WaypointV2MissionOperator類為主要功能實現的類,在該類中主要涉及到的函數有,init(WayPointV2InitSettings *info,int timeout)函數為實現該類函數的初始化操作,其中WayPointV2InitSettings為航線任務結構體,在該結構體中主要規定了任務ID值,missionID,任務重復次數repeatTimes,航線結束時的動作finishedAction,最大飛行速度maxFlightSpeed,自動飛行速度autoFlightSpeed,前往第一個任務點的方式gotoFirstWaypointMode,以及裝載了任務航點的容器mission。downloadInitSetting()即從飛控設備下載航跡任務的初始化配置信息。start()函數用于啟動航線任務,stop()為停止航線任務,pause()函數用于暫停飛行任務,resume()用于重啟飛行任務,注意到,start()、stop()、pause()、resume()四個函數都繼承自dji_mission_base.hpp代碼。uploadMission()函數用于上傳任務航線,downloadMission()用于下載在飛控中的任務航線。uploadAction()用于上傳飛行器動作。RegisterMissionEventCallback()和RegisterMissionStateCallback()分別用于反饋目前的動作和狀態信息。

代碼11:dji_waypoint_v2.hpp主要代碼:

class WaypointV2MissionOperator

{

public:

const uint16_t MAX_WAYPOINT_NUM_SIGNAL_PUSH = 260;

WaypointV2MissionOperator(Vehicle* vehiclePtr);

~WaypointV2MissionOperator();

ErrorCode::ErrorCodeType init(WayPointV2InitSettings *info, int timeout);

ErrorCode::ErrorCodeType downloadInitSetting(WayPointV2InitSettingsInternal &info, int timeout);

ErrorCode::ErrorCodeType start(int timeout);

ErrorCode::ErrorCodeType stop(int timeout);

ErrorCode::ErrorCodeType pause(int timeout);

ErrorCode::ErrorCodeType resume(int timeout);

ErrorCode::ErrorCodeType uploadMission(int timeout);

ErrorCode::ErrorCodeType downloadMission(std::vector&mission, int timeout);

ErrorCode::ErrorCodeType getGlobalCruiseSpeed(GlobalCruiseSpeed &cruiseSpeed, int timeout);

ErrorCode::ErrorCodeType setGlobalCruiseSpeed(const GlobalCruiseSpeed &cruiseSpeed, int timeout);

ErrorCode::ErrorCodeType uploadAction(std::vector&actions, int timeout);

ErrorCode::ErrorCodeType getActionRemainMemory(GetRemainRamAck &remainRamAck, int timeout);

ErrorCode::ErrorCodeType getWaypointIndexInList(GetWaypontStartEndIndexAck &startEndIndexAck, int timeout);

inline DJIWaypointV2MissionState getCurrentState() { return currentState; }

inline DJIWaypointV2MissionState getPrevState() { return prevState; }

void setPrevState(DJIWaypointV2MissionState state) {prevState = state; }

void setCurrentState(DJIWaypointV2MissionState state) {currentState = state; }

float32_t getTakeoffAltitude(){return takeoffAltitude;};

void setTakeoffAltitude(float32_t altitude){ takeoffAltitude = altitude;};

void RegisterMissionEventCallback(void *userData, PushCallback cb = NULL);

void RegisterMissionStateCallback(void *userData, PushCallback cb = NULL) ;

private:

std::vector missionV2;

DJIWaypointV2MissionState currentState;

DJIWaypointV2MissionState prevState;

Vehicle *vehiclePtr;

float32_t takeoffAltitude;

void RegisterOSDInfoCallback(Vehicle *vehiclePtr);

};

2.3.3.2.2.3 流程設計

航線導入并啟動的功能實施流程如下:

1)在之前已經設計好航線的前提下,需要將該航行的數據點存儲模式修改為大疆指定的數據點存儲方式;

2)將生成的航線通過API調用上傳航線任務的整體信息。

3)一個航點任務包含航線飛行任務的ID、航點任務的航點數、任務重復次數、航點任務結束后的動作、最大飛行速度和巡航速度。

4)上傳航點信息基礎參數:航點坐標(設置航點的經度、緯度和相對于起飛點的高度)、航點類型、航向類型和飛行速度??蛇x參數:緩沖距離、航向角度、轉向模式、興趣點、單點最大飛行速度、單點巡航速度。

5)將航線任務上傳至標校無人機飛控。

6)控制無人機執行航點任務。上傳完成后,標校無人機可通過開發者之前預設的動作,如開始、停止或暫停任務、設置或獲取巡航速度等。

2.3.3.2.2.4 程序實現

本章節內容旨在將上一章節內容以代碼實現。

1)首先判斷是否支持航線任務規劃的功能,通過如下代碼。

代碼12:判斷函數是否支持功能

if (!vehiclePtr->isM300()) {

DSTATUS("This sample only supports M300!"); /*當前waypoint v2 僅支持M300機型*/

return false;

}

int timeout = 1;

GetRemainRamAck actionMemory = {0};

ErrorCode::ErrorCodeType ret;

if(!setUpSubscription(timeout))

{

DERROR("Failed to set up subscription!");

return -1;

}

else

{

DSTATUS("Set up subscription successfully!");

}

/*! wait for subscription data come*/

sleep(timeout);

2)而后創建mission任務,初始化mission任務,用到initMissionSetting()函數,該函數實現了任務初始化配置的功能,部分代碼見代碼7內容。

代碼13:上傳任務的代碼

/*! init mission */ /* 初始化mission任務 */

ret = initMissionSetting(timeout);

if(ret != ErrorCode::SysCommonErr::Success)

return ret;

sleep(timeout);

3)其中代碼8中為添加航跡點的核心代碼。是initMissionSetting代碼中內容,通過這段代碼,添加每個航點信息。

代碼14:上傳任務的代碼

/*! Init waypoint settings*/

WayPointV2InitSettings missionInitSettings;

missionInitSettings.missionID = rand();

missionInitSettings.repeatTimes = 1;

missionInitSettings.finishedAction = DJIWaypointV2MissionFinishedGoHome;

missionInitSettings.maxFlightSpeed = 10;

missionInitSettings.autoFlightSpeed = 2;

missionInitSettings.exitMissionOnRCSignalLost = 1;

missionInitSettings.gotoFirstWaypointMode = DJIWaypointV2MissionGotoFirstWaypointModePointToPoint;

missionInitSettings.mission = generatePolygonWaypoints(radius, polygonNum);

missionInitSettings.missTotalLen = missionInitSettings.mission.size();

ErrorCode::ErrorCodeType ret = vehiclePtr->waypointV2Mission->init(&missionInitSettings,timeout);

4)代碼9的內容是在代碼8中進一步展開,特別將generatePolygonWaypoints()函數單獨講解,這部分內容是generatePolygonWaypoints()函數的內容。該函數實現了航點數據的添加功能。這一步函數調用,也是實現在飛行軌跡設計完成之后,將設計的航跡進行轉換,使得無人機飛控可以使用的關鍵。

代碼15:上傳任務的代碼

std::vector WaypointV2MissionSample::generatePolygonWaypoints(float32_t radius, uint16_t polygonNum) {

// Let's create a vector to store our waypoints in.

std::vector waypointList;

WaypointV2 startPoint;

WaypointV2 waypointV2;

Telemetry::TypeMap::type subscribeGPosition = vehiclePtr->subscribe->getValue();

startPoint.latitude = subscribeGPosition.latitude;

startPoint.longitude = subscribeGPosition.longitude;

startPoint.relativeHeight = 15;

setWaypointV2Defaults(startPoint);

waypointList.push_back(startPoint);

// Iterative algorithm

for (int i = 0; i < polygonNum; i++) {

float32_t angle = i * 2 * M_PI / polygonNum;

setWaypointV2Defaults(waypointV2);

float32_t X = radius * cos(angle);

float32_t Y = radius * sin(angle);

waypointV2.latitude = X/EARTH_RADIUS + startPoint.latitude;

waypointV2.longitude = Y/(EARTH_RADIUS * cos(startPoint.latitude)) + startPoint.longitude;

waypointV2.relativeHeight = startPoint.relativeHeight ;

waypointList.push_back(waypointV2);

waypointList.push_back(startPoint);

return waypointList;

}

5)而后將自定義的航線任務上傳至無人機飛控。見代碼8內容。

代碼16:上傳任務的代碼

/*! upload mission */

/*! upload mission's timeout need to be longer than 2s*/

int uploadMissionTimeOut = 3;

ret = uploadWaypointMission(uploadMissionTimeOut); /* 上傳任務,注意注釋部分,這里的超時需要設置為3s, 設置為1時,可能因為上傳任務過多,報index錯誤*/

if(ret != ErrorCode::SysCommonErr::Success)

return ret;

sleep(timeout);

6)從飛控中下載航線,這一步可以起到檢查航線的作用。

代碼17:下載并檢查任務的代碼

/*! download mission */ /* 下載任務,可以查看對比上傳的任務 debug的時候可以用來對比排查問題 */

std::vector mission;

ret = downloadWaypointMission(mission, timeout);

if(ret != ErrorCode::SysCommonErr::Success)

return ret;

sleep(timeout);

7)而后上傳在航線進行過程中,需要涉及的一些飛行器動作。

代碼18:上傳飛行器動作的代碼

/*! upload actions */ /* 上傳actions:*/

/*! check action memory */

ret = getActionRemainMemory(actionMemory, timeout); //上傳action前先檢查action容量,避免上傳的任務過多導致action被擠掉了,執行動作可能不完整。最大貌似為65535 byte

if (actionMemory.remainMemory <= 0)

{

DSTATUS("action memory is not enough.Can not upload more action!");

return ErrorCode::SysCommonErr::UndefinedError;

}

ret = uploadWapointActions(timeout);

if(ret != ErrorCode::SysCommonErr::Success)

return ret;

ret = getActionRemainMemory(actionMemory, timeout);

sleep(timeout);

8)開始執行飛行任務。

代碼19:開始執行飛行任務的代碼

/*! start mission */

ret = startWaypointMission(timeout); //開始執行

if(ret != ErrorCode::SysCommonErr::Success)

return ret;

sleep(20);

9)設置飛行過程中的一些參數,比如最大飛行速度等。

代碼20:設置飛行參數的代碼

/*! set global cruise speed */

setGlobalCruiseSpeed(1.5, timeout); //設置巡航速度,巡航速度為全程航線的巡航速度,不是通過單點航點任務來設置的??梢栽趩吸c航點中更改,間接實現不同的航點以不同的速度運行。

sleep(timeout);

10)獲取巡航速度,以判斷飛行器飛行狀態。

代碼21:獲取飛行參數的代碼

/*! get global cruise speed */

getGlobalCruiseSpeed(timeout);

sleep(timeout);

11)可以測試暫停飛行。

代碼22:暫停飛行的代碼

/*! pause the mission*/

ret = pauseWaypointMission(timeout);

if(ret != ErrorCode::SysCommonErr::Success)

return ret;

sleep(5);

12)測試重啟飛行任務的功能。

代碼23:重啟飛行的代碼

printf("kyle test: pauseWaypointMission and resumeWaypointMission/n");

/*! resume the mission*/

ret = resumeWaypointMission(timeout); //暫停及回復航線指令

if(ret != ErrorCode::SysCommonErr::Success)

return ret;

sleep(50);

2.3.3.3 遠控機載應答機功能

當無人機按照既定設計的航線自動飛行后,就需要考慮標校無人機機載應答機的控制問題。

2.3.3.3.1 功能分析

這部分功能需要根據應答機廠家所提供的API接口進行開發,但是無論是哪家廠家,根據使用者的需求對接,軟件接口至少包含以下內容。

1)開關機控制;

2)信號頻率的選擇;

3)應答機信號發送強度的衰減值;

4)在應答和信標模式之間切換;

5)射頻信號是否允許輸出。

6)網絡通信功能??梢詫⑦@部分功能設計為網絡通信的形式,與近端的應答機控制模塊進行通信,使其控制遠端的應答機。

2.3.3.3.2 程序設計

根據需求分析,可以將功能分為兩部分,一部分是參數設置模塊,一部分是網絡通信模塊。

1)參數設置模塊。設計一個結構體,將所有的參數包含在內,以方便使用和查看。

代碼24:遠控應答機參數設置模塊

Typedef struct

{

unsigned char OnOff;//開關機控制

unsigned char FreqChoose;//頻率選擇

unsigned char Attenuator;//衰減器控制

unsigned char WorkMode;//工作方式

unsigned char SPout;//射頻輸出允許

}

2)網絡通信模塊。

代碼25:遠控應答機網絡通信模塊

QudpSocket *SendudpSocket;

SendudpSocket->writeDatagram(buf,len,QhostAddress(FSendIp),FSendPort);

3 無人機標校應用場景

在某次車載測控設備轉場后,受場地限制,沒有標校桿或者標校塔可供其進行標校,此時,需要起降標校無人機,進行標校。

1)利用無人機標校系統生成飛行軌跡功能,輸入當地的環境因素,如溫濕壓,海拔,以及當地坐標位置等參數,利用OSG在三維仿真空間中,生成飛行軌跡;

2)利用無人機標校系統導入航線的功能,通過OSDK上傳飛行軌跡;

3)利用無人機標校系統控制無人機的功能,控制無人機起飛,并飛行至等待點位置;

4)通過無人機標校系統遠控機載應答機的功能,設置合適的應答機頻點及強度,并開啟應答機;

5)標校無人機根據飛行軌跡實施完畢靜態及動態標校,并返航。

4 結束語

通過設計從生成飛行軌跡、到將飛行軌跡導入飛控并實施以及遠控應答機完整功能的軟件,并配套相應的硬件模塊,提升了無人機標校的可靠性、為后續無人機標校工作的推動提供了一套可行的技術方案。

猜你喜歡
設置
中隊崗位該如何設置
少先隊活動(2021年4期)2021-07-23 01:46:22
船舶防火結構及設置的缺陷與整改
水上消防(2020年5期)2020-12-14 07:16:18
中外醫學專業與專科設置對比分析及啟示
特殊場景下列控等級轉換的設置方案
7招教你手動設置參數
動車段(所)股道有效長設置研究
我國中小學將設置人工智能相關課程
玩具世界(2017年9期)2017-11-24 05:17:29
吃紙的妖怪
本刊欄目設置說明
中俄臨床醫學專業課程設置的比較與思考
主站蜘蛛池模板: 国产成人精品一区二区免费看京| 高清不卡毛片| 日本爱爱精品一区二区| 国产欧美精品午夜在线播放| 亚洲六月丁香六月婷婷蜜芽| 色哟哟色院91精品网站 | 欧美成人第一页| 欧美成人h精品网站| 中文字幕首页系列人妻| 日韩区欧美区| 欧美黑人欧美精品刺激| 国产第一页亚洲| 色有码无码视频| 欧美视频二区| 久久毛片网| 国产在线无码一区二区三区| 无码免费的亚洲视频| 久久无码av三级| 18禁黄无遮挡免费动漫网站 | 在线欧美日韩| 久久免费观看视频| 国产精品尤物在线| 久视频免费精品6| 欧美人与牲动交a欧美精品| 巨熟乳波霸若妻中文观看免费| 在线一级毛片| 中国毛片网| 一本大道香蕉久中文在线播放| 亚洲综合极品香蕉久久网| 国产福利免费在线观看| 欧美日韩在线亚洲国产人| 久久影院一区二区h| 国产精品第一区在线观看| 在线免费a视频| 久久动漫精品| 男人天堂伊人网| 国产91久久久久久| 精品综合久久久久久97超人| 欧美日韩中文字幕在线| 亚洲欧美成人在线视频| 国产成人精彩在线视频50| 国产亚洲一区二区三区在线| 亚洲国产一区在线观看| 国产永久在线视频| 操国产美女| 色老头综合网| 精品人妻一区二区三区蜜桃AⅤ| 国产在线啪| 亚洲一区二区日韩欧美gif| 亚洲福利网址| 国产亚洲精品97AA片在线播放| 国产成人综合在线观看| 99精品视频九九精品| 中文字幕无码制服中字| 2022精品国偷自产免费观看| 欧美激情视频一区| 91精品网站| 免费亚洲成人| 曰韩人妻一区二区三区| 91免费国产在线观看尤物| 免费国产高清精品一区在线| 五月综合色婷婷| www.99在线观看| 国产日韩久久久久无码精品| 91娇喘视频| 中文字幕无码电影| 国产精品福利导航| 欧美精品亚洲日韩a| 2024av在线无码中文最新| 婷五月综合| 亚洲嫩模喷白浆| 成人在线观看不卡| 欧美日韩综合网| 91探花在线观看国产最新| 欧美色综合久久| 亚洲AV无码久久精品色欲| 亚洲天堂色色人体| 亚洲精品动漫| 精品自窥自偷在线看| 亚洲国产91人成在线| 在线视频精品一区| 日韩精品一区二区三区视频免费看|