孫嘉鵬 北京市十一學(xué)校
在日常生活中,我們經(jīng)常會遇到想要知道某個對象的距離或者高度,但恰巧沒有尺子或者不方便測量的情況。例如,你到旅游景點(diǎn)看到一個雕塑或者一棟大樓,想知道它的高度,卻不方便直接測量。又比如,當(dāng)你在某個地方發(fā)現(xiàn)一件有趣的事情,你想把它的位置分享給朋友,但是GPS獲取的只是人自身的位置,而不是所感興趣目標(biāo)的位置,這個時候我們希望有個工具能自動測量目標(biāo)離人的距離,再與人的GPS位置和目標(biāo)相對于人的角度(可通過手機(jī)的方向傳感器獲得)相結(jié)合,則可計(jì)算出目標(biāo)的準(zhǔn)確位置。
針對以上需求,本文將開發(fā)一款基于安卓手機(jī)的智能測量儀App,通過用戶的簡單操作即可實(shí)現(xiàn)測量某個感興趣目標(biāo)的高度或者距離。該App將使用谷歌公司提供的App Inventor[1]平臺進(jìn)行開發(fā),該平臺是一個適用于安卓手機(jī)App開發(fā)的在線編程軟件,可通過代碼拼裝的方式快速方便地實(shí)現(xiàn)所需功能。
測量距離和高度的基本原理如圖1所示。整個測量過程分為以下兩步:
步驟1)用戶手拿手機(jī),打開攝像頭,并將手機(jī)屏幕中心對準(zhǔn)被測量對象的底部,點(diǎn)擊拍照按鈕的同時,可利用手機(jī)的方向傳感器獲得向下的傾斜角α;
步驟2)用戶再次打開攝像頭,并將手機(jī)屏幕中心對準(zhǔn)被測量對象的頂部,點(diǎn)擊拍照按鈕的同時,再次利用手機(jī)的方向傳感器獲得向上的傾斜角β。
假定用戶的身高h(yuǎn)1已知,用戶手拿手機(jī)的位置與用戶的頭部大概距離為0.3m,則用戶手機(jī)離對面的高度為(h1-0.3)。因此,我們可以根據(jù)三角函數(shù)得到以下兩個公式,分別用來計(jì)算被測量對象與用戶的距離d,以及被測量對象的高度h2。
d=h1*tanα;
h2=h1-0.3+d*tanβ;
圖1 使用手機(jī)測量距離和高度的基本原理
在App Inventor中,調(diào)用照相機(jī)時,會自動彈出照相界面,并引導(dǎo)用戶照相。所以我們不需要單獨(dú)為它設(shè)計(jì)界面。除此之外,還需要設(shè)計(jì)三個頁面。首先,用戶需要設(shè)置自己的身高,我們可以使用一個文本框供用戶輸入,同時提供一個按鈕供用戶第一次調(diào)用攝像頭,并給用戶相應(yīng)的拍照方法提示,如圖2(a)所示。用戶點(diǎn)擊按鈕后,將第一次進(jìn)入拍照界面,如圖3(a)所示。用戶將取像畫面中心對準(zhǔn)被測量對象底部,然后點(diǎn)擊拍照按鈕,之后將返回第二個頁面,繼續(xù)引導(dǎo)用戶進(jìn)行第二次拍照,如圖所示2(b)。用戶再次點(diǎn)擊按鈕后,將第二次進(jìn)入拍照界面,如圖3(b)所示。用戶將取像畫面中心對準(zhǔn)被測量對象頂部,然后點(diǎn)擊拍照按鈕,之后將進(jìn)入第三個頁面,顯示計(jì)算結(jié)果,同時顯示我們所獲得的其它信息,包括身高和兩次拍照的角度,如圖2(c)所示。同時,該界面提供一個返回按鈕,可以回到第一個頁面,重新開始下一次測量。
圖2 智能測量儀的三個頁面
圖3 兩次拍照界面
下面,分四個方面分別介紹該App的實(shí)現(xiàn)細(xì)節(jié)。
用戶需要拍攝兩次來提供足夠的計(jì)算信息。在這里,可以選擇將數(shù)據(jù)以參數(shù)形式在頁面之間傳遞,也可以采用微數(shù)據(jù)庫[2]來存儲數(shù)據(jù)。因?yàn)锳pp Inventor的限制,我們只能在頁面間傳遞一個參數(shù),所以,為了方便起見,這里使用微數(shù)據(jù)庫。
對于同一個用戶來說,身高是不變的。所以,當(dāng)用戶第二次以及以后再進(jìn)行測量時,不需要用戶重新輸入身高了,除非用戶自己想要修改數(shù)據(jù)。同時,身高也是一個必需的計(jì)算參數(shù),所以,如果用戶沒有正確輸入,要給出提示,讓用戶正確輸入身高。第一張頁面初始化和存儲身高信息的塊代碼,以及最后取用數(shù)據(jù)庫數(shù)據(jù)的塊代碼分別如圖4和圖5所示。
圖4 頁面初始化和存儲身高信息的塊代碼
圖5 取用數(shù)據(jù)庫數(shù)據(jù)的塊代碼
在App Inventor中,照相機(jī)組件是非常簡便易用的,從上圖可以看到,我們只需要一個塊代碼,就可以調(diào)用照相機(jī)來拍照。之后,在完成拍攝時,我們需要提取角度信息,需要調(diào)用拍攝完成事件來存儲傾斜角,相應(yīng)的塊代碼如圖6所示。
圖6 調(diào)用拍攝完成事件來存儲傾斜角的塊代碼
在APP Inventor中,傾斜角的定義是:當(dāng)設(shè)備水平放置時,其值為0°;隨著設(shè)備頂部向下傾斜至豎直時,其值為90°,繼續(xù)沿相同方向翻轉(zhuǎn),其值逐漸減小,直到屏幕朝向下方的位置,其值變?yōu)?°;同樣,當(dāng)設(shè)備底部向下傾斜直到指向地面時,其值為-90°,繼續(xù)沿同方向翻轉(zhuǎn)到屏幕朝上時,其值為0°。如圖7所示。
圖7 傾斜角測量示意圖
因?yàn)槭謾C(jī)豎直時,傾斜角給出的角度是90度。向前向后繼續(xù)傾斜,角度絕對值都將同樣變小,所以,我們計(jì)算出的高度值,可能有兩個。如上圖所示,我們的照相角度都為負(fù)值,所以在塊代碼中取絕對值,相應(yīng)的塊代碼如圖8所示。
圖8 計(jì)算傾斜角的塊代碼
通過前面的分析,我們需要進(jìn)行兩次三角變換來分別計(jì)算距離和高度,以及我們可能獲得兩個高度值。我們需要一些局部變量作為中間變量來進(jìn)行計(jì)算,相應(yīng)的塊代碼如圖9所示。
圖9 計(jì)算距離和高度的塊代碼
本文基于App Inventor設(shè)計(jì)與實(shí)現(xiàn)了一款用于測量對象距離和高度的安卓手機(jī)App,在日常生活中有廣泛的應(yīng)用。然而,本App還有一些待完善和擴(kuò)展的地方。首先,在用戶瞄準(zhǔn)被測量對象時,應(yīng)該在屏幕中間提供一個“十”字準(zhǔn)星幫助用戶獲得更準(zhǔn)確的角度信息,但是由于APP Inventor的限制,照相機(jī)無法被放置在一個畫布中,只能被獨(dú)立調(diào)用,所以我們只能讓用戶盡量將被測對象位置置于屏幕中央。這樣一來,測量的結(jié)果就存在更大的誤差。另外,不同型號的手機(jī)對角度的測量準(zhǔn)確性也有很大差異,需要設(shè)計(jì)一些校準(zhǔn)方法來提高測量的準(zhǔn)確性。另外,該App需要用戶操作兩個步驟才能測量高度,未來可探索只操作一次即可測量高度的方法。