slambook2 ch10代码编译

本文指导如何在Ubuntu 20.04环境下编译pose_graph_g2o项目,涉及CMakeLists.txt的C++标准调整、Eigen库路径设置,解决Sophus与fmt库兼容问题,以及pose_graph_g2o_lie_algebra.cpp的修复。最终演示了从头到尾的编译流程及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值