由于功率消耗GPS数据,我想仅使用加速度计X,Y和Z数据来计算设备速度.我已经阅读了很多有关此主题的问题,我尝试了许多设置来找到令人满意的解决方案来计算我的设备在汽车中时的速度. 看起来很简单,但没有任何效果,这使我发疯. 一直在尝试使用传感器.Type_linear_acceleration和传感器.type_acceleromemer,带有重力.在线性加速度数据上尝试了低通滤波器.不幸的是,一切都没有成功. 看来计算的速度是正确的,但是在我的汽车中测试计算的速度不会比2 m/s. 更高 在代码剪辑下方 mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); public void onSensorChanged(SensorEvent event) { if (event.sensor == mAccelerometer) { if (ti
以下是关于 accelerometer 的编程技术问答
我正在使用加速度计作为用户输入来开发针对Android(2.1+)的游戏.我使用一个传感器侦听器,该传感器在活动开始时使用传感器管理器注册,如下: mSensorManager.registerListener(SystemRegistry.inputSystem.mSensorListener, accSensor, SensorManager.SENSOR_DELAY_UI); 效果很好,我只是在onSensorChanged(SensorEvent event)中读取加速度计值,以便在我的游戏循环中使用它: public void onSensorChanged(SensorEvent event){ accX = event.values[0]; accY = event.values[1]; accY = event.values[2]; } 我正在编写一个实
我已经完成了 simpleApp教程 for libgdx.我已经更改了游戏的控件,以使用以下方式使用加速度计而不是触摸输入: MainActivity.java cfg.useAccelerometer = true; in Dropgame.java float acc = Gdx.input.getAccelerometerY(); bucket.x += acc * 120 * Gdx.graphics.getDeltaTime(); 我的问题是,如何允许两个风景?我希望能够将我的设备从一个景观方向转移到另一个景观,并随着它旋转. 我最接近我想要的是在清单中设置android:screenOrientation="sensorLandscape",但是虽然它确实在不允许肖像模式的情况下旋转屏幕,但它也倒转加速度计控件 ./p> 我是Android和libgdx的新手,所以我可能错过了一些明显的东西. 预先感谢! 解决方案 来自 li
我一直在研究方向估计,当我直线行走时,我需要估算正确的标题.面对一些障碍后,我再次从基础开始. 我从互补过滤器的输出是Euler角度,我还记录了按4D Quaternion输出设备方向的type_rotation_vector. 因此,我考虑将四元组转换为Euler,并将它们与从互补过滤器获得的欧拉进行比较.当手机保持静止在桌子上时,欧拉角的输出如下所示. 可以看出,偏航的值远离了一个巨大的边距. 当手机固定 时,我对这个简单的情况做错了什么 然后我走进客厅,得到以下输出. 互补过滤器的形状看起来非常好,并且非常接近Android.但是这些值以巨大的边距为单位. 请告诉我我在做什么错? 解决方案 我认为在陀螺仪上应用低通滤波器的任何需要.由于您将陀螺仪整合到旋转时,它可能会弄乱一切. 请注意,type_gravity是一种复合传感器读数,从陀螺仪和加速器内部的Android自身传感器融合算法合成.也就是说,这已经通过了卡尔曼过滤器.如
要在Android中获得从Euler角度(例如,俯仰,滚动,方位角)的方向,需要执行以下操作: sensormanager.getRotationMatrix(float [] r,float [] i,float [] Gravity,float [float [] geomagnetic); sensormanager.getorientation(float [] r,float []方向); 在第一个中,我意识到它使用了一种三合一算法;旋转矩阵(R [])由重力,地磁X重力,重力X(地磁X重力)组成--- x是交叉产物. 请参见下面的代码: float Ax = gravity[0]; float Ay = gravity[1]; float Az = gravity[2]; final float Ex = geomagnetic[0]; final float Ey = geomagnetic[1];
我试图在磁性北面方向从摄像机中指出矢量的方向.我的印象是我需要使用从getIrientation()返回的值,但我不确定它们代表什么.当我更改手机的方向时,我从getorientation()中获得的值不会可预测(旋转90度不会将值更改为90度).我需要知道getIrientation()返回的值是什么.到目前为止,我已经写了下面的内容: package com.example.orientation; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; im
传感器融合视频看起来很棒,但是没有代码: /a> 这是我的代码,它仅使用加速度计和指南针.我还在3个方向值上使用了Kalman过滤器,但这太多的代码无法在此处显示.最终,这可以正常工作,但是结果要么太抖动,要么太懒惰,具体取决于我对结果的处理以及我产生过滤因子的低点. /** Just accelerometer and magnetic sensors */ public abstract class SensorsListener2 implements SensorEventListener { /** The lower this is, the greater the preference which is given to previous values. (slows change) */ private static final float accelFilteringFactor = 0.1f; private
我正在研究Android上的行人导航系统.我目前正在尝试在3轴加速度计的参考计和应用于设备的运动之间获得旋转矩阵. 假设您正在用手中的设备直接向前行走,但是加速度计(因此设备的Y轴)的Y轴与您自己前进的方向并不相同(基本上是您'重新握住设备以尴尬的方式). 然后,如果我想应用距离(基于步骤检测),则将它们应用于加速度计的参考计(我知道方向)是错误的:必须将其相应地旋转到运动标题. 这就是为什么我想知道您是否可以启发我关于计算加速度计读数以将它们变成旋转角度(或矩阵)的方法的原因.这样的方法必须避免一次集成加速度,因为错误在廉价加速度计上是深度的(否则我认为执行非常容易). 编辑:磁力计和陀螺仪,即使在车站纳里时,也可以帮助您找到设备的方向,但不允许您知道设备正在移动的方向.我有第一个,我正在寻找第二个.基本上: 人类参考(运动方向) - >设备参考(或加速度计的参考) - >地球参考 ,我正在寻找找到旋转矩阵以计算从HR到DR的距离的方法,然后我将其应用于我
我希望能够在我的应用程序中具有相当简单的秋季检测算法.目前,在OnSenSorchanged()中,我从中获得了当前x,x,z值的绝对值,并从中获得了sensormanager.gravity_earth(9.8 m/s).最终值必须长10次,以设置标志,说加速度计检测到跌落的标志,阈值约为8m/s. 还要一旦通过阈值,我就会比较手机的方向,并且在不再通过阈值时它的orienation,这设置了另一个标志,说方向传感器已检测到跌落. 设置两个标志时,发生一个事件以检查用户,等等.将其保持在一定角度,可能超过15m/s.这会导致其他事件触发秋季检测,如果我增加了阈值以避免这种情况,它就不会检测到跌落. 谁能在这里给我一些建议,我应该使用哪些可能的价值或如何改善我的方法?非常感谢. 解决方案 首先,我想提醒您,您不能像它们一样将x,y,z值添加在一起,您必须使用矢量数学.这就是为什么您获得超过15 m/s的值的原因.只要手机不移动,矢量和应始终约为9.8 m/s.您可以
对于我的应用程序,我需要计算设备的加速度,以参考true North.我的想法是计算磁性北极的设备取向,并将偏斜应用于其以使其定向到True North.然后,我想计算设备的加速度并将其引用到方向,但我不知道该怎么做. 我将尝试使用SensorManager.getRotationMatrix()和SensorManager.getOrientation()来获得设备方向.然后,我通过GeomagneticField.getDeclination()偏斜,然后将其应用于SensorManager.getOrientation() 的方向值的方位角. 但是如何将加速度计值映射到此方向?有可能吗? 解决方案 加速度计传感器返回设备的加速度.这是3个维空间中的矢量.该向量在设备坐标系中返回.您想要的是世界坐标中该向量的坐标,这只是 R = rotation matrix obtained by calling getRotationMatrix A_D = acce
我想以45度增量检测iPhone的方向.理想情况下,我希望能够沿任何轴上获得方向. 我需要做的检测类似于iPhone的三体在方向发生变化时如何向屏幕的当前底部位置闪烁箭头. 我有编码的东西,但真的不了解加速度计读数如何工作,并且可以在正确的方向上使用轻推.我当前的代码记录了当前角度,但是即使手机平坦,我也会每秒几次读取几次. - (void) checkOrientation:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration { int accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor); int accelerationY = acceleration.y * kfilteringFactor + acceleratio
我正在尝试获得加速度计和方向数据.目前,我创建了一个AccelerMeTermanager和OrientationManager.他们俩都做同样的事情.在OnSenSorchanged()侦听器中实现SensoreVentListener并从值[]中检索数据. 有一个更简单的方法吗?似乎有2个具有重复代码的处理程序是不审查的.有没有一种方法可以一起访问使用组合加速度计和方向数据的值[]数组? 由于有两个处理程序,我也必须这样做: orientationManager = new OrientationManager(this); orientationSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); orientationSensorManager.registerListener(orientationManager, orientati
当前,我正在尝试使用 getRotation()方法使用方向传感器值旋转3D立方体.当Android设备在某些边界上方旋转时,会观察到一些意外的行为.例如,如果我使设备"站立",则"滚动"的价值就会变得疯狂. 我也经历了类似于所谓的gimbal-lock的现象.唯一的区别是,在将传感器值应用于3D旋转之前,我也会遇到问题.当我尝试通过仅围绕"音高"轴旋转设备来更改"音高"值时,"偏航"值也会根据俯仰的旋转而变化.这对我来说似乎是完全不合理的. 有人可以帮我吗?我陷入了一个月的问题. 解决方案 这是偏航,音高和滚动的常见问题.只要您使用偏航,音高和滚动( euler Angles ),就无法摆脱它. 我在运动传感应用中使用旋转矩阵而不是欧拉角.有关旋转矩阵的介绍,我建议: 旋转矩阵像魅力一样工作. Quaternions 也很受欢迎,据说是最稳定的. [此答案是从这里复制的. P> 其他解决方案 使用四元组计算YPR并不是要解决任何问题. gimb
我正在尝试将地磁和加速度计转换以在OpenGL ES1中旋转相机,我从Android找到了一些代码,并更改了此代码的iPhone代码,实际上它或多或少地工作了,但是有些错误,我m找不到这个错误,我把代码放了,也请呼叫OpenGL ES1:glLoadMatrixf((GLfloat*)matrix); - (void) GetAccelerometerMatrix:(GLfloat *) matrix headingX: (float)hx headingY:(float)hy headingZ:(float)hz; { _geomagnetic[0] = hx * (FILTERINGFACTOR-0.05) + _geomagnetic[0] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[3] * (0.55); _geomagnetic[1] = hy * (FILTERINGFACTOR-0.05) + _geom
我在加速度计时遇到了一些问题.当我刚开始开发游戏时,控件感觉非常活跃和精确,但是当添加更多图形元素时,加速度计感觉就像反应非常晚,有时不像以前那样精确.我的帧率约为40fps. 这是我阅读值的地方(我想我应该) - (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration; 这是一种常见和预期的行为,还是我可以为此做些什么?可以控制样本率和精度吗?或者如果发生这种情况,做错了什么? 解决方案 如果您的游戏之前和现在没有响应,那么加速度计的更新率不是问题.您如何将加速度计的事件传播到游戏循环中?如果您的方向更新的速度比主要循环消耗的速度快,那可能会感觉像其他延迟. 其他解决方案 是的,可以自由调整样本率: //sample rate 100hz #define kAccelerometerFrequency 100.0f
你好 我正在尝试拥有它,因此一旦用户摇动设备.我想要一个声音播放.但是,一旦我摇动设备崩溃,这就是我使用的代码 - (BOOL)canBecomeFirstResponder { return YES; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self becomeFirstResponder]; } - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if(motion == UIEventSubtypeMotionShake) { NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"]; if (the
基于我是Objective-C的新手我的代码期间的某个点? 我首先创建一个cmaccelerometerdata类的实例: CMAccelerometerData *myAccelerometer; 然后访问其加速属性: double axisYvalue = [myAccelerometer acceleration]; 以上显然是错误的,不是吗?我必须专门找到y,所以我该怎么做? double axisYvalue = [myAccelerometer acceleration->y]; // no this is wrong as well.. 那我该怎么做? ,如果我可以:) 一个最后一个问题 鉴于我提到的这个特定的类和属性..并说我已经实例化了我的cmaccelerometer类.现在,每次在代码期间,我都使用 之类的东西 return [myAccelerometer acceleration->y]; // let's s