基于安卓手机的智能测量仪App设计与实现
2018-12-13孙嘉鹏北京市十一学校
孙嘉鹏 北京市十一学校
1.开发背景与需求
在日常生活中,我们经常会遇到想要知道某个对象的距离或者高度,但恰巧没有尺子或者不方便测量的情况。例如,你到旅游景点看到一个雕塑或者一栋大楼,想知道它的高度,却不方便直接测量。又比如,当你在某个地方发现一件有趣的事情,你想把它的位置分享给朋友,但是GPS获取的只是人自身的位置,而不是所感兴趣目标的位置,这个时候我们希望有个工具能自动测量目标离人的距离,再与人的GPS位置和目标相对于人的角度(可通过手机的方向传感器获得)相结合,则可计算出目标的准确位置。
针对以上需求,本文将开发一款基于安卓手机的智能测量仪App,通过用户的简单操作即可实现测量某个感兴趣目标的高度或者距离。该App将使用谷歌公司提供的App Inventor[1]平台进行开发,该平台是一个适用于安卓手机App开发的在线编程软件,可通过代码拼装的方式快速方便地实现所需功能。
2.设计原理
测量距离和高度的基本原理如图1所示。整个测量过程分为以下两步:
步骤1)用户手拿手机,打开摄像头,并将手机屏幕中心对准被测量对象的底部,点击拍照按钮的同时,可利用手机的方向传感器获得向下的倾斜角α;
步骤2)用户再次打开摄像头,并将手机屏幕中心对准被测量对象的顶部,点击拍照按钮的同时,再次利用手机的方向传感器获得向上的倾斜角β。
假定用户的身高h1已知,用户手拿手机的位置与用户的头部大概距离为0.3m,则用户手机离对面的高度为(h1-0.3)。因此,我们可以根据三角函数得到以下两个公式,分别用来计算被测量对象与用户的距离d,以及被测量对象的高度h2。
d=h1*tanα;
h2=h1-0.3+d*tanβ;
图1 使用手机测量距离和高度的基本原理
3.界面设计
在App Inventor中,调用照相机时,会自动弹出照相界面,并引导用户照相。所以我们不需要单独为它设计界面。除此之外,还需要设计三个页面。首先,用户需要设置自己的身高,我们可以使用一个文本框供用户输入,同时提供一个按钮供用户第一次调用摄像头,并给用户相应的拍照方法提示,如图2(a)所示。用户点击按钮后,将第一次进入拍照界面,如图3(a)所示。用户将取像画面中心对准被测量对象底部,然后点击拍照按钮,之后将返回第二个页面,继续引导用户进行第二次拍照,如图所示2(b)。用户再次点击按钮后,将第二次进入拍照界面,如图3(b)所示。用户将取像画面中心对准被测量对象顶部,然后点击拍照按钮,之后将进入第三个页面,显示计算结果,同时显示我们所获得的其它信息,包括身高和两次拍照的角度,如图2(c)所示。同时,该界面提供一个返回按钮,可以回到第一个页面,重新开始下一次测量。
图2 智能测量仪的三个页面
图3 两次拍照界面
4.功能实现
下面,分四个方面分别介绍该App的实现细节。
4.1 使用微数据库存储数据
用户需要拍摄两次来提供足够的计算信息。在这里,可以选择将数据以参数形式在页面之间传递,也可以采用微数据库[2]来存储数据。因为App Inventor的限制,我们只能在页面间传递一个参数,所以,为了方便起见,这里使用微数据库。
对于同一个用户来说,身高是不变的。所以,当用户第二次以及以后再进行测量时,不需要用户重新输入身高了,除非用户自己想要修改数据。同时,身高也是一个必需的计算参数,所以,如果用户没有正确输入,要给出提示,让用户正确输入身高。第一张页面初始化和存储身高信息的块代码,以及最后取用数据库数据的块代码分别如图4和图5所示。
图4 页面初始化和存储身高信息的块代码
图5 取用数据库数据的块代码
4.2 调用照相机
在App Inventor中,照相机组件是非常简便易用的,从上图可以看到,我们只需要一个块代码,就可以调用照相机来拍照。之后,在完成拍摄时,我们需要提取角度信息,需要调用拍摄完成事件来存储倾斜角,相应的块代码如图6所示。
图6 调用拍摄完成事件来存储倾斜角的块代码
4.3 获取倾斜角
在APP Inventor中,倾斜角的定义是:当设备水平放置时,其值为0°;随着设备顶部向下倾斜至竖直时,其值为90°,继续沿相同方向翻转,其值逐渐减小,直到屏幕朝向下方的位置,其值变为0°;同样,当设备底部向下倾斜直到指向地面时,其值为-90°,继续沿同方向翻转到屏幕朝上时,其值为0°。如图7所示。
图7 倾斜角测量示意图
因为手机竖直时,倾斜角给出的角度是90度。向前向后继续倾斜,角度绝对值都将同样变小,所以,我们计算出的高度值,可能有两个。如上图所示,我们的照相角度都为负值,所以在块代码中取绝对值,相应的块代码如图8所示。
图8 计算倾斜角的块代码
4.4 距离和高度计算
通过前面的分析,我们需要进行两次三角变换来分别计算距离和高度,以及我们可能获得两个高度值。我们需要一些局部变量作为中间变量来进行计算,相应的块代码如图9所示。
图9 计算距离和高度的块代码
5.总结与展望
本文基于App Inventor设计与实现了一款用于测量对象距离和高度的安卓手机App,在日常生活中有广泛的应用。然而,本App还有一些待完善和扩展的地方。首先,在用户瞄准被测量对象时,应该在屏幕中间提供一个“十”字准星帮助用户获得更准确的角度信息,但是由于APP Inventor的限制,照相机无法被放置在一个画布中,只能被独立调用,所以我们只能让用户尽量将被测对象位置置于屏幕中央。这样一来,测量的结果就存在更大的误差。另外,不同型号的手机对角度的测量准确性也有很大差异,需要设计一些校准方法来提高测量的准确性。另外,该App需要用户操作两个步骤才能测量高度,未来可探索只操作一次即可测量高度的方法。