吳浩 周愛軍
1.海軍大連艦艇學(xué)院學(xué)員五大隊(duì),遼寧大連 116018;2.海軍大連艦艇學(xué)院航海系,遼寧大連 116018
傳統(tǒng)天文航海定位方法通常是利用六分儀測量某一時(shí)刻多個(gè)天體的高度,或某個(gè)天體多個(gè)時(shí)刻的高度,然后通過“高度差法”得到測者位置經(jīng)緯度。這種定位方法的信標(biāo)為自然天體,具有設(shè)備簡單、不受電磁干擾等優(yōu)點(diǎn)。現(xiàn)在電磁環(huán)境日趨復(fù)雜,衛(wèi)星導(dǎo)航和無線電導(dǎo)航等系統(tǒng)容易受到干擾,天文定位因其自主性好的獨(dú)特優(yōu)點(diǎn)具有重要保底作用。但是,傳統(tǒng)六分儀觀測天體高度存在以下不足:一是六分儀觀測天體高度必須要能同時(shí)看清天體和水天線,觀測時(shí)機(jī)大為受限,如測星只能在晨光昏影時(shí)段;二是對(duì)觀測的高度值需要進(jìn)行蒙氣差、眼高差等一系列修正,且靠手工查算表冊(cè),過程繁雜,容易出錯(cuò),觀測天體高度的速度和精度非常依賴測者的業(yè)務(wù)能力,需要花費(fèi)較大精力進(jìn)行經(jīng)常性訓(xùn)練。移動(dòng)智能平臺(tái)(手機(jī)或平板電腦)和傳感器技術(shù)的快速發(fā)展,為實(shí)現(xiàn)開發(fā)天體高度觀測App 提供了軟硬件支持。針對(duì)傳統(tǒng)方法用六分儀觀測天體高度的存在問題,開發(fā)了一款基于Android 平臺(tái)的天體高度方位觀測App,在不借助手機(jī)基站信號(hào)和衛(wèi)星導(dǎo)航信號(hào)的前提下,利用手機(jī)傳感器觀測天體得到高度值。
Android 手機(jī)以價(jià)格低廉,便于攜帶,硬件性能良好等特點(diǎn)被廣泛使用,其帶有加速度、磁場、陀螺儀、光學(xué)和壓力等多種傳感器[1]。手機(jī)或平板內(nèi)的傳感器一般都是大規(guī)模集成電路芯片,除了傳感器還包括信號(hào)調(diào)節(jié)、數(shù)據(jù)處理和通信電路。其中,加速度傳感器常被用于測量物體受到重力在內(nèi)的外力所產(chǎn)生的加速度[2]。單軸加速度傳感器計(jì)算角度采用正弦或余弦函數(shù),靈敏度是非線性的。三軸加速度傳感器計(jì)算角度采用反正切函數(shù),某個(gè)軸的輸出與另兩軸的輸出平方根進(jìn)行比較,可以穩(wěn)定靈敏度[3]。
以華為P20Pro 手機(jī)為例,加速度傳感器和陀螺儀的芯片為ICM-20690。ICM-20690 芯片尺寸為2.5 mm ×3 mm×0.91 mm,集成了一個(gè)三軸陀螺儀和一個(gè)三軸加速度計(jì),在不需要參照靜止坐標(biāo)系前提下,可分別測量角速度和線加速度,并可通過處理測量所得數(shù)據(jù)跟蹤運(yùn)動(dòng)物體的位置和方向,其加速度傳感器的性能指標(biāo)如表1 所示[4]。
表1 ICM-20690 加速度傳感器性能指標(biāo)
手機(jī)內(nèi)置的加速度傳感器一般使用三維坐標(biāo)來確定角度和方向。當(dāng)手機(jī)屏幕朝上平放時(shí),與手機(jī)屏幕垂直的為z軸,與手機(jī)屏幕在同一平面且互相垂直的分別為x、y軸,如圖1 所示。加速度傳感器在x、y、z軸的輸出分別為AX、AY和AZ。
天體高度觀測的實(shí)質(zhì)是角度測量,因此可使用手機(jī)內(nèi)置加速度傳感器測量天體高度。首先通過光學(xué)攝像頭瞄準(zhǔn)天體,并使其位于十字準(zhǔn)星點(diǎn)上;調(diào)整手機(jī)姿態(tài),使手機(jī)的上下邊緣與水平面基本平行,相當(dāng)于手機(jī)攝像頭的CCD 平面垂直于天體光線;采用反正切函數(shù)進(jìn)行角度計(jì)算,計(jì)算公式為:
其中,θ為加速度傳感器內(nèi)部軸線(y軸)與鉛垂線的夾角;AX、AY和AZ分別為加速度傳感器在x、y、z軸的輸出。同時(shí),程序檢測重力在手機(jī)坐標(biāo)系x軸方向上加速度分量AX是否近似為0,當(dāng)AX近似為0 時(shí),進(jìn)行角度計(jì)算,計(jì)算公式簡化為:
觀測天體高度原理如圖2 所示,手機(jī)坐標(biāo)系z(mì)軸與鉛垂線的夾角α為天體頂距,天體高度h和θ均為α的余角,因此天體高度h等于θ。
天體高度測量功能主要利用手機(jī)內(nèi)置光學(xué)傳感器(相機(jī))、加速度傳感器來實(shí)現(xiàn)。程序框圖如圖3 所示,首先選擇所觀測的天體,便于數(shù)據(jù)存儲(chǔ);然后實(shí)例化相機(jī)和加速度傳感器;將手機(jī)對(duì)準(zhǔn)天體,計(jì)算并顯示天體高度。
Android 系統(tǒng)中調(diào)用加速度傳感器是通過調(diào)用getSystemService 函數(shù),傳遞TYPE_ACCELEROMETER參數(shù),并設(shè)置傳感器事件監(jiān)聽器來回傳加速度傳感器的值,具體分為四個(gè)步驟:
第一步是獲取傳感器實(shí)例,在Activity 中聲明一個(gè)sensorManager 傳感器管理對(duì)象為mSensorMgr,并調(diào)用getSystemService 函數(shù),從系統(tǒng)服務(wù)SENSOR_SERVICE 中獲取傳感器實(shí)例;
第二步是注冊(cè)傳感器監(jiān)聽器,重寫Activity 的onResume 函數(shù),在該函數(shù)中注冊(cè)加速度傳感器,指定監(jiān)聽的傳感器類型為加速度傳感器,關(guān)鍵代碼如下:
mSensorMgr.registerListener(this,
mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
第三步是編寫傳感器事件監(jiān)聽器,傳感器事件監(jiān)聽器是繼承自SensorEventListener 的類,該類需實(shí)現(xiàn)2 個(gè)函數(shù),分別是onSensorChanged 和onAccuracyChanged。onSensorChanged 函數(shù)用來感應(yīng)加速度傳感器的輸出變化,并將業(yè)務(wù)邏輯包含在內(nèi),即依據(jù)加速度的值計(jì)算天體高度。onAccuracyChanged函數(shù)在加速度的精度改變時(shí)觸發(fā),一般不處理;
第四步是重寫Activity 的onPause 函數(shù),在該方法中注銷加速度傳感器監(jiān)聽事件。
Android 手機(jī)光學(xué)攝像頭的調(diào)用采用了Camera 類聯(lián)合表面視圖SurfaceView 的方法,即使用Camera 類調(diào)用光學(xué)攝像頭,并將獲取的圖像呈現(xiàn)在SurfaceView上。手機(jī)上傳感器的實(shí)例化方法是通過Sensor 類定義一個(gè)傳感器的對(duì)象,創(chuàng)建sensorManager 類的對(duì)象進(jìn)行實(shí)例化,再創(chuàng)建一個(gè)繼承SensorEventListener 類的OrientationListener 類,以實(shí)時(shí)回傳傳感器的數(shù)據(jù)變化。
Android 手機(jī)數(shù)據(jù)庫主要是通過SQLite 語句實(shí)現(xiàn)的。SQLite 語句是嵌入式的輕型數(shù)據(jù)庫,不涉及復(fù)雜的數(shù)據(jù)控制操作,只需用到數(shù)據(jù)定義和數(shù)據(jù)操縱兩類語句[5]。SQLite 語句可以不聲明具體數(shù)據(jù)類型,支持整型INTEGER、長整型LONG、字符串VARCHAR、浮點(diǎn)型FLOAT,但是不支持布爾類型數(shù)據(jù),布爾型可以采用整型保存。通過SQLiteOpenHelper 類來具體使用SQLite 語句進(jìn)行數(shù)據(jù)庫操作。新建一個(gè)繼承自SQLiteOpenHelper 的數(shù)據(jù)庫操作類,并重寫onCreate方法,以創(chuàng)建一個(gè)新的表結(jié)構(gòu)。數(shù)據(jù)庫讀連接可調(diào)用getReadableDatabase 方法獲得,數(shù)據(jù)庫寫連接可調(diào)用getWritableDatabase 方法獲得,調(diào)用數(shù)據(jù)庫實(shí)例的close 方法關(guān)閉數(shù)據(jù)庫。
觀測天體高度應(yīng)在海況良好,天氣晴朗,光污染足夠小的情況下進(jìn)行。首先,點(diǎn)擊“預(yù)覽”按鈕,屏幕顯示光學(xué)攝像頭獲取的畫面;再點(diǎn)擊“十字準(zhǔn)星”按鈕,屏幕中央顯示十字準(zhǔn)星;然后將十字準(zhǔn)星對(duì)準(zhǔn)需要觀測的星體;點(diǎn)擊測星界面的“記錄”按鈕,天體的高度信息將被記錄在數(shù)據(jù)庫內(nèi),點(diǎn)擊App 下方的“記錄”按鈕即可查看已經(jīng)記錄的高度信息;在天文定位計(jì)算界面,輸入推算船位、時(shí)間等信息;然后點(diǎn)擊“計(jì)算”,即可得出觀測者的經(jīng)緯度。天體高度測量界面如圖4 所示。
在天氣晴朗,能見度良好,光污染足夠小的情況下,用華為P20Pro 手機(jī)安裝App,并多次對(duì)恒星進(jìn)行觀測。考慮天體高度觀測時(shí)間及間隔較短,忽略因周日視運(yùn)動(dòng)會(huì)引起天體高度隨時(shí)間的變化。對(duì)比星圖模擬軟件Stellarium 與天文定位App 觀測天體高度的測量數(shù)據(jù),平均誤差為3'~4'左右。因篇幅限制,選取高度為低、中、高的三組典型觀測結(jié)果為例,測者經(jīng)緯度為38°52.5'N、121°40'E,觀測結(jié)果如表2 所示。
表2 觀測天體高度部分?jǐn)?shù)據(jù)
實(shí)踐證明,用手機(jī)及其內(nèi)置傳感器測量天體高度是可行的,但與用六分儀相比,誤差偏大,分析原因如下:
(1)手機(jī)內(nèi)置方向傳感器精度偏低。手機(jī)不是專業(yè)的測量工具,從用戶需求和控制成本的角度出發(fā),生產(chǎn)商沒有采用高精度器件。未來可以考慮外置高精度傳感器,傳感器模塊體積很小,功耗很低,可以用專用夾具固定在手機(jī)上,需要做好與攝像頭等組件的校準(zhǔn)配合工作,Type-C 接口可用于數(shù)據(jù)傳輸和為模塊供電;
(2)盡可能地提高光學(xué)攝像頭工作時(shí)的姿態(tài)穩(wěn)定度,可以更快、更準(zhǔn)地捕捉天體。一方面,在持握手機(jī)時(shí),最好雙手持握,手肘或身體依靠固定物體;另一方面,選用攝像防抖效果好的手機(jī),最好具有光學(xué)(OIS)和電子(EIS)雙重防抖功能,有條件時(shí)可使用手持式手機(jī)穩(wěn)定平臺(tái);
(3)盡量使用上中天附近的天體。這時(shí)天體高度的變化速度最慢,可以短時(shí)間內(nèi)多次測量,對(duì)測量值進(jìn)行適當(dāng)濾波,提高測量值準(zhǔn)確度;
(4)注意高度校準(zhǔn)??梢岳酶叨缺容^固定的天體,如北極星(勾陳一),測量其高度值與標(biāo)準(zhǔn)值比對(duì),得到零位誤差,類似六分儀的指標(biāo)差,用于修正測量高度。
考慮到天體高度觀測時(shí)間及間隔較短,忽略因周日視運(yùn)動(dòng)引起天體高度隨時(shí)間的變化,將觀測時(shí)的天體高度視為恒值。因此可采用線性卡爾曼濾波方法對(duì)觀測高度進(jìn)行數(shù)據(jù)處理,以每秒為單位對(duì)高度進(jìn)行采樣。引入過程噪聲W(k),其方差為Q,Q為0.01。因?yàn)橄到y(tǒng)是一維且高度近似不變,所以狀態(tài)轉(zhuǎn)移矩陣為1,噪聲驅(qū)動(dòng)矩陣為1,系統(tǒng)的狀態(tài)方程為:
其中,狀態(tài)X(k)是k時(shí)刻的天體高度;狀態(tài)X(k-1)是k-1 時(shí)刻的天體高度;W(k)為過程噪聲。
由積累的測量數(shù)據(jù)可得測量平均誤差大概為0.07°(4'),平均方差為0.5。測量噪聲為V(k),其方差R=0.5。觀測矩陣H為1,測量方程為:
其中,Z(k)是k時(shí)刻天體高度的觀測值;V(k)是測量噪聲。
狀態(tài)預(yù)測方程、增益方程、偏差方程分別為:
其中,(k)為k時(shí)刻天體高度的估計(jì)值;(k-1)為k-1時(shí)刻天體高度的估計(jì)值;K為卡爾曼增益。
其中,P(k|k- 1)=為天體高度預(yù)計(jì)偏差值;Q為過程噪聲W(k)的方差。
其中,P(k)為k時(shí)刻的天體高度偏差值。
以2022 年4 月10 日對(duì)大犬座α觀測結(jié)果為例,使用MATLAB 進(jìn)行編程驗(yàn)證,如圖5 所示。從仿真結(jié)果可知,卡爾曼濾波可以有效降低噪聲對(duì)高度測量的影響。
觀測太陽時(shí),應(yīng)在鏡頭前加裝巴德膜進(jìn)行減光,避免強(qiáng)光損壞光學(xué)攝像頭組件。高度修正時(shí),太陽、月亮當(dāng)日視半徑來自PyEphem 星歷表[6]給出并由程序自動(dòng)進(jìn)行。PyEphem 庫是一個(gè)Python 環(huán)境下天文歷法計(jì)算的第三方庫,由埃爾伍德·查爾斯·唐尼(Elwood Charles Downey)編寫,采用VSOP87 行星理論,其精度在1 角秒左右,足以滿足天文航海所要求的0.1角分的精度。
基于Android 手機(jī)傳感器開發(fā)了天體高度觀測App。原理上,高度值是利用天體與測者鉛垂線之間的夾角得到的,克服了對(duì)水天線的依賴,觀測時(shí)機(jī)大大增加,測星不再局限于晨光昏影時(shí)間;觀測區(qū)域更加廣泛,在看不到水天線的陸地也可進(jìn)行。App 嵌入了星歷庫,可以對(duì)天體高度觀測值自動(dòng)修正。由于是以測者鉛垂線為基準(zhǔn),沒有眼高差,折光差也大幅減小,而這兩項(xiàng)修正量在傳統(tǒng)方法中占了很大比重。
未來,App 還有進(jìn)一步提高精度,增加更多功能的潛力,伴隨傳感器技術(shù)及相關(guān)理論算法的不斷進(jìn)步,最終,智能移動(dòng)平臺(tái)(手機(jī)或平板電腦)將可能成為有一定實(shí)用價(jià)值的天文定位儀。