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