我需要在3d空间中跟踪枪的位置和方向。我购买了10自由度IMU传感器(GY-87),以便正确学习如何实现我的问题解决方案。由于缺乏电子和传感器领域的知识,我无法找到适当的指导。 我找到了一些很好的例子,但无法在arduino中实现它。
我目前能够从传感器检测偏航,俯仰和滚转,从中我可以检测到我的枪的正确方向。但我找不到计算位置(x,y,z)的方法。
如果有人能在这方面帮助我,我将不胜感激。
谢谢
P.S:我找不到GY-87的大量资源,可能会被弃用。但由于我国资源不足,我不得不使用这种传感器。我是一名计算机科学专业的学生,也是新兴的电子学,所以如果我没有使用任何合适的术语,请纠正我。答案 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差。最后一个错误较少,但要注意它不会溢出。只是说每个错误都会总结,所以要小心你的计算方法。