在Eigen中用欧拉角表示旋转时,单次旋转多个角度和多次旋转单个角度的结果是不同的。具体试验如下:
在VS2017中用Eigen分别初始化两个欧拉角旋转:
第一个:欧拉角旋转为(M_PI / 2, 0, M_PI / 4)
Eigen::Vector3d rotation_eulerAngle1(M_PI / 2, 0, M_PI / 4); // 欧拉角 ZYX
Eigen::AngleAxisd rollAngle1(Eigen::AngleAxisd(rotation_eulerAngle1(2), Eigen::Vector3d::UnitX())); // X
Eigen::AngleAxisd pitchAngle1(Eigen::AngleAxisd(rotation_eulerAngle1(1), Eigen::Vector3d::UnitY())); // Y
Eigen::AngleAxisd yawAngle1(Eigen::AngleAxisd(rotation_eulerAngle1(0), Eigen::Vector3d::UnitZ())); // Z
第二个:欧拉角旋转为(M_PI / 2, 0, 0)和(0, 0, M_PI / 4)相乘,相乘结果用旋转向量表示(这里无所谓,因为后面我要用到旋转向量)
Eigen::Vector3d rotation_eulerAngle1(M_PI / 2, 0, M_PI / 4); // 欧拉角 ZYX
Eigen::AngleAxisd rollAngle1(Eigen::AngleAxisd(rotation_eulerAngle1(2), Eigen::Vector3d::UnitX())); // X
Eigen::AngleAxisd pitchAngle1(Eigen::AngleAxisd(rotation_eulerAngle1(1), Eigen::Vector3d::UnitY())); // Y
Eigen::AngleAxisd yawAngle1(Eigen::AngleAxisd(rotation_eulerAngle1(0), Eigen::Vector3d::UnitZ())); // Z
Eigen::Vector3d rotation_eulerAngle2(0, 0, 0); // 欧拉角 ZYX
Eigen::AngleAxisd rollAngle2(Eigen::AngleAxisd(rotation_eulerAngle2(2), Eigen::Vector3d::UnitX())); // X
Eigen::AngleAxisd pitchAngle2(Eigen::AngleAxisd(rotation_eulerAngle2(1), Eigen::Vector3d::UnitY())); // Y
Eigen::AngleAxisd yawAngle2(Eigen::AngleAxisd(rotation_eulerAngle2(0), Eigen::Vector3d::UnitZ())); // Z
Eigen::Matrix3d rotation_mat1;
rotation_mat1 = rollAngle1 * pitchAngle1 * yawAngle1;
Eigen::Matrix3d rotation_mat2;
rotation_mat2 = rollAngle2 * pitchAngle2 * yawAngle2;
Eigen::AngleAxisd vec; // 旋转向量
vec = rotation_mat1 * rotation_mat2;
旋转结果使用opencv的aruco.hpp模块,首先将相机坐标系沿z轴平移1m,再分别经过上面两个旋转后使用cv::aruco::drawAxis()函数显示在图像中。
aruco模块的相机坐标系如图所示:
在上述两种欧拉角下,相机坐标系的变换结果分别如下(其中红色是x轴,绿色是y轴,蓝色是z轴):
分析结果可以看出,
当欧拉角为(M_PI / 2, 0, M_PI / 4)时,旋转轴分别为相机坐标系的轴;
而当欧拉角为(M_PI / 2, 0, 0)和(0, 0, M_PI / 4)时,旋转轴分别是每次旋转之后的坐标系对应的轴。
千羽QY 发布了17 篇原创文章 · 获赞 11 · 访问量 3721 私信 关注