亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于OSG和OSDK的無(wú)人機(jī)標(biāo)校系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)

        2022-12-26 12:54:58虞炳文蔡紅維丁思煒
        計(jì)算機(jī)測(cè)量與控制 2022年12期
        關(guān)鍵詞:應(yīng)答機(jī)航點(diǎn)標(biāo)校

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

        (西昌衛(wèi)星發(fā)射中心,四川 西昌 615000)

        0 引言

        目前的標(biāo)校,根據(jù)跟蹤目標(biāo)的屬性,可以區(qū)分為對(duì)靜態(tài)目標(biāo)的標(biāo)校以及對(duì)動(dòng)態(tài)目標(biāo)的標(biāo)校。

        對(duì)靜態(tài)目標(biāo)的跟蹤標(biāo)校實(shí)現(xiàn)較為簡(jiǎn)單,但是需要標(biāo)校塔或者標(biāo)校桿配合進(jìn)行,因此受到場(chǎng)地限制的約束較為明顯。

        通過(guò)對(duì)動(dòng)態(tài)目標(biāo)的跟蹤標(biāo)校,較為常見(jiàn)的有三種方式,分別是利用標(biāo)校衛(wèi)星、利用飛機(jī)、利用無(wú)人機(jī)進(jìn)行標(biāo)校。

        利用標(biāo)校衛(wèi)星,即利用天平衛(wèi)星進(jìn)行標(biāo)校,優(yōu)點(diǎn)是簡(jiǎn)單可行,但是此種方法只能對(duì)測(cè)控設(shè)備的跟蹤性能(基帶指標(biāo))進(jìn)行標(biāo)校,對(duì)設(shè)備的動(dòng)態(tài)性能(伺服指標(biāo))則無(wú)法進(jìn)行有效標(biāo)校。

        利用飛機(jī)標(biāo)校,優(yōu)點(diǎn)是對(duì)設(shè)備的跟蹤性能和動(dòng)態(tài)性能都能進(jìn)行有效的檢驗(yàn),但缺點(diǎn)也很明顯,就是成本高昂。

        利用無(wú)人機(jī)進(jìn)行標(biāo)校,優(yōu)點(diǎn)是成本較低,起飛在一定程度上不受場(chǎng)地限制,對(duì)測(cè)控設(shè)備的跟蹤和動(dòng)態(tài)性能在理論上都能進(jìn)行有效的驗(yàn)證,但是缺點(diǎn)是,目前所使用的無(wú)人機(jī)上可攜帶的應(yīng)答機(jī)較為簡(jiǎn)單,以及無(wú)人機(jī)容易受到天氣等因素影響,驗(yàn)證精度無(wú)法得到有效保證。

        而文中通過(guò)對(duì)無(wú)人機(jī)、應(yīng)答機(jī)等的硬件指標(biāo)設(shè)計(jì),對(duì)標(biāo)校相關(guān)軟件設(shè)計(jì),提高無(wú)人機(jī)的標(biāo)??煽啃裕WC其精度,從而保證無(wú)人機(jī)標(biāo)校的可行性。通過(guò)對(duì)無(wú)人機(jī)標(biāo)校系統(tǒng)進(jìn)行功能需求分析,提出了對(duì)于標(biāo)校軟件功能和無(wú)人機(jī)、應(yīng)答機(jī)等硬件指標(biāo)的設(shè)計(jì)與實(shí)現(xiàn),對(duì)于進(jìn)一步提高無(wú)人機(jī)標(biāo)校精度與可靠性,推動(dòng)無(wú)人機(jī)標(biāo)校的應(yīng)用有較強(qiáng)的現(xiàn)實(shí)意義。

        1 無(wú)人機(jī)標(biāo)校存在的問(wèn)題

        在前期開(kāi)展的無(wú)人機(jī)標(biāo)校過(guò)程中,暴露出一些問(wèn)題。

        1)無(wú)人機(jī)在高空中穩(wěn)定性差,容易受到高空風(fēng)等因素影響,導(dǎo)致不能按照既定飛行軌跡飛行。

        2)目前基地正在使用的標(biāo)校無(wú)人機(jī),攜帶的是信標(biāo)機(jī),并非應(yīng)答機(jī),無(wú)應(yīng)答模式。

        3)無(wú)人機(jī)攜帶的信標(biāo)機(jī)的發(fā)射頻點(diǎn)與信號(hào)強(qiáng)度不支持修改。

        4)因機(jī)載信標(biāo)機(jī)較為簡(jiǎn)易,未配備頻標(biāo)設(shè)備,頻率的穩(wěn)定性較差。

        5)飛行軌跡的設(shè)計(jì)依靠無(wú)人機(jī)產(chǎn)家提供的商業(yè)軟件,例如DJI Pilot,并非專(zhuān)業(yè)的標(biāo)校軟件,因此使用上有很多限制,例如在手動(dòng)添加飛行軌跡的路徑點(diǎn)時(shí),難以避免地會(huì)出現(xiàn)點(diǎn)密度較低,點(diǎn)分布不均勻等情況。另外,在飛行軌跡的導(dǎo)入導(dǎo)出格式上,也會(huì)出現(xiàn)不匹配的情況。

        6)專(zhuān)業(yè)的無(wú)人機(jī)標(biāo)校軟件的缺失,導(dǎo)致無(wú)人機(jī)的飛行軌跡的設(shè)計(jì)無(wú)法考慮到很多重要因素,例如被標(biāo)校設(shè)備的指標(biāo)參數(shù),當(dāng)時(shí)當(dāng)?shù)氐淖匀灰蛩氐取?/p>

        2 無(wú)人機(jī)標(biāo)校軟硬件分析設(shè)計(jì)

        在此對(duì)無(wú)人機(jī)標(biāo)校系統(tǒng)進(jìn)行一個(gè)分析及設(shè)計(jì),涉及硬件及軟件內(nèi)容。

        2.1 應(yīng)答機(jī)需求分析及設(shè)計(jì)

        應(yīng)答機(jī)應(yīng)包含六個(gè)模塊,依次為:控制天線、無(wú)線通信模塊、控制模塊、應(yīng)答模塊、射頻天線、供電模塊,應(yīng)答機(jī)示意圖見(jiàn)圖1。

        圖1 應(yīng)答機(jī)平面示意圖

        對(duì)機(jī)載應(yīng)答機(jī)作如下要求:

        1)應(yīng)答機(jī)的重量主要來(lái)源于應(yīng)答機(jī)保護(hù)外殼、無(wú)線通信模塊、應(yīng)答模塊、電池。應(yīng)答機(jī)總重量小于15 kg。

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

        3)應(yīng)答機(jī)外接3S電池。

        4)可通過(guò)地面控制臺(tái)無(wú)線控制應(yīng)答機(jī)信號(hào)開(kāi)關(guān),調(diào)整信號(hào)頻點(diǎn)、調(diào)整信號(hào)強(qiáng)度,切換應(yīng)答及信標(biāo)模式等。

        2.2 標(biāo)校無(wú)人機(jī)需求分析及設(shè)計(jì)

        標(biāo)校無(wú)人機(jī)的重要指標(biāo)為:無(wú)人機(jī)載重與飛行穩(wěn)定性。

        1)無(wú)人機(jī)載重量與無(wú)人機(jī)的電機(jī)、螺旋槳槳葉長(zhǎng)度、螺距等密切相關(guān)。電池、電機(jī)、螺旋槳選型與搭配很重要,一般情況下,整機(jī)重量,應(yīng)該小于電機(jī)最大動(dòng)力的2/5。

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

        3)機(jī)架選用六旋翼機(jī)架,材質(zhì)輕且堅(jiān)固。

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

        5)無(wú)人機(jī)遙控天線與應(yīng)答機(jī)射頻天線、應(yīng)答機(jī)通信控制天線區(qū)分開(kāi)。

        6)無(wú)人機(jī)可同時(shí)接收來(lái)自遙控器及地面控制臺(tái)的控制信號(hào)。遙控器控制無(wú)人機(jī)進(jìn)行飛行操作,地面控制臺(tái)通過(guò)上傳規(guī)劃好的航線驅(qū)動(dòng)無(wú)人機(jī)啟動(dòng)航線飛行。

        無(wú)人機(jī)示意圖見(jiàn)圖2。

        圖2 無(wú)人機(jī)俯視圖

        2.3 無(wú)人機(jī)標(biāo)校軟件需求分析及設(shè)計(jì)

        無(wú)人機(jī)標(biāo)校軟件是為標(biāo)校無(wú)人機(jī)專(zhuān)用設(shè)計(jì)的桌面端應(yīng)用軟件,運(yùn)行在地面控制臺(tái)服務(wù)器上,其作用是能夠根據(jù)測(cè)控設(shè)備及機(jī)載應(yīng)答機(jī)的性能參數(shù)、指標(biāo)要求以及當(dāng)?shù)丨h(huán)境因素,綜合生成一條滿足標(biāo)校需求的飛行軌跡,并且能夠?qū)w行軌跡上傳至無(wú)人機(jī)飛控,驅(qū)動(dòng)標(biāo)校無(wú)人機(jī)實(shí)施飛行計(jì)劃。同時(shí),無(wú)人機(jī)標(biāo)校軟件可以實(shí)現(xiàn)對(duì)機(jī)載應(yīng)答機(jī)的遠(yuǎn)程控制。

        2.3.1 軟件功能

        無(wú)人機(jī)標(biāo)校軟件需要實(shí)現(xiàn)以下三個(gè)功能:

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

        2)將飛行軌跡導(dǎo)入飛控,并實(shí)施;

        3)遠(yuǎn)程控制機(jī)載應(yīng)答機(jī)。

        2.3.2 開(kāi)發(fā)環(huán)境

        軟件部分使用較為成熟的C++開(kāi)發(fā)框架:

        1)操作系統(tǒng):Linux操作系統(tǒng)。

        2)開(kāi)發(fā)語(yǔ)言:C++。

        3)開(kāi)發(fā)工具:Qt及QtCreator。

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

        2.3.3 功能設(shè)計(jì)

        軟件功能設(shè)計(jì)分為三部分進(jìn)行闡述。

        2.3.3.1 生成飛行軌跡功能

        生成飛行軌跡的功能是整個(gè)軟件部分的基礎(chǔ)內(nèi)容。

        2.3.3.1.1 功能分析

        飛行軌跡的規(guī)劃,需要考慮以下幾個(gè)方面的情況:

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

        2)飛行軌跡的約束條件。標(biāo)校無(wú)人機(jī)允許飛行的最大高度與起飛點(diǎn)位置相關(guān)。測(cè)控設(shè)備與應(yīng)答機(jī)之間的最小距離與電磁波傳輸特性有關(guān),即電磁波遠(yuǎn)場(chǎng)距離公式,見(jiàn)公式(1),其中D為天線口徑,λ為電磁波頻率;最遠(yuǎn)距離與測(cè)控設(shè)備與應(yīng)答機(jī)的發(fā)射信號(hào)強(qiáng)度、接收靈敏度有關(guān)。

        3)無(wú)人機(jī)飛行的干擾因素。主要是環(huán)境因素,包括高空風(fēng)、大氣折射率、溫濕壓、太陽(yáng)夾角、月球夾角等。

        4)飛行軌跡的模擬仿真。搭建三維立體場(chǎng)景進(jìn)行模擬仿真,一方面實(shí)現(xiàn)飛行軌跡可視化,一方面驗(yàn)證各參數(shù)的正確性,可選用OpenSceneGraph及osgEarth函數(shù)庫(kù)實(shí)現(xiàn)。

        2.3.3.1.2 程序設(shè)計(jì)

        根據(jù)上述影響分析,對(duì)飛行軌跡的功能作如下設(shè)計(jì)。

        1)設(shè)計(jì)飛行軌跡生成函數(shù)類(lèi),QGenerateTraj。

        2)設(shè)計(jì)一個(gè)結(jié)構(gòu)體trajStruct,包含每個(gè)飛行軌跡跡點(diǎn)的數(shù)據(jù)格式值,見(jiàn)代碼 1,其中T為相對(duì)時(shí)間,X、Y、Z分別為地心固定坐標(biāo)系下的X軸值、Y軸值、Z軸值,Vx、Vy、Vz分別為在X軸、Y軸、Z軸方向的速度分量。

        代碼1:飛行軌跡點(diǎn)結(jié)構(gòu)體

        struct trajStruct{

        int T;

        int X;

        int Y;

        int Z;

        int Vx;

        int Vy;

        int Vz;

        }

        3)函數(shù)emulateTrajectory(),無(wú)返回值,功能為根據(jù)生成的飛行軌跡在三維環(huán)境中進(jìn)行仿真。

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

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

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

        7)函數(shù)setFlyTrajPara(),無(wú)返回值,輸入值為測(cè)試指標(biāo)參數(shù),功能為設(shè)置測(cè)試期望達(dá)到的指標(biāo)參數(shù)。該函數(shù)在setFlyTrajPara()被調(diào)用。在該函數(shù)下,根據(jù)指標(biāo)參數(shù)的不同,分別調(diào)用setElSpeed(int val)設(shè)置方位速度,調(diào)用setElAcceleration(int val)設(shè)置方位加速度,調(diào)用setElJerk(int val)設(shè)置方位加加速度,調(diào)用setAzSpeed(int val)設(shè)置方位速度,調(diào)用setAzAcceleration(int val)設(shè)置方位加速度,調(diào)用setAzJerk(int val)設(shè)置方位加加速度。

        8)函數(shù)setFlyLimitPara(),無(wú)返回值,輸入值為飛行軌跡的限制條件,功能為設(shè)置因設(shè)備性能帶來(lái)的限制條件。該函數(shù)在setFlyTrajPara()被調(diào)用。在該函數(shù)下,根據(jù)指標(biāo)參數(shù)的不同,分別調(diào)用setRadarEmitPower (int val)設(shè)置測(cè)控設(shè)備的發(fā)送功率,調(diào)用setRadarRecvMinVal (int val)設(shè)置測(cè)控設(shè)備的接收靈敏度,調(diào)用setRespEmitPower (int val)設(shè)置應(yīng)答機(jī)的發(fā)送功率,調(diào)用setRespRecvMinVal (int val)設(shè)置應(yīng)答機(jī)的接收靈敏度,調(diào)用setRemoteDist (int val,int fr)設(shè)置并計(jì)算遠(yuǎn)場(chǎng)距離,其中val為天線口徑,fr為電磁波頻率。

        9)函數(shù)setFlyInterPara(),無(wú)返回值,輸入值為環(huán)境因素帶來(lái)的干擾參數(shù),功能為設(shè)置因環(huán)境因素帶來(lái)的干擾。該函數(shù)在setFlyTrajPara()被調(diào)用。在該函數(shù)下,根據(jù)指標(biāo)參數(shù)的不同,分別調(diào)用ifUpperAirWinds(bool ok)設(shè)置是否啟用高空風(fēng)誤差修正,調(diào)用ifAtmosRef(bool ok)設(shè)置是否啟用大氣折射修正,調(diào)用ifTempHumiPressure(bool ok)設(shè)置是否啟用溫濕壓修正,調(diào)用ifSunAngle(bool ok)設(shè)置是否避開(kāi)太陽(yáng)夾角干擾,調(diào)用ifMoonAngle(bool ok)設(shè)置是否避開(kāi)月球夾角干擾。

        函數(shù)調(diào)用關(guān)系見(jiàn)圖3。

        圖3 生成飛行軌跡函數(shù)設(shè)計(jì)

        2.3.3.1.3 關(guān)鍵技術(shù)實(shí)現(xiàn)

        關(guān)鍵技術(shù)主要圍繞與OSG相關(guān)的內(nèi)容。

        2.3.3.1.3.1 三維環(huán)境的搭建

        為搭建一個(gè)高還原度、可測(cè)量、準(zhǔn)確可靠的三維世界,選用開(kāi)源的osgEarth函數(shù)庫(kù)來(lái)實(shí)現(xiàn)。osgEarth是基于OSG函數(shù)庫(kù)二次開(kāi)發(fā)的,專(zhuān)門(mén)用于地理信息系統(tǒng)建模的函數(shù)庫(kù),使用范圍廣,可配置性強(qiáng)。選用osgEarth2.10版本及OSG3.6.4版本進(jìn)行二次開(kāi)發(fā)。

        通過(guò)osgEarth實(shí)現(xiàn)三維建模主要有兩種方法,一種是純代碼形式,所有的配置項(xiàng)通過(guò)代碼中調(diào)用函數(shù)庫(kù)實(shí)現(xiàn);另一種是代碼加配置文件形式,三維地理模型的絕大部分配置內(nèi)容,都可以通過(guò)*.earth文件中的配置項(xiàng)實(shí)現(xiàn)配置。在無(wú)人機(jī)標(biāo)校軟件的設(shè)計(jì)中使用第二種方式。

        2.3.3.1.3.1.1 編寫(xiě)*.earth文件

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

        1)確定空間參考系。空間參考系配置選用geocentric,地固系坐標(biāo)系,即地心為質(zhì)心的空間直角坐標(biāo)系。

        代碼2:空間參考系配置項(xiàng)

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

        代碼3:地形渲染方式配置項(xiàng)

        3)加載高程數(shù)據(jù)。使用加載DEM圖的方式加載高程數(shù)據(jù),DEM圖是一種每個(gè)圖元像素都包含了地理信息,如經(jīng)緯度、高程信息的TIF格式圖。在此使用的DEM圖為包含了中國(guó)范圍內(nèi)的1Km精度的高程信息。加載高程數(shù)據(jù)的操作,可以先貼上一張高程精度較低的DEM圖,然后在此基礎(chǔ)上,根據(jù)需求在特定區(qū)域貼上精度更高的DEM圖,如下圖所示。之所以要選擇不同精度的不同范圍的DEM圖,是因?yàn)榫热绻?,就?huì)導(dǎo)致DEM圖非常大,加載起來(lái)就會(huì)非常困難,因此要合理安排DEM圖的精度。

        代碼4:加載高程數(shù)據(jù)配置項(xiàng)

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

        代碼5:加載紋理信息配置項(xiàng)

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

        代碼6:數(shù)據(jù)緩存的配置項(xiàng)

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

        2.3.3.1.3.1.2 運(yùn)行并顯示三維世界

        因?yàn)檫x用Qt作為開(kāi)發(fā)工具,要將osgEarth顯示的地理模型,顯示在Qt的窗口中。在osgEarth開(kāi)發(fā)中,至少需要配置兩部分內(nèi)容,一是加載三維模型,二是設(shè)置相機(jī)操作器。

        1)加載*.earth模型。

        代碼7:讀取模型的代碼

        osg::Node* pNode =

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

        osgEarth::MapNode* mapNode =

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

        2)初始化相機(jī)操作器,即相機(jī)參數(shù)。osgEarth的界面顯示,實(shí)際上是將顯示界面當(dāng)作一個(gè)攝像頭,顯示的是攝像機(jī)視角。

        代碼8:設(shè)置相機(jī)操作器的代碼

        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());//添加到場(chǎng)景

        pViewer->realize();

        2.3.3.2 航線導(dǎo)入飛控并實(shí)施功能

        在生成了航線之后,就需要考慮如何將該航線轉(zhuǎn)換為無(wú)人機(jī)可識(shí)別的格式并上傳使用。

        2.3.3.2.1 功能分析

        實(shí)現(xiàn)飛行軌跡的導(dǎo)入,需要解決幾方面的問(wèn)題。

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

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

        3)驅(qū)動(dòng)飛行器按既定飛行軌跡飛行。

        2.3.3.2.2 程序設(shè)計(jì)

        大疆無(wú)人機(jī)設(shè)備基于C++的二次開(kāi)發(fā),大疆官方提供了OSDK開(kāi)發(fā)工具包,目前最新的版本為V4.0.0。

        2.3.3.2.2.1 DJI OSDK簡(jiǎn)介

        在此介紹OSDK開(kāi)發(fā)包。

        1)DJI OSDK是由大疆自主開(kāi)發(fā)的一個(gè)運(yùn)行于桌面端的軟件庫(kù),貼合用戶自主進(jìn)行二次開(kāi)發(fā)的需要,可個(gè)性定制對(duì)無(wú)人機(jī)在飛行中與自動(dòng)化相關(guān)的的需求,其提供了一些基礎(chǔ)的API,用于實(shí)現(xiàn)基本的運(yùn)動(dòng)規(guī)劃功能;開(kāi)發(fā)者在使用調(diào)用規(guī)劃相關(guān)的庫(kù)的同時(shí),可以根據(jù)個(gè)人需要,對(duì)功能進(jìn)一步擴(kuò)展,可根據(jù)實(shí)際的使用需求,設(shè)計(jì)并編寫(xiě)相應(yīng)的航點(diǎn)任務(wù)以及熱點(diǎn)任務(wù),制定一套個(gè)性化控制無(wú)人機(jī)自動(dòng)化飛行的控制邏輯。

        2)在無(wú)人機(jī)標(biāo)校中主要用到的功能是航點(diǎn)規(guī)劃的功能。航點(diǎn)規(guī)劃,簡(jiǎn)單來(lái)說(shuō)就是通過(guò)設(shè)置一系列的軌跡點(diǎn),連接成線,然后將航跡上傳給無(wú)人機(jī),指令控制無(wú)人機(jī)按照指定的航線啟動(dòng)飛行,實(shí)現(xiàn)無(wú)人機(jī)根據(jù)既定航線自動(dòng)化飛行的控制功能。開(kāi)發(fā)者通過(guò)調(diào)用DJI OSDK 的API接口,能夠控制無(wú)人機(jī)以指定的高度、方向飛往既定的位置,并且執(zhí)行約定好的動(dòng)作,根據(jù)任務(wù)需求,還可以編寫(xiě)更多的任務(wù)動(dòng)作,控制無(wú)人機(jī)多次重復(fù)執(zhí)行該任務(wù),以此實(shí)現(xiàn)多輪次標(biāo)校的功能。

        3)開(kāi)發(fā)者在代碼開(kāi)發(fā)中,調(diào)用航點(diǎn)任務(wù)相關(guān)的API,需要指定的參數(shù)為航點(diǎn)數(shù)量和對(duì)應(yīng)的航點(diǎn)類(lèi)型。航點(diǎn)數(shù)量在最新版本的API中,最多可設(shè)置65535個(gè)點(diǎn)。航點(diǎn)類(lèi)型主要包含三種飛行模式,分別為曲率飛行、直線飛行和協(xié)調(diào)轉(zhuǎn)彎。

        4)OSDK庫(kù)文件同時(shí)還為開(kāi)發(fā)者提供了更多方便簡(jiǎn)潔的功能,以便直接調(diào)用,比如對(duì)速度的控制功能,開(kāi)發(fā)者能夠按照既定任務(wù)要求,為不同的航點(diǎn)配置不同的速度,當(dāng)然,也可以為同一個(gè)航點(diǎn)設(shè)置多個(gè)速度。另外,在無(wú)人機(jī)執(zhí)行航線飛行任務(wù)時(shí),修改或查詢(xún)無(wú)人機(jī)全局巡航速度等的狀態(tài)數(shù)據(jù)的函數(shù),也是事先寫(xiě)好,可以直接調(diào)用的。

        2.3.3.2.2.2 主要函數(shù)類(lèi)

        為實(shí)現(xiàn)航點(diǎn)任務(wù)功能,利用OSDK函數(shù)庫(kù),主要將設(shè)計(jì)到以下幾個(gè)代碼文件:

        1)dji_mission_type.hpp文件。該文件主要用于定義在航線自動(dòng)飛行中會(huì)用到的一些數(shù)據(jù)的結(jié)構(gòu)體文件,主要的內(nèi)容為WaypointV2結(jié)構(gòu)體,其中主要涉及到的內(nèi)容有:longitude為精度值,latitude為緯度值,relativeHeight為高程值,maxFlightSpeed為最大速度值,autoFlightSpeed為自動(dòng)巡航速度值。

        代碼9:WaypointV2結(jié)構(gòu)體內(nèi)容

        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文件。在這部分代碼中,主要實(shí)現(xiàn)的是對(duì)航線任務(wù)的控制函數(shù),start()實(shí)現(xiàn)啟動(dòng)任務(wù),stop()實(shí)現(xiàn)停止任務(wù),pause()實(shí)現(xiàn)暫停任務(wù),resume()實(shí)現(xiàn)重啟任務(wù)。

        代碼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類(lèi)為主要功能實(shí)現(xiàn)的類(lèi),在該類(lèi)中主要涉及到的函數(shù)有,init(WayPointV2InitSettings *info,int timeout)函數(shù)為實(shí)現(xiàn)該類(lèi)函數(shù)的初始化操作,其中WayPointV2InitSettings為航線任務(wù)結(jié)構(gòu)體,在該結(jié)構(gòu)體中主要規(guī)定了任務(wù)ID值,missionID,任務(wù)重復(fù)次數(shù)repeatTimes,航線結(jié)束時(shí)的動(dòng)作finishedAction,最大飛行速度maxFlightSpeed,自動(dòng)飛行速度autoFlightSpeed,前往第一個(gè)任務(wù)點(diǎn)的方式gotoFirstWaypointMode,以及裝載了任務(wù)航點(diǎn)的容器mission。downloadInitSetting()即從飛控設(shè)備下載航跡任務(wù)的初始化配置信息。start()函數(shù)用于啟動(dòng)航線任務(wù),stop()為停止航線任務(wù),pause()函數(shù)用于暫停飛行任務(wù),resume()用于重啟飛行任務(wù),注意到,start()、stop()、pause()、resume()四個(gè)函數(shù)都繼承自dji_mission_base.hpp代碼。uploadMission()函數(shù)用于上傳任務(wù)航線,downloadMission()用于下載在飛控中的任務(wù)航線。uploadAction()用于上傳飛行器動(dòng)作。RegisterMissionEventCallback()和RegisterMissionStateCallback()分別用于反饋目前的動(dòng)作和狀態(tài)信息。

        代碼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 流程設(shè)計(jì)

        航線導(dǎo)入并啟動(dòng)的功能實(shí)施流程如下:

        1)在之前已經(jīng)設(shè)計(jì)好航線的前提下,需要將該航行的數(shù)據(jù)點(diǎn)存儲(chǔ)模式修改為大疆指定的數(shù)據(jù)點(diǎn)存儲(chǔ)方式;

        2)將生成的航線通過(guò)API調(diào)用上傳航線任務(wù)的整體信息。

        3)一個(gè)航點(diǎn)任務(wù)包含航線飛行任務(wù)的ID、航點(diǎn)任務(wù)的航點(diǎn)數(shù)、任務(wù)重復(fù)次數(shù)、航點(diǎn)任務(wù)結(jié)束后的動(dòng)作、最大飛行速度和巡航速度。

        4)上傳航點(diǎn)信息基礎(chǔ)參數(shù):航點(diǎn)坐標(biāo)(設(shè)置航點(diǎn)的經(jīng)度、緯度和相對(duì)于起飛點(diǎn)的高度)、航點(diǎn)類(lèi)型、航向類(lèi)型和飛行速度??蛇x參數(shù):緩沖距離、航向角度、轉(zhuǎn)向模式、興趣點(diǎn)、單點(diǎn)最大飛行速度、單點(diǎn)巡航速度。

        5)將航線任務(wù)上傳至標(biāo)校無(wú)人機(jī)飛控。

        6)控制無(wú)人機(jī)執(zhí)行航點(diǎn)任務(wù)。上傳完成后,標(biāo)校無(wú)人機(jī)可通過(guò)開(kāi)發(fā)者之前預(yù)設(shè)的動(dòng)作,如開(kāi)始、停止或暫停任務(wù)、設(shè)置或獲取巡航速度等。

        2.3.3.2.2.4 程序?qū)崿F(xiàn)

        本章節(jié)內(nèi)容旨在將上一章節(jié)內(nèi)容以代碼實(shí)現(xiàn)。

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

        代碼12:判斷函數(shù)是否支持功能

        if (!vehiclePtr->isM300()) {

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

        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)而后創(chuàng)建mission任務(wù),初始化mission任務(wù),用到initMissionSetting()函數(shù),該函數(shù)實(shí)現(xiàn)了任務(wù)初始化配置的功能,部分代碼見(jiàn)代碼7內(nèi)容。

        代碼13:上傳任務(wù)的代碼

        /*! init mission */ /* 初始化mission任務(wù) */

        ret = initMissionSetting(timeout);

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

        return ret;

        sleep(timeout);

        3)其中代碼8中為添加航跡點(diǎn)的核心代碼。是initMissionSetting代碼中內(nèi)容,通過(guò)這段代碼,添加每個(gè)航點(diǎn)信息。

        代碼14:上傳任務(wù)的代碼

        /*! 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的內(nèi)容是在代碼8中進(jìn)一步展開(kāi),特別將generatePolygonWaypoints()函數(shù)單獨(dú)講解,這部分內(nèi)容是generatePolygonWaypoints()函數(shù)的內(nèi)容。該函數(shù)實(shí)現(xiàn)了航點(diǎn)數(shù)據(jù)的添加功能。這一步函數(shù)調(diào)用,也是實(shí)現(xiàn)在飛行軌跡設(shè)計(jì)完成之后,將設(shè)計(jì)的航跡進(jìn)行轉(zhuǎn)換,使得無(wú)人機(jī)飛控可以使用的關(guān)鍵。

        代碼15:上傳任務(wù)的代碼

        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)而后將自定義的航線任務(wù)上傳至無(wú)人機(jī)飛控。見(jiàn)代碼8內(nèi)容。

        代碼16:上傳任務(wù)的代碼

        /*! upload mission */

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

        int uploadMissionTimeOut = 3;

        ret = uploadWaypointMission(uploadMissionTimeOut); /* 上傳任務(wù),注意注釋部分,這里的超時(shí)需要設(shè)置為3s, 設(shè)置為1時(shí),可能因?yàn)樯蟼魅蝿?wù)過(guò)多,報(bào)index錯(cuò)誤*/

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

        return ret;

        sleep(timeout);

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

        代碼17:下載并檢查任務(wù)的代碼

        /*! download mission */ /* 下載任務(wù),可以查看對(duì)比上傳的任務(wù) debug的時(shí)候可以用來(lái)對(duì)比排查問(wèn)題 */

        std::vector mission;

        ret = downloadWaypointMission(mission, timeout);

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

        return ret;

        sleep(timeout);

        7)而后上傳在航線進(jìn)行過(guò)程中,需要涉及的一些飛行器動(dòng)作。

        代碼18:上傳飛行器動(dòng)作的代碼

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

        /*! check action memory */

        ret = getActionRemainMemory(actionMemory, timeout); //上傳action前先檢查action容量,避免上傳的任務(wù)過(guò)多導(dǎo)致action被擠掉了,執(zhí)行動(dòng)作可能不完整。最大貌似為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)開(kāi)始執(zhí)行飛行任務(wù)。

        代碼19:開(kāi)始執(zhí)行飛行任務(wù)的代碼

        /*! start mission */

        ret = startWaypointMission(timeout); //開(kāi)始執(zhí)行

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

        return ret;

        sleep(20);

        9)設(shè)置飛行過(guò)程中的一些參數(shù),比如最大飛行速度等。

        代碼20:設(shè)置飛行參數(shù)的代碼

        /*! set global cruise speed */

        setGlobalCruiseSpeed(1.5, timeout); //設(shè)置巡航速度,巡航速度為全程航線的巡航速度,不是通過(guò)單點(diǎn)航點(diǎn)任務(wù)來(lái)設(shè)置的??梢栽趩吸c(diǎn)航點(diǎn)中更改,間接實(shí)現(xiàn)不同的航點(diǎn)以不同的速度運(yùn)行。

        sleep(timeout);

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

        代碼21:獲取飛行參數(shù)的代碼

        /*! get global cruise speed */

        getGlobalCruiseSpeed(timeout);

        sleep(timeout);

        11)可以測(cè)試暫停飛行。

        代碼22:暫停飛行的代碼

        /*! pause the mission*/

        ret = pauseWaypointMission(timeout);

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

        return ret;

        sleep(5);

        12)測(cè)試重啟飛行任務(wù)的功能。

        代碼23:重啟飛行的代碼

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

        /*! resume the mission*/

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

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

        return ret;

        sleep(50);

        2.3.3.3 遠(yuǎn)控機(jī)載應(yīng)答機(jī)功能

        當(dāng)無(wú)人機(jī)按照既定設(shè)計(jì)的航線自動(dòng)飛行后,就需要考慮標(biāo)校無(wú)人機(jī)機(jī)載應(yīng)答機(jī)的控制問(wèn)題。

        2.3.3.3.1 功能分析

        這部分功能需要根據(jù)應(yīng)答機(jī)廠家所提供的API接口進(jìn)行開(kāi)發(fā),但是無(wú)論是哪家廠家,根據(jù)使用者的需求對(duì)接,軟件接口至少包含以下內(nèi)容。

        1)開(kāi)關(guān)機(jī)控制;

        2)信號(hào)頻率的選擇;

        3)應(yīng)答機(jī)信號(hào)發(fā)送強(qiáng)度的衰減值;

        4)在應(yīng)答和信標(biāo)模式之間切換;

        5)射頻信號(hào)是否允許輸出。

        6)網(wǎng)絡(luò)通信功能??梢詫⑦@部分功能設(shè)計(jì)為網(wǎng)絡(luò)通信的形式,與近端的應(yīng)答機(jī)控制模塊進(jìn)行通信,使其控制遠(yuǎn)端的應(yīng)答機(jī)。

        2.3.3.3.2 程序設(shè)計(jì)

        根據(jù)需求分析,可以將功能分為兩部分,一部分是參數(shù)設(shè)置模塊,一部分是網(wǎng)絡(luò)通信模塊。

        1)參數(shù)設(shè)置模塊。設(shè)計(jì)一個(gè)結(jié)構(gòu)體,將所有的參數(shù)包含在內(nèi),以方便使用和查看。

        代碼24:遠(yuǎn)控應(yīng)答機(jī)參數(shù)設(shè)置模塊

        Typedef struct

        {

        unsigned char OnOff;//開(kāi)關(guān)機(jī)控制

        unsigned char FreqChoose;//頻率選擇

        unsigned char Attenuator;//衰減器控制

        unsigned char WorkMode;//工作方式

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

        }

        2)網(wǎng)絡(luò)通信模塊。

        代碼25:遠(yuǎn)控應(yīng)答機(jī)網(wǎng)絡(luò)通信模塊

        QudpSocket *SendudpSocket;

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

        3 無(wú)人機(jī)標(biāo)校應(yīng)用場(chǎng)景

        在某次車(chē)載測(cè)控設(shè)備轉(zhuǎn)場(chǎng)后,受場(chǎng)地限制,沒(méi)有標(biāo)校桿或者標(biāo)校塔可供其進(jìn)行標(biāo)校,此時(shí),需要起降標(biāo)校無(wú)人機(jī),進(jìn)行標(biāo)校。

        1)利用無(wú)人機(jī)標(biāo)校系統(tǒng)生成飛行軌跡功能,輸入當(dāng)?shù)氐沫h(huán)境因素,如溫濕壓,海拔,以及當(dāng)?shù)刈鴺?biāo)位置等參數(shù),利用OSG在三維仿真空間中,生成飛行軌跡;

        2)利用無(wú)人機(jī)標(biāo)校系統(tǒng)導(dǎo)入航線的功能,通過(guò)OSDK上傳飛行軌跡;

        3)利用無(wú)人機(jī)標(biāo)校系統(tǒng)控制無(wú)人機(jī)的功能,控制無(wú)人機(jī)起飛,并飛行至等待點(diǎn)位置;

        4)通過(guò)無(wú)人機(jī)標(biāo)校系統(tǒng)遠(yuǎn)控機(jī)載應(yīng)答機(jī)的功能,設(shè)置合適的應(yīng)答機(jī)頻點(diǎn)及強(qiáng)度,并開(kāi)啟應(yīng)答機(jī);

        5)標(biāo)校無(wú)人機(jī)根據(jù)飛行軌跡實(shí)施完畢靜態(tài)及動(dòng)態(tài)標(biāo)校,并返航。

        4 結(jié)束語(yǔ)

        通過(guò)設(shè)計(jì)從生成飛行軌跡、到將飛行軌跡導(dǎo)入飛控并實(shí)施以及遠(yuǎn)控應(yīng)答機(jī)完整功能的軟件,并配套相應(yīng)的硬件模塊,提升了無(wú)人機(jī)標(biāo)校的可靠性、為后續(xù)無(wú)人機(jī)標(biāo)校工作的推動(dòng)提供了一套可行的技術(shù)方案。

        猜你喜歡
        應(yīng)答機(jī)航點(diǎn)標(biāo)校
        基于目標(biāo)模擬器的跟蹤雷達(dá)無(wú)塔標(biāo)校實(shí)現(xiàn)方法
        衛(wèi)星測(cè)控應(yīng)答機(jī)的接收機(jī)在軌性能評(píng)估方法
        航天器工程(2021年2期)2021-04-28 08:41:48
        一種用于導(dǎo)航雷達(dá)標(biāo)校的專(zhuān)用AIS設(shè)備
        電子制作(2019年7期)2019-04-25 13:17:42
        飛機(jī)應(yīng)答機(jī)的奧秘
        基于移動(dòng)站的轉(zhuǎn)發(fā)式地面站設(shè)備時(shí)延標(biāo)校方法
        二次開(kāi)發(fā)在航點(diǎn)航跡圖批量繪制中的應(yīng)用
        航管應(yīng)答機(jī)退敏和恢復(fù)的設(shè)計(jì)研究
        電子制作(2017年23期)2017-02-02 07:16:51
        星載測(cè)控應(yīng)答機(jī)抗輻射加固與可靠性平臺(tái)研究
        載波相位DGPS標(biāo)校系統(tǒng)時(shí)間同步設(shè)計(jì)與仿真
        久久香蕉国产线看观看精品yw| 色婷婷精品国产一区二区三区 | 亚洲 都市 校园 激情 另类| 大伊香蕉精品视频一区| 男女一区视频在线观看| 亚洲熟妇av一区二区三区 | 最新国产不卡在线视频| 免费看av在线网站网址| 日本高清一区二区三区水蜜桃| 国产精品国产自线拍免费| 亚洲国产成人av毛片大全| 夹得好湿真拔不出来了动态图| 国产性一交一乱一伦一色一情| 日本理论片一区二区三区| 亚洲乱码中文字幕第一页| 国产午夜av秒播在线观看| 色八区人妻在线视频免费| 色窝窝无码一区二区三区2022| 蜜桃色av一区二区三区麻豆 | 国产乱码人妻一区二区三区| 色八区人妻在线视频免费| 中文字幕久久久久久久系列| 精品国产a毛片久久久av| 久久99国产精品久久| 九九视频在线观看视频6| 久久久久国产精品四虎| 色综合悠悠88久久久亚洲| 亚洲国产av无码专区亚洲av| 屁屁影院一区二区三区| 青春草在线观看免费视频| 蜜桃成熟时在线观看免费视频| 国产suv精品一区二区883 | 日日骚一区二区三区中文字幕| 国语对白免费观看123| 97精品一区二区视频在线观看| 亚洲AV毛片无码成人区httP| 久久夜色精品国产三级| 欧洲成人一区二区三区| 中文亚洲av片在线观看不卡| 国产香蕉一区二区三区| 成人国产一区二区三区 |