曹鳳海,宋占武,李 燕,劉 瀟,喬永杰,黃興琪
(東方地球物理公司,河北 涿州 072750)
?
無人機航攝拍照瞬間精確空間位置的確定
曹鳳海,宋占武,李燕,劉瀟,喬永杰,黃興琪
(東方地球物理公司,河北 涿州 072750)
近年來,隨著無人機與數(shù)碼相機技術的發(fā)展,無人機航測以其高效、精確、作業(yè)成本低、適用范圍廣等特點,在地表復雜地區(qū)高分辨率影像的獲取方面優(yōu)勢明顯。無人機像片后續(xù)處理需要布設大量像控點,工作量大,耗時耗力,特別是在地表復雜地區(qū)。如果通過衛(wèi)星定位的手段計算出拍照瞬間照片中心的精確位置和姿態(tài),則可以節(jié)省大量施工投入,有效提高生產(chǎn)效率。本文即利用PPK作業(yè)方式進行航攝拍照瞬間空間位置的確定以進行研究。
一、硬件配置
利用ARM板配GNSSOEM板組成簡單的GNSS接收機。通過綜合測試并考慮體積方面的要求,建議GNSSOEM板采用Trimble公司的BD930板卡;為了適應控制過程中的多線程操作,ARM板配WinCE操作系統(tǒng),要用兩個串口與GNSS差分板連接,其中一個記錄原始數(shù)據(jù),另一個輸出NMEA數(shù)據(jù)。
二、整體設計
系統(tǒng)整體設計思路為:在地面控制點架設基站持續(xù)接收GNSS定位數(shù)據(jù);空中(機載)ARM板持續(xù)記錄GNSS定位數(shù)據(jù),接收飛控拍照指令,收到飛控指令后控制相機拍照并記錄拍照的精確時刻;施工完成后,地面基站和空中GNSS數(shù)據(jù)聯(lián)合處理,計算出每個歷元(根據(jù)設置參數(shù)記錄,如果設置成5Hz,則每200ms一個歷元)的精確坐標,根據(jù)記錄的拍照精確時間內插出每個拍照點的坐標。本文只討論空中數(shù)據(jù)記錄和控制部分的幾個關鍵問題的解決思路。
三、空中數(shù)據(jù)記錄和控制部分的幾個關鍵問題解決思路
1. 精確時刻的確定
GNSS差分板在鎖定衛(wèi)星后會通過一個針腳發(fā)送PPS信號,將該針腳引到ARM板的“中斷”接口,通過監(jiān)控該脈沖的到來確定每秒開始的精確時刻。
為了應用方便,在WinCE底層驅動中,將“PPS到達”寫成事件驅動,具體過程如下:
1) 將與GNSS的PPS連接的針腳配置成“中斷模式”。
2) 建立通知用戶事件,命名為“GPS1PPS”:
g_hUserEvent=CreateEvent(NULL,FALSE,FALSE,_T("GPS1PPS"));
其中,“g_hUserEvent”為用戶事件句柄。
3) 建立中斷事件:
g_hEINT3Event=CreateEvent(NULL,FALSE,FALSE,NULL);
4) 初始化中斷事件:
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_IRQ,sizeof(UINT32), &g_SYSINTR,sizeof(UINT32),NULL);
其中,“g_IRQ”是采用的中斷號,在筆者的實際設計中,該針腳接到了“中斷3”,即“g_IRQ=IRQ_EINT3”。
5) 建立中斷服務線程:
hPPS=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadForEINT3,0,0,NULL);
6) 服務線程函數(shù)實現(xiàn):
DWORDWINAPIThreadForEINT3(void){
DWORDdwResult;
while(TRUE)
{
dwResult=WaitForSingleObject(g_hEINT3Event,INFINITE);
SetEvent(g_hUserEvent);
InterruptDone(g_SYSINTR);
}
return0;
}
該線程函數(shù)一直接收PPS信號,當PPS信號到達“中斷3”,該函數(shù)從驅動層向應用層產(chǎn)生事件報告。
7) 應用層捕獲PPS到達事件。建立線程,接收驅動層發(fā)上來的“GPS1PPS”事件,該事件發(fā)生后,記錄該時刻:
DWORDWINAPIGPS1PPSThread(LPVOIDlpParameter){
HANDLEhGPS1PPSEvent=NULL;
hGPS1PPSEvent=OpenEvent(EVENT_ALL_ACCESS,FALSE,TEXT("GPS1PPS"));
while(1)
{
WaitForSingleObject(hGPS1PPSEvent,INFINITE);
m_dPPSTick=GetTickCount64();
}
return1;
}
由于PPS只提供每秒開始的精確時刻,要得到任意一時刻的精確時間,需要以PPS時刻為基礎加上到需要確定時刻的偏移值,該偏移值的確定需要用其他方式定時。為了應用方便,筆者利用CPU距開機以來的時間進行相對定時,即需要確定時刻的時間=PPS時刻+(需要確定時刻的CPU定時-PPS時刻的CPU定時)。
為了得到精確的CPU開機以來的時間,重寫“GetTickCount64()”函數(shù):
doubleGetTickCount64(){
staticLARGE_INTEGERTicksPerSecond= {0};
LARGE_INTEGERTick;
if(!TicksPerSecond.QuadPart)
{
QueryPerformanceFrequency(&TicksPerSecond);
}
QueryPerformanceCounter(&Tick);
doubleRet= (double)Tick.QuadPart*1000.0/TicksPerSecond.QuadPart;
returnRet;
}
該方法的實現(xiàn)思路為:首先獲得CPU時鐘到該時刻的震動次數(shù),然后獲取CPU時鐘每秒鐘的震動次數(shù)(震動頻率),其比值即為開機以來的秒數(shù),該方法定時精度很高。
2. 捕獲飛控拍照指令信號
飛控發(fā)送的拍照指令是一個閉合信號(短路信號),如果要捕捉到該信號并產(chǎn)生中斷事件,需要通過邏輯電路將閉合信號轉換成電平信號,邏輯實現(xiàn)思路如下:
如圖1所示,一般情況下DI_A與DI_B不閉合,Q1截止,XEINT2為高電平;當DI_A與DI_B閉合時Q1導通,XEINT2由高電平變成低電平,即產(chǎn)生下降沿,發(fā)生中斷。當DI_A與DI_B由閉合到斷開后,Q1則從導通變?yōu)榻刂範顟B(tài),XEINT2由低電平變成高電平,即上升沿,不產(chǎn)生中斷。
閉合信號轉換為電平信號后,實現(xiàn)中斷的驅動和應用層事件的捕獲思路與處理PPS事件的道理相同,在筆者的實際設計中,該針腳接到了“中斷2”, 中斷觸發(fā)方式為下降沿觸發(fā)。應用層接收到拍照信號后,由ARM板產(chǎn)生觸發(fā)相機拍照指令,并記錄拍照瞬間的精確時刻。
圖1 實現(xiàn)原理
3. GNSS原始數(shù)據(jù)記錄
本文采用“雙緩沖”的方式接收和記錄GNSS原始數(shù)據(jù),具體實現(xiàn)思路如下:
1) 定義兩個byte類數(shù)組,根據(jù)實現(xiàn)情況定義大小,可以是64KB或更大。
2) 用一個變量記錄當前工作于哪個數(shù)組,另外用兩個變量記錄兩個byte數(shù)組存儲數(shù)據(jù)長度。
3) 當接收到GNSS原始數(shù)據(jù),將其存儲到當前工作byte數(shù)組,如果當前數(shù)組已保存部分數(shù)據(jù),則將新數(shù)據(jù)連接到原有數(shù)據(jù)后面,為了提高數(shù)據(jù)轉存效率,用“memcpy”內存拷貝的方法。
4) 當當前工作byte數(shù)組存儲數(shù)據(jù)達到指定的長度,則將當前工作byte數(shù)組指定為另一個byte數(shù)組,同時啟動一個新的線程將達到指定長度的數(shù)據(jù)寫到Flash。
5) 兩個數(shù)組交替進行存儲數(shù)據(jù),配合多線程寫Flash方式,接收GNSS原始數(shù)據(jù)和記錄兩不耽誤,達到“雙緩沖”的效果。
4. 各線程的優(yōu)先級
根據(jù)實際工作要求,對各線程優(yōu)先級作以下設計:
1)PPS線程優(yōu)先線設為“高”。
2) 捕獲飛控拍照指令信號線程優(yōu)先級設為“一般”。
3)GNSS原始數(shù)據(jù)記錄線程優(yōu)先級設置為“一般”。
四、結束語
在無人機低空航拍技術迅速發(fā)展的今天,如何提高作業(yè)效率、精度和質量是行業(yè)內一直追求的目標,本文從實用的角度闡述了利用PPK技術解決確定相機在空中拍照瞬間空間位置的思路。
本文只對該方法實現(xiàn)思路的幾個關鍵問題進行了描述,且只涉及了原始數(shù)據(jù)采集部分,如果要實現(xiàn)產(chǎn)品化的應用,還需要諸多的輔助技術、空中姿態(tài)數(shù)據(jù)的獲取及后處理應用相關的開發(fā)。
(本專欄由天寶測量部和本刊編輯部共同主辦)
天寶測繪解決方案專欄