使用10-DOF IMU在3d空间中跟踪位置

时间:2014-10-16 21:42:55

标签: arduino accelerometer sensor gyroscope

我需要在3d空间中跟踪枪的位置和方向。我购买了10自由度IMU传感器(GY-87),以便正确学习如何实现我的问题解决方案。由于缺乏电子和传感器领域的知识,我无法找到适当的指导。 我找到了一些很好的例子,但无法在arduino中实现它。

3d Tracking with IMU

Gait-Tracking-With-x-IMU

我目前能够从传感器检测偏航,俯仰和滚转,从中我可以检测到我的枪的正确方向。但我找不到计算位置(x,y,z)的方法。

如果有人能在这方面帮助我,我将不胜感激。

谢谢

P.S:我找不到GY-87的大量资源,可能会被弃用。但由于我国资源不足,我不得不使用这种传感器。我是一名计算机科学专业的学生,​​也是新兴的电子学,所以如果我没有使用任何合适的术语,请纠正我。

2 个答案:

答案 0 :(得分:3)

加速度计永远不会给你一个位置,它会给你......加速度。
但加速度与速度有关,与位置有关 如果你看单位,你会看到这种关系。加速度以米/秒平方(m /s²)表示,而速度以米/秒(m / s)表示,位置以米(m)表示。
所以如果是   t是自上次计算位置(例如循环)以来经过的时间,
  你从传感器读取的加速度,
  老的速度,s'新的速度,
  p旧位置和p'新位置,

s'= s + a * t
p'= p + s'* t

您需要在3个轴(x,y,z)中进行相同的计算。 假设您知道起始位置且起始速度为零,则可以实时跟踪对象。

答案 1 :(得分:0)

积分就像计算曲线下面的区域一样。让我们只考虑一个方向X.如果你想象一个加速度随时间变化的图表,你有时间作为横坐标(水平)和加速度纵坐标(垂直)。

如果你有两个标量值a1和a2代表时间t1和t2的加速度,并想象中间两者之间的线性过渡(时间(t1+t2)/2加速度为(a1+a2)/2 ...)您可以使用此曲线绘制的形状是基部a1和a2的直角梯形以及长度为t2-t1的一侧(具有矩形角)(也就是高度)。

该区域为(base1+base2)*height/2 = (a1+a2)*(t2-t1)/2(a1+a2)/2 * delta_t

其中delta_t是,(t2-t1),传感器读数之间的时间间隔 和(a1 + a2)/ 2是最后两个读数值的平均值。

这样做可能会从初始速度s0开始得到近似的速度差异(如果你开始静止,可以假设为零)

s(n) = (a(n-1)+a(n))/2 * delta_t + s0

以同样的方式再次整合"空间" x或距离起点x0

的距离

x(n) = (s(n-1)+s(n))/2 * delta_t + s0x + x0

如果从0开始静止,则可以安全地假设s0 = 0且x0 = 0

s(n) = (a(n-1)+a(n))/2 * delta_t x(n) = (s(n-1)+s(n))/2 * delta_t

或以编程方式,仅保存最后的值:

old_a=a;
old_s=s;
a=getAccelerationX();

s = (old_a+a) * delta_t / 2.0;
x = (old_s+s) * delta_t / 2.0;

请考虑这假设一个固定的静止(速度= 0)已知(x = 0)起始位置,能够继续跟踪加速度的一个分量(无论传感器在空间中如何旋转),以及它一段时间后,不可避免地会出现越来越多的错误,因为最小的错误会加起来,因此对于可以在一段时间后使用其他方法进行测试的位置来说,它是理想的。

P.S。如果你在C中的微控制器(Arduino)上执行操作,请注意表达公式:如果old_a和a是整数,/ 2将截断除法小数的结果(坏主意),而/2.0将生成一个浮点数。 (old_a + a)/ 2 * delta_t比(old_a + a)* delta_t / 2差。最后一个错误较少,但要注意它不会溢出。只是说每个错误都会总结,所以要小心你的计算方法。