Sophus初始化SE3d,旋转矩阵不正交

最近使用Sophus库中的SE3d类,初始化报错,报错说R is not orthogonal,传入的旋转矩阵不正交。报错的代码如下:


void AbsoluteTrajectoryError(
        const std::vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> & gt_trajectery,
        const std::vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> & esti_trajectery,
        double & error_value
)
{
    error_value = 0;
    if(gt_trajectery.size()!=esti_trajectery.size()){
        error_value=-1;
        return;
    }

    Eigen::Matrix3d rotation = gt_trajectery[0].rotation();

    std::cout<< rotation*rotation.transpose()<<std::endl;
    std::cout<< gt_trajectery[0].rotation()<<std::endl;

    std::cout<<"to be "<<std::endl;
    std::cout<<gt_trajectery[0].rotation()<<std::endl;
    for(int i=0;i<gt_trajectery.size();i++){
        Sophus::SE3d gt_i(gt_trajectery[i].rotation(), gt_trajectery[i].translation());
        Sophus::SE3d esti_i(esti_trajectery[i].rotation(), esti_trajectery[i].translation());
    }

    return;
}

这段代码中,旋转矩阵相乘后的输出是一个精度不高的单位矩阵(就是对角线元素是1,然后其他元素是极小量
在这里插入图片描述
点进去看是Sophus中有一个isOrthogoal的检查,没有通过Sophus的精度检查。解决方法是先将旋转矩阵转变成四元数,然后归一化,再转成旋转矩阵,这样旋转矩阵能够通过正交检查,虽然有点多此一举…但是挺有用的。SLAM过程中的数值精度也非常重要,毕竟矩阵连乘,一点点数值误差会造成大量偏移。
代码如下:

Eigen::Quaterniond rotation(gt_trajectery[0].rotation());
rotation.normalize();
Sophus::SE3d gt_i(rotation.toRotationMatrix(), gt_trajectery[i].translation());
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝域小兵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值