如何仅使用基本代数运算计算加速度计的旋转矩阵

问题描述 投票:0回答:2

有一个 C 函数,获取加速度传感器(MEMS IMU)的 x、y、z 加速度值作为输入,并以 z 轴与重力对齐的方式计算旋转矩阵。它用于校准加速度计数据。


#define X_AXIS (0u)
#define Y_AXIS (1u)
#define Z_AXIS (2u)

static float matrix[3][3];
void calculate_rotation_matrix(float raw_x, float raw_y, float raw_z)
{ 
  const float r = sqrtf(raw_x * raw_x + raw_y * raw_y + raw_z * raw_z);
  const float x = raw_x / r;
  const float y = raw_y / r;
  const float z = raw_z / r;

  const float x2 = x * x;
  const float y2 = y * y;

  matrix[X_AXIS][X_AXIS] = (y2 - (x2 * z)) / (x2 + y2);
  matrix[X_AXIS][Y_AXIS] = ((-x * y) - (x * y * z)) / (x2 + y2);
  matrix[X_AXIS][Z_AXIS] = x;
  matrix[Y_AXIS][X_AXIS] = ((-x * y) - (x * y * z)) / (x2 + y2);
  matrix[Y_AXIS][Y_AXIS] = (x2 - (y2 * z)) / (x2 + y2);
  matrix[Y_AXIS][Z_AXIS] = y;
  matrix[Z_AXIS][X_AXIS] = -x;
  matrix[Z_AXIS][Y_AXIS] = -y;
  matrix[Z_AXIS][Z_AXIS] = -z;
}



float result[3];
void apply_rotation(float x, float y, float z)
{
  result[AXIS_X] = matrix[X_AXIS][X_AXIS] * x
                 + matrix[X_AXIS][Y_AXIS] * y
                 + matrix[X_AXIS][Z_AXIS] * z;
  
  result[AXIS_Y] = matrix[Y_AXIS][X_AXIS] * x
                 + matrix[Y_AXIS][Y_AXIS] * y
                 + matrix[Y_AXIS][Z_AXIS] * z;
  
  result[AXIS_Z] = matrix[Z_AXIS][X_AXIS] * x
                 + matrix[Z_AXIS][Y_AXIS] * y
                 + matrix[Z_AXIS][Z_AXIS] * z;

}

我试图理解它是如何工作的以及为什么这里没有使用三角函数? 难道只是通过对输入值进行归一化并使用等效方程来计算三角函数来简化三角函数吗?

这种方法有什么局限性?例如,当计算的分母为零时,我们将除以零。还有什么吗?

尝试在互联网和stackoverflow上搜索,但找不到类似的方法来计算旋转矩阵。

更新:

只是简化了计算,使其更具可读性。 为了添加更多上下文,此代码用于旋转加速度计的读数,无论设备的方向如何,z 轴都垂直于地面。

当我们知道物体是静止的并且位于平坦的表面上时,就会调用calculate_rotation_matrix()。这将导致计算 3x3 矩阵。然后使用 apply_rotation() 来旋转后续读数。

accelerometer calibration rotational-matrices imu mems
2个回答
0
投票

四元数表示可以应用旋转而无需三角函数。但这似乎是以下版本: https://math.stackexchange.com/a/476311 。数学似乎是其变体,其中“a”和“b”是加速度计和重力矢量。

该方法似乎还假设测量结果并不完美。 MEMS 传感器符合这一描述。否则,正如您所说,如果 x 和 y 都为零,那么您就有被零除的条件。


© www.soinside.com 2019 - 2024. All rights reserved.