旋转矩阵、欧拉角、四元数理论及其转换关系

17 篇文章 2 订阅
4 篇文章 4 订阅

旋转矩阵求四元数

  • 情况1: 在这里插入图片描述
  • 情况2:
    如果 q 0 q_0 q0趋近于0, t r ( R ) tr(R) tr(R)趋近于-1,则求解四元数的过程为:
    • 2.1 如果 m a x { r 11 , r 22 , r 33 } = r 11 max \left\{ r_{11},r_{22},r_{33} \right\} =r_{11} max{r11,r22,r33}=r11
      在这里插入图片描述
    • 2.2 如果 m a x { r 11 , r 22 , r 33 } = r 22 max \left\{ r_{11},r_{22},r_{33} \right\} =r_{22} max{r11,r22,r33}=r22
      在这里插入图片描述
    • 2.3 如果 m a x { r 11 , r 22 , r 33 } = r 33 max \left\{ r_{11},r_{22},r_{33} \right\} =r_{33} max{r11,r22,r33}=r33
      在这里插入图片描述
  • C++实现代码
void R2quaternion(double R[3][3], double q[4]) {

	//四元数的顺序:qw、qx、qy、qz
	double tr_R, qw_4;

	tr_R = R[0][0] + R[1][1] + R[2][2];
	if (tr_R > -1 && fabs(tr_R + 1) > 1e-5) {

		q[0] = sqrt(tr_R + 1) / 2.0;
		qw_4 = 4 * q[0];
		q[1] = (R[2][1] - R[1][2]) / qw_4;
		q[2] = (R[0][2] - R[2][0]) / qw_4;
		q[3] = (R[1][0] - R[0][1]) / qw_4;
	}
	else {
		
		if (R[0][0] > R[1][1] && R[0][0] > R[2][2]) {
			double t = sqrt(1 + R[0][0] - R[1][1] - R[2][2]);
			q[0] = (R[2][1] - R[1][2]) / t;
			q[1] = t / 4.0;
			q[2] = (R[0][2] + R[2][0]) / t;
			q[3] = (R[0][1] + R[1][0]) / t;
		}
		else if (R[1][1] > R[0][0] && R[1][1] > R[2][2]) {
			double t = sqrt(1 - R[0][0] + R[1][1] - R[2][2]);
			q[0] = (R[0][2] - R[2][0]) / t;
			q[1] = (R[0][1] + R[1][0])  / t;
			q[2] = t / 4.0;
			q[3] = (R[2][1] + R[1][2]) / t;
		}
		else {
			double t = sqrt(1 - R[0][0] - R[1][1] + R[2][2]);
			q[0] = (R[1][0] - R[0][1]) / t;
			q[1] = (R[0][2] + R[2][0]) / t;
			q[2] = (R[1][2] - R[2][1]) / t;									
			q[3] = t / 4.0;
		}	
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值