1. 参考:

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

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

机械臂 tcp 坐标 转旋转矩阵 (旋转向量转旋转矩阵)_侃侃_天下的博客-CSDN博客_机械臂旋转矩阵

2. 测试:

引用自“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() )
以此为基础,根据转换前后的意义,决定是否要对矩阵进行转置

旋转矩阵转其他格式
eigenmatlab
旋转矩阵转欧拉角
Eigen::Matrix3d rotation_matrix2;
rotation_matrix2 << 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, 0, 0, 1;

//或直接单位矩阵初始化
Eigen::Matrix3d rotation_matrix2_1 = Eigen::Matrix3d::Identity();

//2.1 旋转矩阵转换为欧拉角
//ZYX顺序,即先绕x轴roll,再绕y轴pitch,最后绕z轴yaw,0表示X轴,1表示Y轴,2表示Z轴
Eigen::Vector3d euler_angles = rotation_matrix2.eulerAngles(2, 1, 0);
cout << "yaw(z) pitch(y) roll(x) = " << euler_angles.transpose() << endl;

rotation_matrix2 = [0.707107, -0.707107, 0; 0.707107, 0.707107, 0; 0, 0, 1];

euler_angels = rotm2eul(rotation_matrix2);
disp("yaw(z) pitch(y) roll(x) =")
disp(euler_angels);

测试yaw(z) pitch(y) roll(x) = 0.785398       -0        0yaw(z) pitch(y) roll(x) =
    0.7854         0         0
旋转矩阵转旋转向量
Eigen::AngleAxisd rotation_vector2;
rotation_vector2.fromRotationMatrix(rotation_matrix2);
//或者
Eigen::AngleAxisd rotation_vector2_1(rotation_matrix2);
cout << "rotation_vector2 " << "angle is: " << rotation_vector2.angle() * (180 / M_PI)
<< " axis is: " << rotation_vector2.axis().transpose() << endl;

cout << "rotation_vector2_1 " << "angle is: " << rotation_vector2_1.angle() * (180 / M_PI)
<< " axis is: " << rotation_vector2_1.axis().transpose() << endl;
rotation_vector2_1 = rotationMatrixToVector(rotation_matrix2);
disp("rotation_vector2_1 =")
disp(rotation_vector2_1 *180/pi)
测试rotation_vector2 angle is: 45 axis is: 0 0 1
rotation_vector2_1 angle is: 45 axis is: 0 0 1
rotation_vector2_1 =
         0         0  -45.0000
旋转矩阵转四元数
Eigen::Quaterniond quaternion2(rotation_matrix2);
//或者
Eigen::Quaterniond quaternion2_1;
quaternion2_1 = rotation_matrix2;
cout << "quaternion2 x: " << quaternion2.x() << endl;
cout << "quaternion2 y: " << quaternion2.y() << endl;
cout << "quaternion2 z: " << quaternion2.z() << endl;
cout << "quaternion2 w: " << quaternion2.w() << endl;

cout << "quaternion2_1 x: " << quaternion2_1.x() << endl;
cout << "quaternion2_1 y: " << quaternion2_1.y() << endl;
cout << "quaternion2_1 z: " << quaternion2_1.z() << endl;
cout << "quaternion2_1 w: " << quaternion2_1.w() << endl;
quaternion2=dcm2quat(rotation_matrix2);
disp("quaternion2 =")
disp(quaternion2);
测试quaternion2 x: 0
quaternion2 y: 0
quaternion2 z: 0.382684
quaternion2 w: 0.92388

quaternion2 =
    0.9239         0         0   -0.3827

备注:

a quaternion vector of the form q = [ wxyz], with w as the scalar number.

更多推荐