matlab和eigen在旋转向量,欧拉角,四元数,旋转矩阵转换的对比(二 四元数转其他)

1. 参考:

eigen安装:clion使用Eigen_gxt_kt的博客-CSDN博客_clion eigen

matlab 角度转四元数_四元数的两种写法与转换_女王丁丁的博客-CSDN博客

2. 测试

四元数转其他格式
eigenmatlab
四元数转欧拉角
Eigen::Quaterniond quaternion4(0.92388, 0, 0, 0.382683);
Eigen::Vector3d eulerAngle4 = quaternion4.matrix().eulerAngles(2,1,0);
cout << "yaw(z) pitch(y) roll(x) = " << eulerAngle4.transpose() << endl;

quaternion4 = [0.92388, 0, 0, 0.382683];

[pitch, roll, yaw] = quat2angle(quaternion4);
eulerAngle4 = [pitch, roll, yaw]*180/pi;
disp("欧拉角 =")
disp(eulerAngle4);

测试yaw(z) pitch(y) roll(x) = 0.785397       -0        0欧拉角 =
    0.7854         0         0
四元数转旋转向量
//4.0 初始化四元素,注意eigen Quaterniond类四元数初始化参数顺序为w,x,y,z
Eigen::Quaterniond quaternion4(0.92388, 0, 0, 0.382683);

//4.1 四元数转换为旋转向量
Eigen::AngleAxisd rotation_vector4(quaternion4);
//或者
Eigen::AngleAxisd rotation_vector4_1;
rotation_vector4_1 = quaternion4;
cout << "rotation_vector4 " << "angle is: " << rotation_vector4.angle() * (180 / M_PI)
<< " axis is: " << rotation_vector4.axis().transpose() << endl;

cout << "rotation_vector4_1 " << "angle is: " << rotation_vector4_1.angle() * (180 / M_PI)
<< " axis is: " << rotation_vector4_1.axis().transpose() << endl;

quaternion4 = [0.92388, 0, 0, 0.382683];

rotation_matrix4 = quat2dcm(quaternion4);
rotation_vector4_1 = rotationMatrixToVector(rotation_matrix4);
disp("旋转向量 =")
disp(rotation_vector4_1 *180/pi)

测试rotation_vector4 angle is: 44.9999 axis is: 0 0 1
rotation_vector4_1 angle is: 44.9999 axis is: 0 0 1
旋转向量 =
         0         0   44.9999

四元数转旋转矩阵

Eigen::Quaterniond quaternion4(0.92388, 0, 0, 0.382683);
Eigen::Matrix3d rotation_matrix4;
rotation_matrix4 = quaternion4.matrix();
Eigen::Matrix3d rotation_matrix4_1;
rotation_matrix4_1 = quaternion4.toRotationMatrix();
cout << "rotation matrix4 =\n" << rotation_matrix4 << endl;
cout << "rotation matrix4_1 =\n" << rotation_matrix4_1 << endl;

quaternion4 = [0.92388, 0, 0, 0.382683];

rotation_matrix4 = quat2dcm(quaternion4);
disp("旋转矩阵 =")
disp(rotation_matrix4);

测试rotation matrix4 =
 0.707107 -0.707106         0
 0.707106  0.707107         0
        0         0         1
旋转矩阵 =
    0.7071    0.7071         0
   -0.7071    0.7071         0
         0         0    1.0000

说明:

引用自“matlab 角度转四元数_四元数的两种写法与转换_女王丁丁的博客-CSDN博客”

这里还要注意的是,matlab和C语言eigen库将同一个四元数转换为旋转矩阵时,获得的两个旋转矩阵互为逆矩阵!abb获得的转换则和eigen获得的转换相同(这是由于一个旋转矩阵有两种含义,即坐标系A在B中的表示和A到B的变换,二者互为逆。)

经过测试,在optitrack中,刚体坐标为(x,y,z,qx,qy,qz,qw),表示刚体在基坐标系中的位置为xyz,经过MATLAB的转换获得的旋转矩阵R为刚体坐标系在基坐标系中表达的逆。在matlab内部进行变换是没有问题的,但是matlab中四元数导入其他软件时,需要求逆才能表达同样的旋转矩阵。

我一般采用坐标系A在坐标系B中表示的方式来理解矩阵变换,因此得出以下结论:

若原点重合的A坐标系在B坐标系中的表示为

 ,则在matlab和abb中其对应四元数为dcm2quat(R),在C语言中对应的四元数为dcm2quat(R.transpose() )
以此为基础,根据转换前后的意义,决定是否要对矩阵进行转置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robot_future

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值