视觉slam14讲 Ubuntu18.04下 Sophus李代数库使用 以及报错处理

本文详细介绍了如何在视觉SLAM中使用Sophus库,包括非模板类的安装步骤、编译过程中遇到的问题及解决方案,如SO2类的修改、Eigen库路径设置、链接错误修复和版本兼容。还涉及新版slambook中关于SO3类的调整,确保正确链接Sophus及其模板类的区别应用。
摘要由CSDN通过智能技术生成

视觉slam14讲 第一版书里使用的 非模板类,没有看第二版书。slam14讲 第2版应该使用的模板类,在安装或使用sophus的时候注意不要回滚 a621ff版本,具体根据自己的情况调整。若使用的是模板类,需要注意查看eigen3 的版本。网上有人说eigen3.2 系列的有问题。可以参考:

http://sophus库安装踩坑

1. 安装

git clone https://github.com/strasdat/Sophus.git
cd Sophus/
git checkout a621ff

mkdir build
cd build
cmake ..
make

小注:sudo make install  可以安装也可以不安装,安装了,会将sophus安装到/usr/local/include 。

2. 编译问题1:

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

/Sophus/sophus/so2.cpp:33:26: error: lvalue required as left operand of assignment
unit_complex_.imag() = 0.;

将so2.cpp 中的

SO2::SO2()
{
  unit_complex_.real() = 1.;
  unit_complex_.imag() = 0.;
}

修改为:

SO2::SO2()
{
  unit_complex_.real(1.);
  unit_complex_.imag(0.);
}

3. 编译useSophus.cpp 报错:

slambook/ch4/useSophus/useSophus.cpp:5:10: fatal error: Eigen/Core: No such file or directory
 #include <Eigen/Core>
          ^~~~~~~~~~~~

如果已经安装,但当调用 eigen 库时,报错:fatal error: Eigen/Core: No such file or directory

这是因为 eigen 库安装在了 /usr/include/eigen3/Eigen 路径下或者/usr/local/eigen3/Eigen,需使用下面命令映射到 /usr/include 路径下

sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen
//或者 sudo ln -s /usr/local/include/eigen3/Eigen /usr/include/Eigen

4.   undefined reference to `Sophus::SO3::log() make 错误

useSophus.cpp:(.text.startup+0xc5): undefined reference to `Sophus::SO3::SO3(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)'
useSophus.cpp:(.text.startup+0xdd): undefined reference to `Sophus::SO3::SO3(double, double, double)'
useSophus.cpp:(.text.startup+0xf3): undefined reference to `Sophus::SO3::SO3(Eigen::Quaternion<double, 0> const&)'
useSophus.cpp:(.text.startup+0x198): undefined reference to `Sophus::SO3::log() const'
useSophus.cpp:(.text.startup+0x1ef): undefined reference to `Sophus::SO3::hat(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)'
useSophus.cpp:(.text.startup+0x231): undefined reference to `Sophus::SO3::hat(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)'
useSophus.cpp:(.text.startup+0x23c): undefined reference to `Sophus::SO3::vee(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&)'
useSophus.cpp:(.text.startup+0x27b): undefined reference to `Sophus::SO3::exp(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)'
useSophus.cpp:(.text.startup+0x29e): undefined reference to `Sophus::SO3::operator*(Sophus::SO3 const&) const'

安装Sophus时,有个lib文件“libSophus.so”会出现在/usr/local/lib/libSophus.so (本人编译时最后执行了 sudo make install, 因此在系统文件夹里面有该lib文件)。 当执行FIND_PACKAGE(sophus REQUIRED)时,libSophus.so 应该被链接到 Sophus_LIBRARIES, 但cmake却没链接上(原因未知),因此出现这个错误。

解决:

find_package( Sophus REQUIRED )
set(Sophus_LIBRARIES libSophus.so)
include_directories( ${Sophus_INCLUDE_DIRS} )

5. slambook2  应该是新版的代码,运行 make 的时候报错 SO3d is not member of  'sophus'

解决方法:

1)修改头文件

#将#include "sophus/se3.hpp"修改为下面两行

#include "sophus/so3.h"
#include "sophus/se3.h"

2)修改代码

将代码中出现的Sophus::SO3d  SOphus::SE3d 中的d都去掉

3)修改CMakelists.txt

#1. find_package 修改为:

find_package(Sophus REQUIRED)
set(Sophus_LIBRARIES libSophus.so)
include_directories( ${Sophus_INCLUDE_DIRS} )

#2.将 target_link_libraries(useSophus Sophus::Sophus)  改为:

target_link_libraries( useSophus ${Sophus_LIBRARIES} )

#3. 将example子目录源码注释掉
#add_subdirectory(example)


小注:example 中的例子应用的应该是模板的sophus。我们应用的sophus应用的是非模板的,所以先注释掉。

6. 执行结果:

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ppipp1109

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

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

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

打赏作者

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

抵扣说明:

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

余额充值