C++ 如何执行陀螺仪数据的离散积分?

C++ 如何执行陀螺仪数据的离散积分?,c++,c,robotics,sensors,tilt-sensor,C++,C,Robotics,Sensors,Tilt Sensor,陀螺仪在集成时测量角度的旋转速率,产生正确的角度? 我的问题是我如何做到这一点?到目前为止,我所做的只是添加我检测到的所有角度,这似乎是非常错误的 AngleIntegrated = GyroDegPersec * (1/GyroBandWidth); 欢迎提出建议。谢谢您需要在时间方面进行整合。所以理想情况下,你应该以固定的时间间隔T对陀螺仪进行采样,然后将采样间隔T合并到积分计算中 请注意,T需要足够小,以满足奈奎斯特标准。知道,当然,从长远来看,你不能指望有一个正确的值(通过积分,你的误

陀螺仪在集成时测量角度的旋转速率,产生正确的角度? 我的问题是我如何做到这一点?到目前为止,我所做的只是添加我检测到的所有角度,这似乎是非常错误的

AngleIntegrated = GyroDegPersec * (1/GyroBandWidth);
欢迎提出建议。谢谢

您需要在时间方面进行整合。所以理想情况下,你应该以固定的时间间隔T对陀螺仪进行采样,然后将采样间隔T合并到积分计算中


请注意,T需要足够小,以满足奈奎斯特标准。

知道,当然,从长远来看,你不能指望有一个正确的值(通过积分,你的误差窗口将始终随时间增加)。我要做的是读取陀螺仪,内插当前读数和前几个读数,以获得平滑曲线(例如,使用当前读取和前两次读取的抛物线),然后根据上次读取时间和当前时间计算该抛物线的积分。

您可以在离散域中积分。假设角速率为da,则其时间积分为a。 k是离散步数

a(k) = a(k-1) + T*0.5*(da(k) + da(k-1))
例如,da(k)是当前角速率读数。da(k-1)是前一个角速率读数。a(k-1)是前一步的积分值(旋转角度)。T是采样速率。如果传感器每1毫秒输出一次,T变为0.001


当k>0时,可以使用此公式。初始值a(0),必须给出。

谢谢你的回答!这是像龙格库塔二阶吗,先生?龙格库塔使用了4个点,因此当前和之前的3个点。因此,它确实给出了1.5个周期前的值的很好的估计。这个延迟是为更好的估计器付出的代价。你可以通过改变权重来减少延迟,但这也会减少平滑的质量。@MSalters和6502你有这样的实现的例子吗?@sam:这很简单,我不想麻烦,只要
(1*x[-3]+3*x[-2]+3*x[-1]+x[0])/8
谢谢你的回答。我会在陀螺仪有新数据提供时立即对它进行采样,以50 hz的带宽进行。我会以(1/50)的频率采样秒。我的代码应该是什么来实际执行这个积分计算?@user571099:好的,如果
1/GyroBandWidth
是您的采样间隔(
T
,在我上面的回答中)那么是的,你的计算基本上是正确的。但是请注意,为了得到准确的结果,你可能应该实现一个适当的积分器,而不仅仅是求和。对不起,我不知道,我该如何做一个适当的积分器?我只使用c。除了c,我想不出任何其他方法来做积分summing@user571099:通常为数字积分器设计为具有频率响应,从而消除了在输入信号中积累任何小的恒定误差的问题(如果您只是不断求和,小的直流偏移显然会随着时间积累为大的误差值)。假设在C代码中,先生,我如何执行数字积分?