【发布时间】:2023-01-05 04:45:44
【问题描述】:
“gyro”数组和accelwithg数组都是硬件返回的数据,分别是加速度计和陀螺仪。
我的思考过程如下:
- 计算每帧之间的时间差
- 将所有角度相加
- xyz 旋转的旋转矩阵
- 将旋转矩阵乘以重力数组 (0,0,9.8) 以获得无重力加速度
然而,我注意到这种方法并不总是有效,因为数据变化很大,而且重力没有被正确过滤掉。有没有更好的方法来解决这个问题?
# gyro-meter calculations dt = (ts - last_ts_gyro) / 1000 last_ts_gyro = ts gyro_angle_x = gyro[0] * dt gyro_angle_y = gyro[1] * dt gyro_angle_z = gyro[2] * dt if firstGyro: total_x = gyro_angle_x total_y = gyro_angle_y total_z = gyro_angle_z firstGyro = False # totals total_x += gyro_angle_x total_y += gyro_angle_y total_z += gyro_angle_z # rad = > degree dtotal_x = np.rad2deg(total_x) % 360 dtotal_y = np.rad2deg(total_y) % 360 dtotal_z = np.rad2deg(total_z) % 360 # rotation matrix Qx = np.array( [[1, 0, 0], [0, np.cos(dtotal_x[0]), -np.sin(dtotal_x[0])], [0, np.sin(dtotal_x[0]), np.cos(dtotal_x[0])]]) Qy = np.array( [[np.cos(dtotal_y[0]), 0, np.sin(dtotal_y[0])], [0, 1, 0], [-np.sin(dtotal_y[0]), 0, np.cos(dtotal_y[0])]]) Qz = np.array( [[np.cos(dtotal_z[0]), -np.sin(dtotal_z[0]), 0], [np.sin(dtotal_z[0]), np.cos(dtotal_z[0]), 0], [0, 0, 1]]) Qxyz = Qx@Qy@Qz # a -Qxyz*g to filter out gravity g = np.array([[0], [0], [gravity_norm]]) rotated_g = Qxyz @ g accelwithoutg = np.subtract(accelwithg, rotated_g)
【问题讨论】:
-
这在一般工程中是一个大问题。对最先进技术的全面阐述将不属于 SO 的主题。我建议你对这个主题做一些研究:我向你保证有很多材料可以使用。以 madgwick 过滤器为例。
-
没有一些测试数据,我真的帮不上忙。但是我可以建议:编写一个测试函数,在其中输入一些陀螺仪/加速度计值并获得预期的加速度;使用
scipy.spatial.transform.Rotation.from_euler;如果没有特别好的传感器,积分加速度值可能会由于漂移而导致随着时间的推移出现很大的误差。如果您有没有旋转的时刻,请使用它们重新校准漂移。 -
如果信号(加速度)变化很快,您需要及时获得更多样本。所以我觉得你的方法很好。如果无法获得更多样本,则可能需要平滑加速度的变化或进行推断。如评论所述,您需要深入研究过滤和信号处理。
标签: python accelerometer gyroscope motion