关于报错解决:
首先报错的是头文件里 “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
关于读取文件的流控制还没看到,下次再写。