slambook2 ch10代码编译
环境:ubuntu20.04
1.修改 CMakeLists.txt 文件,
(1)将 c++11 修改为 c++14
这一步主要看你的系统支持哪个 c++ 标准,我的是 ubuntu20.04,所以修改为 c++14。
(2)修改 eigen 库的路径
这一步需要查看自己的 eigen 库在什么位置,默认是在/usr/include/eigen3
下边。如果你的 eigen 库和我一样,是自己下载后通过cmake .. make sudo make install
的方式安装的,那相应的路径应该是:/usr/local/include/eigen3
这里需要修改 eigen 库路径和自己的 eigen 库安装位置相一致。
(3)将所有target_link_libraries 中后边加一个 fmt
fmt 和 sophus 不匹配的问题,参看链接。
cmake_minimum_required(VERSION 2.8)
project(pose_graph)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++14 -O2")
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
# Eigen
include_directories("/usr/local/include/eigen3")
# sophus
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
# g2o
find_package(G2O REQUIRED)
include_directories(${G2O_INCLUDE_DIRS})
add_executable(pose_graph_g2o_SE3 pose_graph_g2o_SE3.cpp)
target_link_libraries(pose_graph_g2o_SE3
g2o_core g2o_stuff g2o_types_slam3d ${CHOLMOD_LIBRARIES} fmt
)
add_executable(pose_graph_g2o_lie pose_graph_g2o_lie_algebra.cpp)
target_link_libraries(pose_graph_g2o_lie
g2o_core g2o_stuff
${CHOLMOD_LIBRARIES}
${Sophus_LIBRARIES}
fmt
)
2.修改 pose_graph_g2o_lie_algebra.cpp 文件
这里需要对原文件做一个简单的修改,否则直接 cmake.. make
编译的话会抛警告
warning: no return statement in function returning non-void [-Wreturn-type]
然后运行代码的时候也会出现如下错误:
Sophus ensure failed in function 'void Sophus::SO3Base<Derived>::normalize() [with Derived = Sophus::SO3<double>]', file '/usr/local/include/sophus/so3.hpp', line 303.
Quaternion ( 0.706662 4.32706e-17 0.707551 -4.3325e-17) should not be close to zero!
已放弃 (核心已转储)
因此,需要修改 pose_graph_g2o_lie_algebra.cpp 文件54行的部分,添加 return true语句
class VertexSE3LieAlgebra : public g2o::BaseVertex<6, SE3d> {
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
virtual bool read(istream &is) override {
double data[7];
for (int i = 0; i < 7; i++)
is >> data[i];
setEstimate(SE3d(
Quaterniond(data[6], data[3], data[4], data[5]),
Vector3d(data[0], data[1], data[2])
));
return true;
}
然后重新编译运行
[ 25%] Building CXX object CMakeFiles/pose_graph_g2o_lie.dir/pose_graph_g2o_lie_algebra.cpp.o
[ 50%] Linking CXX executable pose_graph_g2o_lie
[ 50%] Built target pose_graph_g2o_lie
[100%] Built target pose_graph_g2o_SE3
将文件 sphere.g2o 放到 build 目录下, 执行:
./pose_graph_g2o_lie sphere.g2o
即可得到结果:
read total 2500 vertices, 9799 edges.
optimizing ...
iteration= 0 chi2= 674837160.579968 time= 0.270225 cumTime= 0.270225 edges= 9799 schur= 0 lambda= 6658.554263 levenbergIter= 1
iteration= 1 chi2= 234706314.970484 time= 0.248334 cumTime= 0.51856 edges= 9799 schur= 0 lambda= 2219.518088 levenbergIter= 1
iteration= 2 chi2= 142146174.348537 time= 0.249542 cumTime= 0.768101 edges= 9799 schur= 0 lambda= 739.839363 levenbergIter= 1
iteration= 3 chi2= 83834595.145595 time= 0.249445 cumTime= 1.01755 edges= 9799 schur= 0 lambda= 246.613121 levenbergIter= 1
iteration= 4 chi2= 41878079.903257 time= 0.250861 cumTime= 1.26841
...