Ale*_*xis 6 android tracking accelerometer filter gyroscope
最近我做了一些研究,使用加速度计+陀螺仪来使用那些传感器在没有GPS帮助的情况下跟踪智能手机(参见这篇文章) 基于陀螺仪和加速度计的室内定位系统
为此我需要我的方向(角度(俯仰,滚动等))所以这里到目前为止我所做的:
public void onSensorChanged(SensorEvent arg0) {
if (arg0.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
accel[0] = arg0.values[0];
accel[1] = arg0.values[1];
accel[2] = arg0.values[2];
pitch = Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2))));
tv2.setText("Pitch: " + pitch + "\n" + "Roll: " + roll);
} else if (arg0.sensor.getType() == Sensor.TYPE_GYROSCOPE )
{
if (timestamp != 0) {
final float dT = (arg0.timestamp - timestamp) * NS2S;
angle[0] += arg0.values[0] * dT;
filtered_angle[0] = (0.98f) * (filtered_angle[0] + arg0.values[0] * dT) + (0.02f)* (pitch);
}
timestamp = arg0.timestamp;
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我试图从我的加速度计(音调)角度(仅用于测试),从陀螺仪_X的集成通过时间过滤它与互补滤波器
filtered_angle [0] =(0.98f)*(filtered_angle [0] + gyro_x*dT)+(0.02f)*(音高)
与dT开始或多或少0.009 secondes
但我不知道为什么,但我的角度不是很准确......当设备平放在桌子上时(屏幕朝上)
Pitch (angle fromm accel) = 1.5 (average)
Integrate gyro = 0 to growing (normal it's drifting)
filtered gyro angle = 1.2
Run Code Online (Sandbox Code Playgroud)
当我拿起90°的手机时(看到屏幕朝向我面前的墙壁)
Pitch (angle fromm accel) = 86 (MAXIMUM)
Integrate gyro = he is out ok its normal
filtered gyro angle = 83 (MAXIMUM)
Run Code Online (Sandbox Code Playgroud)
所以角度永远不会达到90 ??? 即使我尝试将手机抬得多一点......为什么直到90°才行?我的计算错了吗?或传感器垃圾的质量?
我想知道的另一件事是:使用Android我不会"读出"传感器的值,但是当它们发生变化时我会收到通知.问题在于,正如您在代码中看到的那样,Accel和Gyro共享相同的方法....因此,当我计算滤波后的角度时,我会在之前的几秒钟内采取加速度测量的间距,不是吗?这可能是我问题的根源吗?
谢谢 !
我只能重复自己.
通过将线性加速度积分两次得到位置,但误差很大.它在实践中毫无用处.换句话说,你正试图解决不可能的问题.
你实际上可以做的是跟踪方向.
滚动,俯仰和偏航是邪恶的,不要使用它们.请查看我已经推荐的视频,时间是38:25.
这是一个关于如何使用陀螺仪和加速度计跟踪方向的优秀教程.
您可能会发现有用的类似问题:
在没有GPS的情况下跟踪iphone的
小动作当用于定位时,手机加速度计的真实世界准确度是多少?
如何计算手机在休息时垂直方向的运动?
iOS:3D空间中的移动精度
如何使用加速度计测量Android应用程序开发的
距离加速度计移动的距离
如何找到陀螺仪和加速度计的行进距离?
| 归档时间: |
|
| 查看次数: |
18477 次 |
| 最近记录: |