Arduino 基于10-DOF惯性测量单元的三维空间位置跟踪

Arduino 基于10-DOF惯性测量单元的三维空间位置跟踪,arduino,accelerometer,sensors,gyroscope,Arduino,Accelerometer,Sensors,Gyroscope,我需要在3d空间中跟踪枪的位置和方向。我购买了一个10自由度的IMU传感器(GY-87),以正确地学习如何实施问题的解决方案。由于缺乏电子和传感器方面的知识,我无法找到合适的指导。 我发现了一些很好的例子,但无法在arduino中实现 我现在可以通过传感器检测偏航、俯仰和侧倾,从中我可以检测到我的枪的正确方向。但我找不到计算位置(x,y,z)的方法 如果有人能在这方面帮助我,我将不胜感激 多谢各位 附言:我找不到GY-87的太多资源,可能是它已经被弃用了。但是由于我的国家没有可用的资源,我不

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

我现在可以通过传感器检测偏航、俯仰和侧倾,从中我可以检测到我的枪的正确方向。但我找不到计算位置(x,y,z)的方法

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

多谢各位


附言:我找不到GY-87的太多资源,可能是它已经被弃用了。但是由于我的国家没有可用的资源,我不得不使用这个传感器。我是一名计算机科学专业的学生,对电子技术一无所知,如果我没有使用任何合适的术语,请纠正我。

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

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

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

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

如果你有两个标量值A1和A2代表T1和T2时刻的加速度,想象中间两个之间的线性过渡(在时间<代码>(T1+T2)/ 2 < /代码>加速度是<代码>(A1+A2)/ 2 < /代码>…))你可以用这个曲线画出的是一个直角梯形的A1和A2和一个边(具有矩形角度)。长度t2-t1(也就是高度)

该区域为
(base1+base2)*高度/2
=
(a1+a2)*(t2-t1)/2
(a1+a2)/2*delta\t

式中,δ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\u t
x(n)=(s(n-1)+s(n))/2*delta\u 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)起始位置,继续跟踪加速度的一个分量(不管传感器如何在空间中旋转)的能力,并且随着最小误差的增加,它不可避免地会在一段时间后得到越来越多的误差,因此,这是理想的位置,可以测试一段时间后与其他方法


另外,如果你在C语言中的微控制器(Arduino)上执行操作,请注意如何表达公式:如果旧的a和a是整数,/2将截断除法结果,丢弃小数(坏主意),而/2.0将生成浮点。(旧a+a)/2*增量t比(旧a+a)*增量t/2差。最后一个错误较少,但请注意不要溢出。也就是说,每个误差都会加起来,所以要小心计算。

你必须收集一段时间内的加速度数据,并将其积分两次,以获得位移,即从初始位置移动的距离。正如Franck提到的,为了计算3D空间中的合成位移,每个轴都必须计算3个位移