郭江峰,劉芳霞
(1.陜西省氣象局,西安 710014;2.陜西省氣象信息中心,西安 710014)
探測環(huán)境是為避開各種干擾,保證氣象探測設(shè)施準(zhǔn)確獲取氣象探測信息所需的最小距離構(gòu)成的環(huán)境空間[1]。為了確保觀測數(shù)據(jù)的代表性,需對觀測場四周的障礙物、干擾源等可能影響氣象探測環(huán)境的因素進(jìn)行測算,判斷該障礙物是否符合要求[2]。新建、遷移觀測場或觀測場四周的障礙物發(fā)生明顯變化時,應(yīng)測定障礙物的方位角和高度角,繪制地平圈障礙物遮蔽圖[3]。需要測量的數(shù)據(jù)有:觀測場經(jīng)緯度、海拔高度、四周障礙物方位角、仰角、距離及各方位照片等。通常這些數(shù)據(jù)需要使用專用測量儀器如全站儀或經(jīng)緯儀、相機(jī)、測距儀、皮尺、指南針、GPS定位儀等,測算流程較為繁瑣和復(fù)雜。
目前大部分移動終端如智能手機(jī)、平板電腦均內(nèi)置了GPS、陀螺儀、加速度計(jì)等傳感器[4],可利用移動終端對障礙物參數(shù)進(jìn)行測量,開展氣象探測環(huán)境的初步評估。本文以智能手機(jī)為例,探討移動終端探測環(huán)境測量軟件的設(shè)計(jì)思路和實(shí)現(xiàn)。
大部分智能手機(jī)自帶位置測量功能,可使用GPS(北斗)、網(wǎng)絡(luò)、基站等方式進(jìn)行定位。其中GPS使用環(huán)繞地球的GPS衛(wèi)星提供的信息來計(jì)算當(dāng)前所處的位置[4],定位的精度高于網(wǎng)絡(luò)和基站定位方式。為了保證經(jīng)緯度測量的精確度,軟件使用GPS進(jìn)行定位,實(shí)時獲取測量點(diǎn)的經(jīng)緯度、海拔高度。
障礙物是觀測場以外高于觀測場地平面1 m以上的建筑物、構(gòu)筑物、樹木、作物等物體[1]。障礙物遮蔽仰角是從觀測場圍欄距障礙物最近點(diǎn)的地面向該障礙物可見的最高點(diǎn)看去,視線與視線在觀測場所在地面投影所形成的夾角[1]。按照氣象探測環(huán)境保護(hù)規(guī)范,障礙物遮擋仰角使用全站儀在觀測場圍欄距離障礙物最近的地面直接測量障礙物最高的仰角值。
在智能手機(jī)中,通過內(nèi)置的加速度傳感器、磁力傳感器、陀螺儀,能夠取得手機(jī)在相對于地球坐標(biāo)系繞坐標(biāo)軸的旋轉(zhuǎn)量,其中俯仰角是手機(jī)繞x軸旋轉(zhuǎn)角(用rx表示),偏航角是手機(jī)繞y軸旋轉(zhuǎn)角(用ry表示),翻滾角是手機(jī)在z軸旋轉(zhuǎn)角(用rz表示)。這三個角度用于表示設(shè)備在三維空間中的姿態(tài)(見圖1)。
圖1 手機(jī)姿態(tài)
在測量時,手機(jī)置于觀測場圍欄邊O點(diǎn)(圖2),當(dāng)后置攝像頭對準(zhǔn)障礙物最高點(diǎn)A時,手機(jī)在三維空間繞x、y、z坐標(biāo)軸的旋轉(zhuǎn)角度即表示A點(diǎn)相對于O點(diǎn)的仰角、方位角和手機(jī)底邊的水平度。手機(jī)繞z軸的旋轉(zhuǎn)角rz表示設(shè)備的水平度,當(dāng)rz為0°時表示手機(jī)底邊與水平面平行,手機(jī)繞y軸的旋轉(zhuǎn)角ry為障礙物方位角,根據(jù)手機(jī)繞x軸的旋轉(zhuǎn)角rx,可以求算出A點(diǎn)的仰角α及高度距離比h/d:
α=rx-90°,
h/d=tanα。
圖2 障礙物遮擋仰角測量
通過編寫程序讀取加速度傳感器、磁力傳感器等數(shù)據(jù),計(jì)算手機(jī)繞x、y、z軸的旋轉(zhuǎn)量,即可計(jì)算出障礙物的仰角、方位角、高度距離比。
智能手機(jī)內(nèi)置有距離傳感器,但其有效工作范圍極短,并不適合障礙物距離的測量。水平距離可通過GPS測量觀測點(diǎn)O和障礙物距觀測點(diǎn)的最近點(diǎn)C的經(jīng)緯度數(shù)據(jù)進(jìn)行估算。設(shè)O點(diǎn)的經(jīng)緯度為(φ1,λ1),C點(diǎn)的經(jīng)緯度為(φ2,λ2),地球半徑為R,則OC間的距離d為:
受GPS精度限制,使用經(jīng)緯度計(jì)算距離的測量誤差較大,此方法僅適合大致估算,要取得精確數(shù)據(jù),還是需要使用皮尺或激光測距儀完成。
以Android系統(tǒng)為例,介紹氣象探測環(huán)境測量軟件的開發(fā)。程序使用Android Studio開發(fā)環(huán)境,JAVA語言開發(fā)。
程序啟動后,強(qiáng)制手機(jī)為橫屏狀態(tài),啟動攝像頭進(jìn)入攝像預(yù)覽狀態(tài),開啟GPS、加速度傳感器、陀螺儀、磁力傳感器,讀取經(jīng)緯度和手機(jī)在三維空間繞x、y、z軸旋轉(zhuǎn)角,計(jì)算障礙物仰角、方位角,手機(jī)水平度,數(shù)據(jù)和攝像頭圖像疊加顯示。圖像、仰角、方位角數(shù)據(jù)隨著手機(jī)姿態(tài)變化實(shí)時更新。主界面如圖3所示。
圖3 主程序界面
需要注意的是,移動終端對圖像、存儲卡等數(shù)據(jù)的訪問有嚴(yán)格的權(quán)限控制,在程序中需申請攝像頭、GPS、存儲卡訪問權(quán)限。程序啟動時,首先需要檢查攝像頭、加速度傳感器、磁力傳感器、GPS、存儲卡的狀態(tài),防止硬件不支持或無權(quán)限引起的程序崩潰。
攝像頭數(shù)據(jù)利用了系統(tǒng)Camera類實(shí)現(xiàn)。新建一個繼承SurfaceView的類,實(shí)現(xiàn)SurfaceHolder.Callback接口,在接口成員surfaceCreated中調(diào)用Camera.open方法打開后置攝像頭,顯示拍攝預(yù)覽畫面。在拍攝畫面上以屏幕中心為原點(diǎn)繪制坐標(biāo)軸,以便于測量時對準(zhǔn)目標(biāo)物。
程序初始化時,啟動手機(jī)GPS,設(shè)置定位精度等參數(shù),監(jiān)聽GPS狀態(tài)并搜索定位衛(wèi)星。定位成功后讀取經(jīng)緯度、海拔高度數(shù)據(jù)傳入疊加顯示模塊,當(dāng)數(shù)據(jù)位置數(shù)據(jù)發(fā)生變化時更新顯示。
通過調(diào)用getSystemService函數(shù)取得傳感器管理對象SensorManager,對加速度傳感器、陀螺儀、磁力傳感器進(jìn)行初始化并進(jìn)行監(jiān)聽。當(dāng)數(shù)據(jù)發(fā)生改變時,調(diào)用getRotationMatrix方法,根據(jù)采集到的加速度傳感器、陀螺儀、磁力傳感器數(shù)據(jù)分量,計(jì)算手機(jī)在三維空間的姿態(tài),即繞x、y、z軸的旋轉(zhuǎn)角rx,ry,rz。根據(jù)rx計(jì)算出障礙物仰角,ry為方位角,rz為設(shè)備的水平度。
在測量過程中,對攝像頭圖像、屏幕坐標(biāo)軸、仰角、方位角、水平度、經(jīng)緯度、海拔高度進(jìn)行實(shí)時采集疊加顯示,以達(dá)到即拍即測的目的。新建一個繼承View的類,在OnDraw方法中利用Canvas類的繪圖函數(shù),在屏幕上標(biāo)注測量數(shù)據(jù),實(shí)現(xiàn)圖像數(shù)據(jù)、測量數(shù)據(jù)的疊加實(shí)時顯示。
為了方便記錄,當(dāng)用點(diǎn)擊屏幕上拍照按鈕時,程序調(diào)用Camera.takePicture方法完成對障礙物的拍照,并在所拍圖像上標(biāo)注經(jīng)緯度、仰角、方位角信息,存入系統(tǒng)相冊,點(diǎn)擊相冊按鈕對保存的數(shù)據(jù)進(jìn)行查看。
相對專用設(shè)備測量,移動終端氣象探測環(huán)境測量程序具有攜帶方便、操作簡單、普及率高等優(yōu)點(diǎn),程序已在部分臺站遷站初選中使用。需要注意的是,由于不同移動終端傳感器精度標(biāo)準(zhǔn)不一,與專用儀測量存在一定誤差,僅適用于初步測量,正式探測環(huán)境評估中仍需按照規(guī)范使用經(jīng)緯儀等專用儀器測量。