重力加速度的计步算法求讲解
-
package com.altria.mystep.step; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * 这是一... package com.altria.mystep.step; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * 这是一个实现了信号监听的记步的类 * 这是从谷歌找来的一个记步的算法,看不太懂 * @author Liyachao Date:2015-1-6 * */ public class StepDetector implements SensorEventListener { public static int CURRENT_SETP = 0;//当前步数 public static float SENSITIVITY = 10; // SENSITIVITY灵敏度 public static boolean flag = false;//服务运行标志 private float mLastValues[] = new float[3 * 2]; private float mScale[] = new float[2]; private float mYOffset; private static long end = 0; private static long start = 0; /** * Z后加速度方向 */ private float mLastDirections[] = new float[3 * 2]; private float mLastExtremes[][] = { new float[3 * 2], new float[3 * 2] }; private float mLastDiff[] = new float[3 * 2]; private int mLastMatch = -1; /** * 传入上下文的构造函数 * * @param context */ public StepDetector(Context context) { super(); int h = 480; mYOffset = h * 0.5f; mScale[0] = -(h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2))); mScale[1] = -(h * 0.5f * (1.0f / (SensorManager.MAGNETIC_FIELD_EARTH_MAX))); } //当加速度传感器检测到的数值发生变化时就会调用这个方法 public void onSensorChanged(SensorEvent event) { if (!flag) return; Sensor sensor = event.sensor; synchronized (this) { if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) { float vSum = 0; for (int i = 0; i < 3; i++) { final float v = mYOffset + event.values[i] * mScale[1]; vSum += v; } int k = 0; float v = vSum / 3; float direction = (v > mLastValues[k] ? 1 : (v < mLastValues[k] ? -1 : 0)); if (direction == -mLastDirections[k]) { // Direction changed int extType = (direction > 0 ? 0 : 1); // minumum or // maximum? mLastExtremes[extType][k] = mLastValues[k]; float diff = Math.abs(mLastExtremes[extType][k] - mLastExtremes[1 - extType][k]); if (diff > SENSITIVITY) { boolean isAlmostAsLargeAsPrevious = diff > (mLastDiff[k] * 2 / 3); boolean isPreviousLargeEnough = mLastDiff[k] > (diff / 3); boolean isNotContra = (mLastMatch != 1 - extType); if (isAlmostAsLargeAsPrevious && isPreviousLargeEnough && isNotContra) { end = System.currentTimeMillis(); if (end - start > 500) {// 此时判断为走了一步 CURRENT_SETP++; mLastMatch = extType; start = end; } } else { mLastMatch = -1; } } mLastDiff[k] = diff; } mLastDirections[k] = direction; mLastValues[k] = v; } } } //当传感器的经度发生变化时就会调用这个方法,在这里没有用 public void onAccuracyChanged(Sensor arg0, int arg1) { } } 展开
全部评论(1条)
-
- LUOBOBAICAI123 2017-05-29 00:00:00
- 因为F= ,F=G=mg 所以g=GM/r^2(gr^2=GM被称为黄金代换) G: 引力常量=6.67259*10^-11N㎡/kg^2(m^3/k·gs^2) M:ZX 天体质量/千克 r:天体ZX与物体ZX的距离/m g的单位是m/s^2或N/kg
-
赞(10)
回复(0)
热门问答
- 重力加速度的计步算法求讲解
- package com.altria.mystep.step; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * 这是一... package com.altria.mystep.step; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * 这是一个实现了信号监听的记步的类 * 这是从谷歌找来的一个记步的算法,看不太懂 * @author Liyachao Date:2015-1-6 * */ public class StepDetector implements SensorEventListener { public static int CURRENT_SETP = 0;//当前步数 public static float SENSITIVITY = 10; // SENSITIVITY灵敏度 public static boolean flag = false;//服务运行标志 private float mLastValues[] = new float[3 * 2]; private float mScale[] = new float[2]; private float mYOffset; private static long end = 0; private static long start = 0; /** * Z后加速度方向 */ private float mLastDirections[] = new float[3 * 2]; private float mLastExtremes[][] = { new float[3 * 2], new float[3 * 2] }; private float mLastDiff[] = new float[3 * 2]; private int mLastMatch = -1; /** * 传入上下文的构造函数 * * @param context */ public StepDetector(Context context) { super(); int h = 480; mYOffset = h * 0.5f; mScale[0] = -(h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2))); mScale[1] = -(h * 0.5f * (1.0f / (SensorManager.MAGNETIC_FIELD_EARTH_MAX))); } //当加速度传感器检测到的数值发生变化时就会调用这个方法 public void onSensorChanged(SensorEvent event) { if (!flag) return; Sensor sensor = event.sensor; synchronized (this) { if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) { float vSum = 0; for (int i = 0; i < 3; i++) { final float v = mYOffset + event.values[i] * mScale[1]; vSum += v; } int k = 0; float v = vSum / 3; float direction = (v > mLastValues[k] ? 1 : (v < mLastValues[k] ? -1 : 0)); if (direction == -mLastDirections[k]) { // Direction changed int extType = (direction > 0 ? 0 : 1); // minumum or // maximum? mLastExtremes[extType][k] = mLastValues[k]; float diff = Math.abs(mLastExtremes[extType][k] - mLastExtremes[1 - extType][k]); if (diff > SENSITIVITY) { boolean isAlmostAsLargeAsPrevious = diff > (mLastDiff[k] * 2 / 3); boolean isPreviousLargeEnough = mLastDiff[k] > (diff / 3); boolean isNotContra = (mLastMatch != 1 - extType); if (isAlmostAsLargeAsPrevious && isPreviousLargeEnough && isNotContra) { end = System.currentTimeMillis(); if (end - start > 500) {// 此时判断为走了一步 CURRENT_SETP++; mLastMatch = extType; start = end; } } else { mLastMatch = -1; } } mLastDiff[k] = diff; } mLastDirections[k] = direction; mLastValues[k] = v; } } } //当传感器的经度发生变化时就会调用这个方法,在这里没有用 public void onAccuracyChanged(Sensor arg0, int arg1) { } } 展开
- 磁铁切片机计算法、
- 磁铁切片机计算法、
- 串口6轴加速度计陀螺mpu6050怎么用来计步,能给个程序或算法吗
- 加速度传感器能不能实现计步功能
- 请问直流电焊机功率计算法?
- 实验室蒸馏酒精的问题求讲解
- 用的是旋转蒸发器,酒精浓度60%左右,在没有抽负压的时候,问下水浴的温度是多少?还有怎么判断蒸馏完成?以及整出的酒精浓度是否是95.57%?... 用的是旋转蒸发器,酒精浓度60%左右,在没有抽负压的时候,问下水浴的温度是多少?还有怎么判断蒸馏完成?以及整出的酒精浓度是否是95.57%? 展开
- 三轴加速计数据计算倾斜角算法
- 哪位大神给我来个三轴加速计计算倾斜角的算法
- 电阻式位移传感器,求讲解。(1)
- 电阻R1是起什么作用的?为什么只有电阻ob参与电路的变换,oa为什么没有考虑。我觉得等效的电路图应该是我红色手画的那个电路,oa、ob是一种类似并联的关系吧。... 电阻R1是起什么作用的?为什么只有电阻ob参与电路的变换,oa为什么没有考虑。 我觉得等效的电路图应该是我红色手画的那个电路,oa、ob是一种类似并联的关系吧。 展开
- qq运动怎么计算步数 骑自行车手机放在口袋里计步吗
- qq运动怎么计算步数 骑自行车手机放在口袋里计步吗
- 求 c# 基于ModBus RTU的CRC算法
- 在线等c# 基于ModBus RTU的CRC算法
- 怎么测量电池的电阻大小?求专业讲解!
- IOS开发关于根据陀螺仪获取加速度和重力感应,计算用户行走的步数算法?
- 已经根据IOS的陀螺仪框架获取到了加速计的z,x,y的值,和陀螺仪的重力感应的x,y,z的值,但是不知道怎么根据x,y,z计算出记步数,请求大神告知,万分感谢!
- 电路原理,功率表,问题写在纸上了,求讲解~
- 重力加速度传感器精度如何换算
- 重力加速度传感器精度如何换算 mg/lsb LSB/G bits/G 这些怎么换算?
- 哪位学霸给我讲解讲解化学方程式
- 视场光阑的算法?
- 在几何光学里面 ,一般在计算视场光阑的时候,如果没有给出渐晕系数的话,是不是直接用主光线即渐晕为0.5的光线来计算呢?
- 培养皿面积的算法?
- 我想请问一下微生物培养皿的面积怎么算,请各位高手帮帮忙,谢谢!
- 接触角的算法模型
在材料表面上附着的液滴会呈现出一定形状,这个形状取决于固体-液体-气体各界面之 间的张力平衡。1805 年 Thomas Young 首先提出了一个方程描述这个平衡态,从此接触角测 量就成为评价液体对固体表面润湿的经典方法。就接触角的数值而言,接触角越小说明固体 表面越容易被液体润湿,接触角越大说明固体表面越难被液体润湿。
20 世界末期随着电脑计算速度和高分辨率相机性能的不断提高,光学接触角测量仪器 完成了自动化和商品化,从此测量接触角成为操作方便结果可靠的实验手段。在此我们对仪 器是如何计算接触角的方法做一个简单的介绍。
实际上接触角值是通过测量液滴轮廓在三相接触点处的一阶导数即切线的斜率而得到 的,而三相接触点附近的液滴轮廓会受到各种光线的干扰,或者由于材料不够平整遮掩住三 相接触点附近的轮廓。所以光学法接触角测量并不是对数码照片上的某个夹角直接测量而得 到的,而是使用不同的数学模型拟合液滴轮廓,再通过计算得到的。
Z简单的模型就是球模型。球模型是把液滴的形状假定为球体的一部分,那么其截面形 状就是圆形的一部分。在此圆形的三相接触点处求解一阶导数即可计算出接触角数值。球模 型的缺陷在于没有考虑重力对液滴形状的影响。严格来讲在固体表面上任何液滴在重力作用 下形状都会偏离球形,体积越大偏离越多,密度越大偏离越多,接触角数值越大偏离越多。 普通情况下如果液滴体积小于 3 微升,接触角值小于 30°,才可以考虑使用球模型计算。 目前常见的 Circle 法,Width/Height 法,θ/2 法都是基于球模型的计算方法。
图 2 利用球模型计算接触角
二次曲线模型是考虑到在重力作用下液滴会被压扁,所以采用了包括圆方程、椭圆方程 等在内的广义的二次曲线模型来拟合液滴ZX截面的轮廓。此方法通用性较广,测量的理想 范围从 10°左右到 130°左右,测量精度较高。
图三 利用二次曲线模型计算接触角
Laplace-Young 模型是把重力和密度对液滴形状的影响定量计算在内的精确算法。为了 求解此方程需要引入ZX轴对称的假设。如果液滴是ZX轴对称的,Laplace-Young 模型是 此时的Z准确算法。如果液滴的接触角在 100°以上,那么它会比较符合轴对称的前提。接 触角越大则轴对称性越好,计算得到的接触角数值越准确。当接触角大于 150°时, Laplace-Young 模型甚至是唯yi正确的算法。通常接触角大于 60°时就可以考虑选择此算法, 接触角值大于 120°时,测量的准确性会相当理想。
图四 利用 Laplace-Young 模型计算接触角
以上介绍的算法模型都是以对称性为前提,但是实际情况或多或少会有些偏差,这时液 滴两边的轮廓耦合在一起时会相互影响。材料表面上的液滴有时会明显的偏离轴对称模型, 比如把针插入液滴内部通过加液-减液法测量动态接触角时,或是使用倾斜样品台测量滚动 角和动态接触角时的情况,液滴都呈明显的不对称的形状。为了更准确的测量不对称液滴的 接触角,我们可以选择对液滴轮廓的不同区域使用不同的算法模型进行分析,Z后将分析结 果加以综合得出Z佳的拟合结果。这种算法称为 Truedrop 模型,它可以适用于任何液滴无 论液滴是否对称。特别是在使用加液-减液法和倾斜台法测量动态接触角时是Z好的选择。
图五 利用 Truedrop 模型计算接触角
Z后提到的算法模型是 Tangent 切线法模型。切线法是将液滴在三相接触点附近的一小 段轮拟合成为二次曲线。切线法的优点在于不受液滴对称性的影响,因为它不考虑液滴的整 体轮廓。但是切线法的缺陷也是明显的,即我们一开始提到的液滴三相接触点附近的轮廓受 到光线和材料平整度的影响经常是不清晰的。所以大多数情况下,使用切线法的目的只是为 了和其他算法模型的计算结果进行参考对比。
图六 利用 Tangent 切线法模型计算接触角
Z后需要说明的是,不少仪器的软件功能在给出接触角测量结果的时候,同时给出了算 法模型和实测液滴轮廓之间的偏差值,多数情况下这个偏差值越小结果越准确。这个计算功 能可以帮助使用者判断所选用的算法模型是否合适。
其中 Young-Laplace、Conic(二次曲线模型)、TrueDrop、Circle(球模型)四种算法模型 是液滴整体轮廓拟合;Width-Height(基于球模型)、Tangent 切线法模型是局部拟合,所 以没有给出 Error 值。
(来源:北京东方德菲仪器有限公司)
- 玻璃棉板贴薄怎么计算多钱?求算法
- 机器视觉算法和运动控制算法都用matlab开发的吗
4月突出贡献榜
推荐主页
最新话题
参与评论
登录后参与评论