吳浩 周愛軍
1.海軍大連艦艇學院學員五大隊,遼寧大連 116018;2.海軍大連艦艇學院航海系,遼寧大連 116018
傳統天文航海定位方法通常是利用六分儀測量某一時刻多個天體的高度,或某個天體多個時刻的高度,然后通過“高度差法”得到測者位置經緯度。這種定位方法的信標為自然天體,具有設備簡單、不受電磁干擾等優點。現在電磁環境日趨復雜,衛星導航和無線電導航等系統容易受到干擾,天文定位因其自主性好的獨特優點具有重要保底作用。但是,傳統六分儀觀測天體高度存在以下不足:一是六分儀觀測天體高度必須要能同時看清天體和水天線,觀測時機大為受限,如測星只能在晨光昏影時段;二是對觀測的高度值需要進行蒙氣差、眼高差等一系列修正,且靠手工查算表冊,過程繁雜,容易出錯,觀測天體高度的速度和精度非常依賴測者的業務能力,需要花費較大精力進行經常性訓練。移動智能平臺(手機或平板電腦)和傳感器技術的快速發展,為實現開發天體高度觀測App 提供了軟硬件支持。針對傳統方法用六分儀觀測天體高度的存在問題,開發了一款基于Android 平臺的天體高度方位觀測App,在不借助手機基站信號和衛星導航信號的前提下,利用手機傳感器觀測天體得到高度值。
Android 手機以價格低廉,便于攜帶,硬件性能良好等特點被廣泛使用,其帶有加速度、磁場、陀螺儀、光學和壓力等多種傳感器[1]。手機或平板內的傳感器一般都是大規模集成電路芯片,除了傳感器還包括信號調節、數據處理和通信電路。其中,加速度傳感器常被用于測量物體受到重力在內的外力所產生的加速度[2]。單軸加速度傳感器計算角度采用正弦或余弦函數,靈敏度是非線性的。三軸加速度傳感器計算角度采用反正切函數,某個軸的輸出與另兩軸的輸出平方根進行比較,可以穩定靈敏度[3]。
以華為P20Pro 手機為例,加速度傳感器和陀螺儀的芯片為ICM-20690。ICM-20690 芯片尺寸為2.5 mm ×3 mm×0.91 mm,集成了一個三軸陀螺儀和一個三軸加速度計,在不需要參照靜止坐標系前提下,可分別測量角速度和線加速度,并可通過處理測量所得數據跟蹤運動物體的位置和方向,其加速度傳感器的性能指標如表1 所示[4]。

表1 ICM-20690 加速度傳感器性能指標
手機內置的加速度傳感器一般使用三維坐標來確定角度和方向。當手機屏幕朝上平放時,與手機屏幕垂直的為z軸,與手機屏幕在同一平面且互相垂直的分別為x、y軸,如圖1 所示。加速度傳感器在x、y、z軸的輸出分別為AX、AY和AZ。

天體高度觀測的實質是角度測量,因此可使用手機內置加速度傳感器測量天體高度。首先通過光學攝像頭瞄準天體,并使其位于十字準星點上;調整手機姿態,使手機的上下邊緣與水平面基本平行,相當于手機攝像頭的CCD 平面垂直于天體光線;采用反正切函數進行角度計算,計算公式為:

其中,θ為加速度傳感器內部軸線(y軸)與鉛垂線的夾角;AX、AY和AZ分別為加速度傳感器在x、y、z軸的輸出。同時,程序檢測重力在手機坐標系x軸方向上加速度分量AX是否近似為0,當AX近似為0 時,進行角度計算,計算公式簡化為:

觀測天體高度原理如圖2 所示,手機坐標系z軸與鉛垂線的夾角α為天體頂距,天體高度h和θ均為α的余角,因此天體高度h等于θ。

天體高度測量功能主要利用手機內置光學傳感器(相機)、加速度傳感器來實現。程序框圖如圖3 所示,首先選擇所觀測的天體,便于數據存儲;然后實例化相機和加速度傳感器;將手機對準天體,計算并顯示天體高度。

Android 系統中調用加速度傳感器是通過調用getSystemService 函數,傳遞TYPE_ACCELEROMETER參數,并設置傳感器事件監聽器來回傳加速度傳感器的值,具體分為四個步驟:
第一步是獲取傳感器實例,在Activity 中聲明一個sensorManager 傳感器管理對象為mSensorMgr,并調用getSystemService 函數,從系統服務SENSOR_SERVICE 中獲取傳感器實例;
第二步是注冊傳感器監聽器,重寫Activity 的onResume 函數,在該函數中注冊加速度傳感器,指定監聽的傳感器類型為加速度傳感器,關鍵代碼如下:
mSensorMgr.registerListener(this,
mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
第三步是編寫傳感器事件監聽器,傳感器事件監聽器是繼承自SensorEventListener 的類,該類需實現2 個函數,分別是onSensorChanged 和onAccuracyChanged。onSensorChanged 函數用來感應加速度傳感器的輸出變化,并將業務邏輯包含在內,即依據加速度的值計算天體高度。onAccuracyChanged函數在加速度的精度改變時觸發,一般不處理;
第四步是重寫Activity 的onPause 函數,在該方法中注銷加速度傳感器監聽事件。
Android 手機光學攝像頭的調用采用了Camera 類聯合表面視圖SurfaceView 的方法,即使用Camera 類調用光學攝像頭,并將獲取的圖像呈現在SurfaceView上。手機上傳感器的實例化方法是通過Sensor 類定義一個傳感器的對象,創建sensorManager 類的對象進行實例化,再創建一個繼承SensorEventListener 類的OrientationListener 類,以實時回傳傳感器的數據變化。
Android 手機數據庫主要是通過SQLite 語句實現的。SQLite 語句是嵌入式的輕型數據庫,不涉及復雜的數據控制操作,只需用到數據定義和數據操縱兩類語句[5]。SQLite 語句可以不聲明具體數據類型,支持整型INTEGER、長整型LONG、字符串VARCHAR、浮點型FLOAT,但是不支持布爾類型數據,布爾型可以采用整型保存。通過SQLiteOpenHelper 類來具體使用SQLite 語句進行數據庫操作。新建一個繼承自SQLiteOpenHelper 的數據庫操作類,并重寫onCreate方法,以創建一個新的表結構。數據庫讀連接可調用getReadableDatabase 方法獲得,數據庫寫連接可調用getWritableDatabase 方法獲得,調用數據庫實例的close 方法關閉數據庫。
觀測天體高度應在海況良好,天氣晴朗,光污染足夠小的情況下進行。首先,點擊“預覽”按鈕,屏幕顯示光學攝像頭獲取的畫面;再點擊“十字準星”按鈕,屏幕中央顯示十字準星;然后將十字準星對準需要觀測的星體;點擊測星界面的“記錄”按鈕,天體的高度信息將被記錄在數據庫內,點擊App 下方的“記錄”按鈕即可查看已經記錄的高度信息;在天文定位計算界面,輸入推算船位、時間等信息;然后點擊“計算”,即可得出觀測者的經緯度。天體高度測量界面如圖4 所示。

在天氣晴朗,能見度良好,光污染足夠小的情況下,用華為P20Pro 手機安裝App,并多次對恒星進行觀測。考慮天體高度觀測時間及間隔較短,忽略因周日視運動會引起天體高度隨時間的變化。對比星圖模擬軟件Stellarium 與天文定位App 觀測天體高度的測量數據,平均誤差為3'~4'左右。因篇幅限制,選取高度為低、中、高的三組典型觀測結果為例,測者經緯度為38°52.5'N、121°40'E,觀測結果如表2 所示。

表2 觀測天體高度部分數據
實踐證明,用手機及其內置傳感器測量天體高度是可行的,但與用六分儀相比,誤差偏大,分析原因如下:
(1)手機內置方向傳感器精度偏低。手機不是專業的測量工具,從用戶需求和控制成本的角度出發,生產商沒有采用高精度器件。未來可以考慮外置高精度傳感器,傳感器模塊體積很小,功耗很低,可以用專用夾具固定在手機上,需要做好與攝像頭等組件的校準配合工作,Type-C 接口可用于數據傳輸和為模塊供電;
(2)盡可能地提高光學攝像頭工作時的姿態穩定度,可以更快、更準地捕捉天體。一方面,在持握手機時,最好雙手持握,手肘或身體依靠固定物體;另一方面,選用攝像防抖效果好的手機,最好具有光學(OIS)和電子(EIS)雙重防抖功能,有條件時可使用手持式手機穩定平臺;
(3)盡量使用上中天附近的天體。這時天體高度的變化速度最慢,可以短時間內多次測量,對測量值進行適當濾波,提高測量值準確度;
(4)注意高度校準。可以利用高度比較固定的天體,如北極星(勾陳一),測量其高度值與標準值比對,得到零位誤差,類似六分儀的指標差,用于修正測量高度。
考慮到天體高度觀測時間及間隔較短,忽略因周日視運動引起天體高度隨時間的變化,將觀測時的天體高度視為恒值。因此可采用線性卡爾曼濾波方法對觀測高度進行數據處理,以每秒為單位對高度進行采樣。引入過程噪聲W(k),其方差為Q,Q為0.01。因為系統是一維且高度近似不變,所以狀態轉移矩陣為1,噪聲驅動矩陣為1,系統的狀態方程為:

其中,狀態X(k)是k時刻的天體高度;狀態X(k-1)是k-1 時刻的天體高度;W(k)為過程噪聲。
由積累的測量數據可得測量平均誤差大概為0.07°(4'),平均方差為0.5。測量噪聲為V(k),其方差R=0.5。觀測矩陣H為1,測量方程為:

其中,Z(k)是k時刻天體高度的觀測值;V(k)是測量噪聲。
狀態預測方程、增益方程、偏差方程分別為:

其中,(k)為k時刻天體高度的估計值;(k-1)為k-1時刻天體高度的估計值;K為卡爾曼增益。

其中,P(k|k- 1)=為天體高度預計偏差值;Q為過程噪聲W(k)的方差。

其中,P(k)為k時刻的天體高度偏差值。
以2022 年4 月10 日對大犬座α觀測結果為例,使用MATLAB 進行編程驗證,如圖5 所示。從仿真結果可知,卡爾曼濾波可以有效降低噪聲對高度測量的影響。

觀測太陽時,應在鏡頭前加裝巴德膜進行減光,避免強光損壞光學攝像頭組件。高度修正時,太陽、月亮當日視半徑來自PyEphem 星歷表[6]給出并由程序自動進行。PyEphem 庫是一個Python 環境下天文歷法計算的第三方庫,由埃爾伍德·查爾斯·唐尼(Elwood Charles Downey)編寫,采用VSOP87 行星理論,其精度在1 角秒左右,足以滿足天文航海所要求的0.1角分的精度。
基于Android 手機傳感器開發了天體高度觀測App。原理上,高度值是利用天體與測者鉛垂線之間的夾角得到的,克服了對水天線的依賴,觀測時機大大增加,測星不再局限于晨光昏影時間;觀測區域更加廣泛,在看不到水天線的陸地也可進行。App 嵌入了星歷庫,可以對天體高度觀測值自動修正。由于是以測者鉛垂線為基準,沒有眼高差,折光差也大幅減小,而這兩項修正量在傳統方法中占了很大比重。
未來,App 還有進一步提高精度,增加更多功能的潛力,伴隨傳感器技術及相關理論算法的不斷進步,最終,智能移動平臺(手機或平板電腦)將可能成為有一定實用價值的天文定位儀。