四元数左乘和右乘

double yaw = 0.6 * M_PI, pitch = 0.25 * M_PI, roll = 0.3 * M_PI;
	Eigen::Matrix3d R;
	R = Eigen::AngleAxisd(yaw, ::Eigen::Vector3d::UnitZ()) *
	    Eigen::AngleAxisd(pitch, ::Eigen::Vector3d::UnitY()) *
	    Eigen::AngleAxisd(roll, ::Eigen::Vector3d::UnitX());
	Eigen::Quaterniond q;
	q = R;

	double yaw_1 = 0.2 * M_PI, pitch_1 = 0.2 * M_PI, roll_1 = 0.45 * M_PI;
	Eigen::Vector3d eulerAngle_1(yaw_1, pitch_1, roll_1);
	Eigen::AngleAxisd rollAngle_1(Eigen::AngleAxisd(eulerAngle_1(2),Eigen::Vector3d::UnitX()));
	Eigen::AngleAxisd pitchAngle_1(Eigen::AngleAxisd(eulerAngle_1(1),Eigen::Vector3d::UnitY()));
	Eigen::AngleAxisd yawAngle_1(Eigen::AngleAxisd(eulerAngle_1(0),Eigen::Vector3d::UnitZ()));
	Eigen::Quaterniond quaternion_1;
	quaternion_1 = yawAngle_1 * pitchAngle_1 * rollAngle_1;

	Eigen::Quaterniond test_1 = q * quaternion_1;
	Eigen::Vector3d test_eulerAngle = test_1.matrix().eulerAngles(2,1,0);
	std::cout << test_eulerAngle[0] << " " << test_eulerAngle[1] << " " << test_eulerAngle[2] << std::endl;

	Eigen::Matrix4d q_l;
	//左乘矩阵
	q_l << q.w(), -q.z(), q.y(), q.x(),
	       q.z(), q.w(), -q.x(), q.y(),
	       -q.y(), q.x(), q.w(), q.z(),
	       -q.x(), -q.y(), -q.z(), q.w();
	Eigen::Vector4d q_1_vector(quaternion_1.x(), quaternion_1.y(), quaternion_1.z(), quaternion_1.w());
	Eigen::Vector4d test_2 = q_l * q_1_vector;
	Eigen::Quaterniond test_2_q(test_2[3], test_2[0], test_2[1], test_2[2]);
	Eigen::Vector3d test_2_eulerAngle = test_2_q.matrix().eulerAngles(2,1,0);
	std::cout << test_2_eulerAngle[0] << " " << test_2_eulerAngle[1] << " " << test_2_eulerAngle[2] << std::endl;

	Eigen::Matrix4d q_r;
	//右乘矩阵
	q_r << quaternion_1.w(), quaternion_1.z(), -quaternion_1.y(), quaternion_1.x(),
		     -quaternion_1.z(), quaternion_1.w(), quaternion_1.x(), quaternion_1.y(),
		     quaternion_1.y(), -quaternion_1.x(), quaternion_1.w(), quaternion_1.z(),
		     -quaternion_1.x(), -quaternion_1.y(), -quaternion_1.z(), quaternion_1.w();
	Eigen::Vector4d q_0_vector(q.x(), q.y(), q.z(), q.w());
	Eigen::Vector4d test_3 = q_r * q_0_vector;
	Eigen::Quaterniond test_3_q(test_2[3], test_2[0], test_2[1], test_2[2]);
	Eigen::Vector3d test_3_eulerAngle = test_3_q.matrix().eulerAngles(2,1,0);
	std::cout << test_3_eulerAngle[0] << " " << test_3_eulerAngle[1] << " " << test_3_eulerAngle[2] << std::endl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值