Sophus库模板类的使用安装问题报错问题

Sophus库模板类的使用安装问题报错问题

最近在看高翔博士的《SLAM十四讲》,在第四章中要求安装一个Sophus的库,在书中要求安装非模板类的Sophus库,也就是要回滚到a621ff版本,但是本人在安装过程中,使用Cmake …的时候能够顺利通过,接着执行make命令的时候就会卡在5%,报的第一个错是:

1 Sophus/sophus/so2.cpp:32:26: error: lvalue required as left operand of assignment
2 unit_complex_.real() = 1.;

这样造成的结果可能是因为版本问题

解决办法

重新下载一下这个Sophus这个库
sudo apt-get git clone http://github.com/strasdat/Sophus.git
也可以直接在Ubuntu中的浏览器输入上面的网站直接下载,然后保存在你要的目录下面

git checkout xxx 版本(可以编译也可以不编译,本人试过都能实现)
安装之后可以在/usr/local/include下找到它的头文件,然后进入Sophus目录执行下面操作

  • **在cmake编译
    mkdir build
    cd build
    cmake …
    make

使用模板的注意事项

1.不知道是我个人的配置原因还是通病,我在编译CMakeLists.txt的时候,总是提示我找不到Sophus的库目录

include_directories( ${Sophus_INCLUDE_DIRS} )

就是上面这句话不到库目录=_=,于是我就把这句话给注释了,换成直接提供头文件地址:

#include_directories( ${Sophus_INCLUDE_DIRS} )
include_directories( “/usr/local/include/sophus” )

2.在非模板类中,库是利用.c加.h的方式实现的,而在模板类库中是集合在一个.hpp中实现的,因此需要把包含文件改成以下形式:

#include “sophus/so3.hpp”
#include “sophus/se3.hpp”

3.模板类之所以叫模板类是因为其在申明一个新的实例时,需要指定数据类型,因此,我们只需要在每一个李代数定义的地方,将

Sophus::SO3 SO3_v

换成:

Sophus::SO3 SO3_v

就行了。当然,如果你觉得这么写太长太麻烦的话(=。=),你可以定义一个新的数据类型指向非模板类,例如:

using SO3Type = Sophus::SO3;
using SE3Type = Sophus::SE3;

SO3Type SO3_v;

4.改完模板类之后大体上就不影响使用了,还有要注意的就是这个版本库的新特性。例如这个版本不再支持对李代数的直接输出:

cout<<“SO(3) from quaternion :”<

看了一下源代码,这个版本的李代数是利用四元数为基本储存格式的,你要是想要和高博书中一样直接输出旋转向量,需要加个log()变化:

cout<<“SO(3) from quaternion :”<

这里加transpose()是转置的意思,把列向量转成行向量,纯粹是为了好看。。。

同理,SE3也可以以log()的方法输出。。

需要注意的是,SE3用log()后输出的是李代数,对应的矩阵(采用hat()函数)是生成矩阵,而不是变换矩阵,这也就是为什么大家看到的平移部分的分量是(0.785 -0.785 0)而不是(1 0 0)的原因。

对于模板类的使用本人仍將继续摸索,如果大家有更好的建议或不懂的地方,欢迎大家指出。。

你可能感兴趣的:(SLAM)