视觉SLAM十四讲 第四章代码问题

关于报错解决:

首先报错的是头文件里 “se3.hpp”找不到,这是因为给出的代码是非模板类型,而github 现在是新版的sophus,是基于模板类的,所以会出现报错。解决方法是把“se3.hpp”改成 “so3.h”和 “se3.h”,然后把sophus::sophus SO3d中所有的d去掉。

 

第二个会报错的是在cmakelists中,这次链接库没有采用 ${Sophus_LIBRARES},而是采用的  target_link_libraries(useSophus Sophus::Sophus) ,高博给出的说法是在17年以后,前者就不能用了,所以换成后者,但是换完并不好使。

参考:https://github.com/gaoxiang12/slambook2/commit/1ed521d1653da11a39182f7f1febafdd28ff3401

然后解决方法是还是使用原来的  target_link_libraries( useSophus ${Sophus_LIBRARIES} )

第三个会报错的就是 cmakelists中没有使用C++11标准,加上

add_compile_options(-std=c++11)

 关于Sophus::SE3::SE3()’未定义的引用,参考:https://blog.csdn.net/weixin_44401286/article/details/101386425

链接到sophus库就解决了。

在cmakelists中要想打印信息可以用message命令, 例如message("hello"),吧要打印的东西放在引号里面。参考:https://blog.csdn.net/xiewenhao12/article/details/78481036

 

关于代码部分:

 Vector3d so3 = SO3_R.log();

 李群和李代数映射只取对数就可以,不用再加李括号。

关于数据类型Isometry3d,他取.matrix()的时候是一个3*4的矩阵,但是他实际上是一个4*4的矩阵,高不清楚怎么回事。。。。但是在压到vector里之后用cout不能输出了,原因是cout只能呢输出vector里原始的那些数据类型,像int,而自定义的数据类型要用迭代器访问。

 for(vector<Isometry3d, Eigen::aligned_allocator<Isometry3d>>::iterator it=poses.begin();it!= poses.end();it++)
  {
      cout<<"pose= "<<(*it).matrix()<<endl;
}

如果STL容器中的元素是Eigen库数据结构,例如这里定义一个vector容器,元素是Matrix4d ,如下所示:

vector<Eigen::Matrix4d>
  • 1

这个错误也是和上述一样的提示,编译不会出错,只有在运行的时候出错。解决的方法很简单,定义改成下面的方式:

vector<Eigen::Matrix4d,Eigen::aligned_allocator<Eigen::Matrix4d>>;
  • 1

其实上述的这段代码才是标准的定义容器方法,只是我们一般情况下定义容器的元素都是C++中的类型,所以可以省略,这是因为在C++11标准中,aligned_allocator管理C++中的各种数据类型的内存方法是一样的,可以不需要着重写出来。但是在Eigen管理内存和C++11中的方法是不一样的,所以需要单独强调元素的内存分配和管理。

 参考:https://blog.csdn.net/renweiyi1487/article/details/104097576

 

关于读取文件的流控制还没看到,下次再写。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值