【问题标题】:What is the "proper" way to get rid of gravity from accelerometer data?从加速度计数据中去除重力的“正确”方法是什么?
【发布时间】:2023-01-05 04:45:44
【问题描述】:

“gyro”数组和accelwithg数组都是硬件返回的数据,分别是加速度计和陀螺仪。

我的思考过程如下:

  1. 计算每帧之间的时间差
  2. 将所有角度相加
  3. xyz 旋转的旋转矩阵
  4. 将旋转矩阵乘以重力数组 (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


【解决方案1】:

您将陀螺仪角度从弧度转换为度数,然后使用了 numpy 三角函数。这些三角函数需要以弧度为单位的角度而不是度数。

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 2012-09-18
    • 2011-10-18
    • 2011-03-23
    • 1970-01-01
    • 2014-10-03
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多