1. 参考:
eigen安装:clion使用Eigen_gxt_kt的博客-CSDN博客_clion eigen
matlab 角度转四元数_四元数的两种写法与转换_女王丁丁的博客-CSDN博客
2. 测试
eigen | matlab | |
四元数转欧拉角 | 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); |
测试 | 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 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); |
测试 | 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() )
以此为基础,根据转换前后的意义,决定是否要对矩阵进行转置。