位姿矩阵和四元数在OpenCV、Eigen和Sophus下的表示与转换

8 篇文章 0 订阅
4 篇文章 0 订阅
  1. OpenCV的矩阵和四元数
    opencv的四元数使用需要添加头文件<opencv2/core/quaternion.hpp>,好像4.5.1之后才有四元数
	// 随机生成一个位姿矩阵
	// 随机生成一个旋转矩阵(单位正交矩阵)
    std::random_device rd;
    std::mt19937 gen(rd());
    std::normal_distribution<> gauss_dis{0,1};
    // 先随机生成一个轴,并单位化
    std::vector<double> vec_rand = {gauss_dis(gen), gauss_dis(gen), gauss_dis(gen)};
    cv::Mat vec_a(vec_rand);
    cv::normalize(vec_a, vec_a);
    cv::transpose(vec_a, vec_a);

    // 再生成一个垂直于它的轴, 直接绕z轴90度旋转得到一个新向量
    double pi = std::acos(-1.0);
    vec_rand = {
            vec_a.at<double>(0,0)*std::cos(pi/2)-vec_a.at<double>(1,0)*std::sin(pi/2),
            vec_a.at<double>(0,0)*std::sin(pi/2)+vec_a.at<double>(1, 0)*std::cos(pi/2),
            vec_a.at<double>(2,0)
    };
    cv::Mat vec_b(vec_rand);
    cv::normalize(vec_b, vec_b);
    cv::transpose(vec_b, vec_b);

    // 再用vec_a和vec_b的叉积得到一个新向量
    cv::Mat vec_c = vec_a.cross(vec_b);
    cv::normalize(vec_c,vec_c);
    cv::transpose(vec_c, vec_c);

    // 将vec a,b,c组装成旋转矩阵
    cv::Mat r;
    cv::hconcat(vec_a,vec_b,r);
    cv::hconcat(r,vec_c,r);
    
    // 生成一个随机平移向量
    vec_rand = {gauss_dis(gen), gauss_dis(gen), gauss_dis(gen)};
    cv::Mat vec_t(vec_rand);

    // 组装一个位姿
    cv::Matx44d pose;
    cv::hconcat(r, vec_t, pose);
    cv::vconcat(pose, cv::Mat::zeros(1,4, CV_64FC1), pose);

    cv::Quatd pose_quatd(r);        // 从旋转矩阵创建四元数
    pose_quatd.createFromAngle

	// 四元数有多种创建方式
	pose_quatd.createFromAngleAxis();
    pose_quatd.createFromEulerAngles();
    pose_quatd.createFromRotMat();
    pose_quatd.createFromRvec();
    pose_quatd.createFromXRot();
    pose_quatd.createFromYRot();
    pose_quatd.createFromZRot();j
  1. 从OpenCV的矩阵和四元数转换到Eigen的矩阵和四元数,Eigen下的四元数和矩阵的相互转换,以及Eigen中的矩阵和Sophus中李群和李代数的相应转换。
    可以用函数cv::eigen2cv和cv::cv2eigen进行从OpenCV的Mat与Eigen的Matrix之间的转换,这个转换需要包含头文件<opencv2/core/eigen.hpp>,
// 将
    // 提取一个旋转矩阵
    Eigen::Matrix3d r_eigen = pose_eigen.block(0,0,3,3);
    Eigen::Quaterniond quat_eigen(r_eigen);     // 从旋转矩阵创建四元数
    r_eigen = quat_eigen.toRotationMatrix();
    Eigen::Vector4d quat_coeffs = quat_eigen.coeffs();  // 获取四元数的四个系数,xyzw


    // 从Eigen转换到Sophus
    // 要包含<sophus/se3.hpp>头文件
    Sophus::SO3d SO3_R(r_eigen);    // 从旋转矩阵到李群
    Sophus::SO3d SO3_q(quat_eigen); // 从四元数到李群 
    SO3_q.setQuaternion(quat_eigen);
    
    Sophus::Vector3d so3 = SO3_R.log(); // 从李群获得相应的李代数
    Sophus::Matrix3d skew_sys_matrix = Sophus::SO3d::hat(so3);  // 获得李代数的反对称矩阵形式
    so3 = Sophus::SO3d::vee(skew_sys_matrix);       // 将李代数从反对称矩阵变成向量形式


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝域小兵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值