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