Skip to content Skip to footer

20.04/cartographer源码保姆级教程(全是坑已经踩完,太折磨了)

其他内容汇总请看:

SLAM常用的2D、3D算法复现以及仿真汇总_多机器人slam复现-CSDN博客

之前完成了用安装包的方式进行复现cartographer,考虑到学习源码的问题,现在进行cartographer的源码安装方法,报错均按数字在后面列出原因和解决办法

目录

1.安装依赖

2.安装protobuf3

3.创建工作空间,下载cartographer

4.安装Ceres-solver

5.编译cartographer

6.编译安装

7.测试

1.安装依赖(报错0)sphinx需要替换成提示的包

特别注意自带protobuf的请不要安装下面倒数第二个!!!!(2025.4.1更新:我后续测试发现容易出现版本问题,且不易解决,ubuntu20.04用自带的protobuf即可,不用再安装,其他版本可先去查询是否有再安装该包)

sudo apt-get install -y \

cmake \

g++ \

git \

google-mock \

libboost-all-dev \

libcairo2-dev \

libeigen3-dev \

libgflags-dev \

libgoogle-glog-dev \

liblua5.2-dev \

libsuitesparse-dev \

libwebp-dev \

ninja-build \

protobuf-compiler \

python-sphinx

2.安装protobuf3

2.1卸载ros自带的protobuf2

sudo apt-get remove libprotobuf-dev

which protoc

###显示protoc的路径如果没有显示则下面这条命令省略

rm /usr/local/bin/protoc

###以which protoc显示的路径为准,默认一般为usr/bin/protoc

完成卸载

2.2安装 protobuf3

1.安装依赖库

sudo apt-get inst

all autoconf automake libtool curl make g++ unzip

2.git submodule update --init --recursive

###这一步克隆子模块必须有,否则后面会报错(报找不到文件的错)

git clone -b v3.6.0 https://github.com/protocolbuffers/protobuf.git

###克隆版本为3.6.0的protobuf

cd protobuf

git submodule update --init --recursive

###克隆protobuf的子模块,主要是gtest

3.编译并安装protobuf

cd protobuf

###运行脚本

./autogen.sh

./configure

make

###如果没有前面的克隆子模块,make check会失败但是可以继续make install,后续使用可能出现问题

make check

sudo make install

sudo ldconfig

4.检查protobuf相关信息

###输出protobuf版本信息则表示安装成功

protoc --version

###查看安装位置

which protoc

###默认下载位置为 /usr/local/bin/protoc

###carto的搜索protoc的路径为/ usr/bin/protoc,选择直接copy过去

sudo cp /usr/local/bin/protoc /usr/bin

3.创建工作空间,下载cartographer源码

mkdir carto_ws

cd carto_ws

mkdir src

catkin_init_workspace

cd src

git clone https://github.com/googlecartographer/cartographer_ros.git

git clone https://github.com/googlecartographer/cartographer.git

git clone https://github.com/ceres-solver/ceres-solver.git

4.安装Ceres-solver(报错1,2)

###接上面3内容

###出现问题比较大,建议直接看报错2的方法

cd ceres-solver

mkdir ceres-bin

cd ceres-bin

cmake ..

###########cmake ..报错1

#线程报错可以减少线程数,报错2

make -j6

####可以跳过make test 直接下一步

make test

sudo make install

5.编译cartographer(报错3,4,5,6)

cd carto_ws

###rosdep update ###报错3

rosdep update

###注意修改为自己ros版本对应的......报错4

rosdep install --from-paths src --ignore-src --rosdistro=noetic -y

cd src/cartographer/

mkdir build

cd build

cmake .. ###报错5

####报错6,报错7

make -j6

###可能会报错,可以跳过make test

make test

sudo make install

6.编译安装报错7

cd carto_ws

catkin_make_isolated --install --use-ninja

###我采用的catkin_make_isolated,但是在进度到100%报错,可采用下面的catkin_make_isolated --install --use-ninja

###注意编译了再编译会报错,如果编译了报错再运行下面的,删除camkecache.txt

rm -f `find -name CMakeCache.txt`

1和2选一个,我用的1

1. catkin_make_isolated###需要很长时间(下次编译会很快完成)

###报错7

2. catkin_make_isolated --install --use-ninja###需要很长时间(下次编译会很快完成)

source install_isolated/setup.bash

7.测试

7.1测试数据bag下载

1.下载官方数据集进行测试,对我也是网络问题下载不了,因此我在别人云盘上下载的,我给出链接

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/b2-2016-04-05-14-44-52.bag

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/b2-2016-04-27-12-31-41.bag

2. 数据集下载的云盘链接:

Cartographer 数据集国内地址_cartographer数据集下载-CSDN博客

cd carto_ws

source ./devel_isolated/setup.bash

#####bag_filename:=(bag所在文件位置+bag包名)

roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=/home/ply1/bagfiles/cartographer_paper_deutsches_museum.bag

7.2测试结果

报错汇总:

报错0 这里报错找不到 python-sphinx,

解决办法:按他的要求sudoapt-get install新的两个sphinx-doc 和 sphinx-common

报错1显示没有找到carto_ws/src/ceres-solver/third_party/abseil-cpp库,打开一看果然没有

解决办法:安装abseil-cpp,先cd你报错的地方,我这里是carto_ws/src/ceres-solver/third_party/文件夹下,然后:

#####cd到third_party文件下

git clone https://github.com/abseil/abseil-cpp.git

cd abseil-cpp

mkdir build

cd build

###cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_CXX_FLAGS=-fPIC

cmake ..

make -j4 ###多线程

sudo make install

报错2

解决办法:重新安装别的版本

wget ceres-solver.org/ceres-solver-1.13.0.tar.gz

解压压缩包

cd ceres-solver-1.13.0

mkdir build

cd build

cmake ..

make

make test #有必要测试一下是否有问题

sudo make install

make test有结果则没问题继续返回全面进行操作如下:

报错3,运行rosdep update,报错:

解决方法(这里两种,我是第二种解决的,可以先试试)

1.更改google域名服务器

sudo gedit /etc/resolv.conf

将原有的nameserver这一行注释,并添加以下两行:

nameserver 8.8.8.8 #google域名服务器

nameserver 8.8.4.4 #google域名服务器

保存退出,执行

sudo apt-get update

再执行

rosdep update

重新执行,需要等待一点时间

rosdep update

2.若上述方法不行,看此链接方法,我是成功了

ROS rosdep update更新失败(简单解决)_ros学习——rosdep update出现的错误unable to process source-CSDN博客

报错4

解决办法:

1.注释carto_ws/src/cartographer下的package.xml文件

2.并且在src/cartographer/scripts文件目录下打开终端运行

./install_abseil.sh

1.注释package.xml如下图所示:

2.运行install_abseil.sh文件

报错:报错原因缺少libabsl库相关文件,重新安装libabsl库还是使用脚本安装,在cato_ws/src/cartographer/scripts/install_abseil.sh里面会有脚本install_abseil.sh,结果如图:

报错5,找不到libabsl.flags.a文件

解决办法:cmake找到的是你本机的libabsl,不是你新安装的,删除libabsl的build,重新编译(总感觉在libabil重复弄,有大佬知道的可以指点一下,我目前是这样操作的)

采用脚本安装install_abseil.sh

1.cd到/carto_ws/src/cartographer/scripts/abseil-cpp

打开终端运行./install_abseil.sh

进入本目录下的libabil-cpp文件下的build

mkdir build

cd build

cmake ..

make

sudo make install

报错6,没有链接到

解决方法

###看是否在/usr/local/stow/absl/lib目录下,如果没有

echo $LD_LIBRARY_PATH

###链接LD_LIBRARY_PATH的位置

export LD_LIBRARY_PATH=/usr/local/stow/absl/lib:$LD_LIBRARY_PATH

cd /home/ply1/carto_ws/src/cartographer/scripts/abseil-cpp

删除build

mkdir build

cd build

cmake ..

make -j6

sudo make install

报错7,居然在100%给我报错,气死了

报错原因: abseil-cpp 中的共享库未使用 -fPIC 标志进行编译。

解决办法:采用-fPIC的方法对abseil-cpp进行编译

###如果编译了则先删除build再重新编译

mkdir build

cd build

cmake .. -DCMAKE_CXX_FLAGS=-fPIC

make

sudo make install