- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL;DR
How come the accelerometer values I get from
Sensor.TYPE_ACCELEROMETER
are slightly offset? I don't mean by gravity, but by some small error that varies from axis to axis and phone to phone.Can I calibrate the accelerometer? Or is there a standard way of compensating for these errors?
Sensor.TYPE_ACCELEROMETER
得到的原始值关闭。如果我让手机在屏幕朝上的情况下放在完全水平的表面上,加速度计显示的 Z 值为 9.0,应该是 9.81 左右。同样,如果我将手机置于纵向或横向模式,X 和 Y 加速度计值显示大约 9.6。而不是 9.81。
SensorManager.getRotationMatrixFromVector()
, 来计算垂直加速度,根据设备的旋转,产生不同的垂直加速度。
Sensor.TYPE_LINEAR_ACCELERATION
之前相反,我必须指出我实际上也在这样做,与
TYPE_ACCELERATION
平行。 .然后通过使用重力传感器计算垂直加速度(
as described in this answer)。有趣的是,我得到的结果与使用原始加速度计的方法完全相同,
SensorManager.getRotationMatrixFromVector()
和矩阵乘法(最后减去重力)。
X+0.21
、
Y+0.21
和
Z+0.81
)然后执行旋转矩阵的东西来获得世界坐标系的加速度。请注意,因为不仅仅是计算出的垂直加速度是错误的 - 它实际上是来自
Sensor.TYPE_ACCELEROMETER
的原始值。 ,我认为不包括陀螺仪传感器等其他误差源?
Sensor.TYPE_ACCELEROMETER
的值怎么来的?关闭了,有没有更好的方法来“校准”加速度计,而不是简单地观察它们偏离重力的程度并在使用它们之前将差异添加到值上?
最佳答案
您应该校准 3 个加速度计的增益、偏移和角度。
不幸的是,这里不可能加深整个话题。
我将写一个简短的介绍,描述基本概念,然后我将发布一个实现校准的简单 Clinometer 代码的链接。
校准程序可以在您选择的不同正交位置使用 7 个错误(计算大量样本的平均值)来完成,以便获得加速度计的所有 +-0 和 +-g 值。例如:
mean[][]
计算偏移和增益:
calibrationOffset[0] = (mean[0][2] + mean[0][3]) / 2;
calibrationOffset[1] = (mean[1][4] + mean[1][5]) / 2;
calibrationOffset[2] = (mean[2][0] + mean[2][6]) / 2;
calibrationGain[0] = (mean[0][2] - mean[0][3]) / (STANDARD_GRAVITY * 2);
calibrationGain[1] = (mean[1][4] - mean[1][5]) / (STANDARD_GRAVITY * 2);
calibrationGain[2] = (mean[2][0] - mean[2][6]) / (STANDARD_GRAVITY * 2);
使用
mean[axis][step]
的值, 其中
STANDARD_GRAVITY = 9.81
.
for (int i = 0; i < 7; i++) {
mean[0][i] = (mean[0][i] - calibrationOffset[0]) / calibrationGain[0];
mean[1][i] = (mean[1][i] - calibrationOffset[1]) / calibrationGain[1];
mean[2][i] = (mean[2][i] - calibrationOffset[2]) / calibrationGain[2];
}
最后计算校正角度:
for (int i = 0; i < 7; i++) {
angle[0][i] = (float) (Math.toDegrees(Math.asin(mean[0][i]
/ Math.sqrt(mean[0][i] * mean[0][i] + mean[1][i] * mean[1][i] + mean[2][i] * mean[2][i]))));
angle[1][i] = (float) (Math.toDegrees(Math.asin(mean[1][i]
/ Math.sqrt(mean[0][i] * mean[0][i] + mean[1][i] * mean[1][i] + mean[2][i] * mean[2][i]))));
angle[2][i] = (float) (Math.toDegrees(Math.asin(mean[2][i]
/ Math.sqrt(mean[0][i] * mean[0][i] + mean[1][i] * mean[1][i] + mean[2][i] * mean[2][i]))));
}
calibrationAngle[2] = (angle[0][0] + angle[0][1])/2; // angle 0 = X axis
calibrationAngle[1] = -(angle[1][0] + angle[1][1])/2; // angle 1 = Y axis
calibrationAngle[0] = -(angle[1][3] - angle[1][2])/2; // angle 2 = Z axis
您可以在这个开源 Clinometer 应用程序中找到一个简单但完整的 3 轴校准实现:
https://github.com/BasicAirData/Clinometer .
CalibrationActivity.java
中找到校准程序。 ; ClinometerActivity.java
. 关于Android加速度计校准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43364006/
使用 Kinect for Windows SDK,校准相机的最简单方法是什么? 我找到了这篇可爱的博文 http://nicolas.burrus.name/index.php/Research/K
我最初在 OpenCV 论坛上发布了这个,但不幸的是,我没有得到太多的意见/回复,所以我在这里发布是希望有人可能有方向建议? 我正在使用 Bumblebee XB3 立体相机,它有 3 个镜头。我花了
当移动很远的距离时,比如去另一个城市,关闭 GPS,打开它需要很长时间才能找到第一个正确的点。 因此,如果我通过示例注册到 gps 提供程序,则可能需要 10 分钟才能收到第一个 onLocation
在我的应用中,我使用加速度计来控制游戏中的角色。现在我只允许纵向,所以用户必须向右或向左倾斜设备才能移动角色。到目前为止一切正常。我现在想要完成的是“校准”加速度计以考虑用户正在玩的当前倾斜度。假设用
我使用 2 个 CANON EOS60d 作为立体设置来进行摄影测量。我正在使用 OpenCV 使用高精度 Circlegrid 校准模式校准两个相机。我正在使用信号发生器同时触发两个相机,早些时候我
我花了很长时间才让函数在 OpenCV 中运行,所以我想知道我的总体计划是否有意义,然后再深入研究尝试实现它的细节。 (2.3.1、Windows 7、C++)如果有任何建议,我将不胜感激。 问题:
我注意到 h2o.ai 套件的一个相对较新的添加,能够执行补充 Platt Scaling 以改进输出概率的校准。 (请参阅 calibrate_model in h2o manual 。)不过,在线
我正在尝试在 STM32F042 微 Controller 上读取 VDDA。我在 VDD 为 3.29V 时得到了意想不到的结果。我一定缺少一些基本的东西。 输出: VREFINT=1917; VR
请原谅我对编码完全陌生。首先,出于该项目的目的,我正在使用 Python 绑定(bind)到 OpenCV 的库。 我的相机已针对显示鱼眼失真进行了校准。我分别获得了 K 和 D 的以下值,即固有相机
如何使用 Netbeans 8.1 进行 JDK 校准。我用谷歌搜索了一些并找到了这个链接 here . It says "choose Profile > Advanced Commands > R
我目前正在开发增强现实应用程序。目标设备是光学透视 HMD,我需要校准其显示器以实现虚拟对象的正确注册。我用过那个implementation of SPAAM对于 android 来说,结果对于我的
我是一名优秀的程序员,十分优秀!