利用手机传感器测量高度

最近简单了解了一下android系统的传感器。其中较常用的是加速计Accelerometer,可以用来实现“摇一摇”。

一开始,从加速计这个名字本身来理解,以为是测量加速度的,也就是手机如果静止,则加速计应该返回0.

后来发现其实是表示手机外部的支撑物对于手机施加的力产生的加速度,其方向相对于手机的本地坐标系。简单说如果手机静止不动,加速计的值为-g。这样的好处是这个值可以反映手机在静止时的方向。

手机本地坐标系

也就是说,手机在跌落的过程中,Accelerometer的值为0(根据不同的硬件,会有不同范围的误差)。嗯,有点意思。

我们完全可以利用这个,通过让手机跌落,记录跌落的时间,然后通过简单的物理公式,算出跌落的距离

在NDK环境下简单实现了一下。在检测到碰撞后顺便估算一下冲击强度。

enum State
{
	Ready = 0,
	Dropping,
	Colliding,
	Idle,
};

int state			= Ready;
int64_t timeStamp	= 0;
float dropHeight	= 0.f;

float averageImpact = 0.f;
int nImpact = 0;

// use accelerometer track the dropping process
// measuring time and estimate dropping height
void TrackDropping(const ASensorEvent& event){

	Vector3f v(event.acceleration.x, event.acceleration.y, event.acceleration.z);
	float lenth = v.Length();

	if (state == Ready) {
		// detect weightlessness
		if (lenth < 1.0f) {
			timeStamp = event.timestamp;
			state = Dropping;
		}
	}

	if (state == Dropping) {
		// detect collide
		if (lenth > ASENSOR_STANDARD_GRAVITY) {
			// in milliseconds, timestamp is in nanoseconds
			int64_t during = (event.timestamp - timeStamp) / 1000000;
			float sec = during / 1000.0f;

			dropHeight = 0.5f * ASENSOR_STANDARD_GRAVITY * sec * sec;

			state = Colliding;
			return;
		}
	}

	if (state == Colliding) {
		averageImpact += lenth;
		nImpact++;

		if (lenth < ASENSOR_STANDARD_GRAVITY) {
			averageImpact /= nImpact;
			GLog.LogInfo("Drop height %.2f impact %.2f", dropHeight, averageImpact);

			averageImpact = 0.f;
			nImpact = 0;
			timeStamp = event.timestamp;
			state = Idle;
		}
		return;
	}

	if (state == Idle) {
		if ((event.timestamp - timeStamp) / 1000000 > 3000) {
			state = Ready;
		}
	}
}
while ((ident = ALooper_pollAll(engine.animating ? 0 : -1,
			NULL, &events,  (void**)&source)) >= 0) {

            // Process this event.
            if (source != NULL) {
                source->process(state, source);
            }

            // If a sensor has data, process it now.
			if (ident == LOOPER_ID_USER) {
				if (engine.accelerometerSensor != NULL) {
					ASensorEvent event;
					while (ASensorEventQueue_getEvents(engine.sensorEventQueue, &event, 1) > 0) {
						TrackDropping(event);
					}
				}
			}

            // Check if we are exiting.
            if (state->destroyRequested != 0) {
                engine_term_display(&engine);
                return;
            }
        }

其实用Java实现就可以,但不知道在采样率和延迟方面会不会有所区别。

在我的测试机coolpad大神f1上测试后发现,从开始跌落到通过传感器检测到跌落有一段明显的延迟(大于0.1s),远大于采样间隔(10ms)。同理检测碰撞时也有明显延迟。最重要的是这两个间隔还不一样大,严重影响的测量结果的准确性。

后来想了一个办法,用一次标准跌落(比如1米高)算出一个延迟时间的修正值。使用了延迟修正以后,测量准确度明显提高了(10%以内)。

温馨提示:

小伙伴们自己也可以尝试一下,不过最好先备份手机中的重要数据,以避免不必要的损失。

时间: 2024-10-13 11:59:30

利用手机传感器测量高度的相关文章

我的Android进阶之旅------&gt;Android利用Sensor(传感器)实现水平仪功能的小例

这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端. 利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我的Android进阶之旅------>Android利用Sensor(传感器)实现指南针功能 (地址:http://blog.csdn.net/ouyang_peng/article/details/8801204) 接下来,我们利用返回的第二.三个参数实现该水平仪.因为第二个参数,反映底部翘起的角度(当

手机传感器

手机传感器检测安卓手机上所有可用感应器,并通过图像生动的展示它们是如何运作的.手机传感器也能够识别该手机硬件支持哪些传感器,并提供对我们日常生活起着重要作用的传感工具.手机传感器只能检测到变化.如果属性没有变化,它显示的温度值.距离值.光和压力的值可能不准确. 手机中常用的传感器 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROMETER 1 //加速度 #define SENSOR_TY

新辰:4G时代如何利用手机进行移动APP营销?

未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要如何用手机进行营销呢?手机网站的竞价文章,要如何去写比较好?手机网站要做专题吗?手机网站的优化思路在哪里?手机的系统不同,在不同的手机上,用户体验度也是不一样的.我们如何做到完美?针对这些问题,新辰为你一一解答: 新辰问你:你平时喜欢玩手机吗?你对手机哪方面感兴趣呢?不同的手机会影响人的阅读习惯,所以个人认为手机搜索优化停留在seo角度还只是一层?苹果,黑莓,不同手机用户有不同人群分布!所以手机优化不能做到完美的. 新辰认为,

利用手机中存储的电话号码给联系人打电话与发短信

1.将存储在数据库中的数据布局到手机界面上,其操作请见http://blog.csdn.net/xia09222826/article/details/28660653 2.三种效果显示出的效果分别是: 1)自定义的效果 2)单选的效果 3)多选的效果 3.点击某一个联系人进行拨打电话或者发送短信(以自定义的效果为例) 1)效果视图(比如点击了序号1的联系人):从手机电话备份界面跳转到PhoneandemailActitvity界面 2)程序实现 ①注册点击事件         lv_users

云中树莓派(4):利用声音传感器控制Led灯

云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感器控制Led灯 1. 声音传感器及其配置 声音传感器如下图所示: 将 VCC 引脚接入树莓派 5V 引脚,将 GND 引脚接入树莓派 GND 引脚,将 OUT 引脚接入树莓派 GPIO20. 要注意,模块在环境声音强度达不到设定阈值时,OUT输出高电平(1),当外界环境声音强度超过设定阈值时,模块O

利用手机工具教你快速完成英语翻译在线翻译中文

利用手机工具教你快速完成英语翻译在线翻译中文?世界那么大,谁都想出去看看,可是当你遇到语言问题没法解决时,你还想出去看看吗?恐怕没人愿意,所以今天小编就为大家带来一个英语在线翻译为中文的方法,让你可以有出去看看的决心.1:打开手机翻译工具"语音翻译器"后,首先我们选择翻译模式,总共有语音翻译和文本翻译两种翻译模式,小编通常使用文本翻译模式,觉得不仅方便,而且很实用.2:选择源语种和目标语种,源语种选择中文,目标语种选择英文.3:当你想要进行翻译时,点击文本框,开始打字输入你想要进行翻译

手机传感器调研

 智能手机加速计是如何工作的(解说视频): http://jandan.net/2012/05/24/smartphone-accelerometer.html [Android笔记五] Android Sensor感应器介绍(一)重力感应加速度获取 http://blog.csdn.net/octobershiner/article/details/6639040 [Android笔记六]Android Sensor感应器介绍(二)线程中刷新UI一个创建android测力计的例子 http

ionic cordova 引用百度地图以及利用手机GPS定位

首先引入百度地图 在html文件里面加入 <head> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的密钥"></script> //申请一个百度密钥,建议申请浏览器版的比较方便测试 </head> <body> <button id = "getPosition"&g

新辰:4G时代怎样利用手机进行移动APP营销?

未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要怎样用手机进行营销呢?手机站点的竞价文章,要怎样去写比較好?手机站点要做专题吗?手机站点的优化思路在哪里?手机的系统不同,在不同的手机上,用户体验度也是不一样的.我们怎样做到完美?针对这些问题,新辰为你一一解答: 新辰问你:你平时喜欢玩手机吗?你对手机哪方面感兴趣呢?不同的手机会影响人的阅读习惯,所以个人觉得手机搜索优化停留在seo角度还仅仅是一层?苹果,黑莓,不同手机用户有不同人群分布!所以手机优化不能做到完美的. 新辰觉得