Sophus库模板类的使用问题_SLAM十四讲

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

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

试了一下SLAM书中提供的第三方包里的sophus,编译的时候报同样的错,然而对最新版的Sophus库就能完美的编译通过。找了好久没找到错误的原因,可能是我的系统是ubuntu 17.10,而高博的书中推荐的14.04版。于是就想直接使用最新版本的Sophus库来代替非模板类的库。

ps:此时最新版本的Sophus库是00f3f,2018年2月11日修改版。

使用模板类的注意事项:

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<double> SO3_v

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

 using SO3Type = Sophus::SO3<double>;
 using SE3Type = Sophus::SE3<double>;

 SO3Type SO3_v;
4.改完模板类之后大体上就不影响使用了,还有要注意的就是这个版本库的新特性。例如这个版本不再支持对李代数的直接输出:
cout<<"SO(3) from quaternion :"<<SO3_q<<endl;

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

cout<<"SO(3) from quaternion :"<<SO3_q.log().transpose()<<endl;
这里加transpose()是转置的意思,把列向量转成行向量,纯粹是为了好看。。。

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


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


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


  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值