cartographer的安装非常复杂,尤其是proto脚本和各种依赖项,如果一次不成功,最好把proto或其他依赖库彻底删除重来,越改可能越乱,再也装不好了。
ros2的carto好像还是非常早期的版本,一些参数都不支持,先不必使用
安装过程的问题
下载protobuf很可能失败,只好手动下载: git clone https://github.com/google/protobuf.git
小强编译cartographer更新的lib文件在/home/xiaoqiang/Documents/ros/devel/lib/cartographer_ros
gtest问题
编译cartographer报错gtest1
2/usr/src/gtest/src/gtest.cc:1897:10: error: type ‘const class testing::internal::scoped_ptr<testing::internal::GTestFlagSaver>’ argument given to ‘delete’, expected pointer
delete gtest_flag_saver_;
估计是gtest的版本不兼容导致,从github上下载编译google-test
,注意修改CMake支持c++14,否则连从github直接下载的源码编译也报错:
然后编译cartographer时,把几个重要的CMakeLists.txt也加上c++14的支持,否则所有的测试文件(以test.cc
结尾的文件)编译都会出错
缺少liborocos-kdl库文件
默认的版本是1.3.2,这是下载地址
缺FindLuaGoogle
报错:1
2
3Could NOT find Lua (missing: LUA_LIBRARIES LUA_INCLUDE_DIR)
CMake Error at cmake/modules/FindLuaGoogle.cmake:217 (MESSAGE):
Did not find Lua >= 5.2
解决: sudo apt-get install lua5.2 lua5.2-dev
absl库的问题
cartographer新版本要先安装abseil,否则报错
1 | git clone https://github.com/abseil/abseil-cpp.git |
编译时会有个问题,需要加C++11,在absl文件夹里的CMakeList.txt里面添加set(CMAKE_CXX_FLAGS "-std=c++11")
或者 add_compile_options(-std=c++11)
如果还是缺少文件,就按照find_package
的要求配置
这个问题困扰我好久,最后终于发现在编译absl库时的cmake没有加 -fPIC flag
,所以执行 cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
,这样就永久解决这个问题了。
要注意报错信息,找的是AbseilConfig.cmake
或者 abseilConfig.cmake
,查看cartographer_ros
的CMakeLists
。 我的abseil装完是在/usr/local/lib/cmake/absl/abslConfig.cmake
1
2
3# 添加查找目录
set(Abseil_DIR "/usr/local/lib/cmake/absl")
find_package(Abseil REQUIRED)
从github下载 abseil-cpp-20190808.1
,解压后执行1
2
3
4
5
6
7
8
9
10
11
12
13
14git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp
git checkout 215105818dfde3174fe799600bb0f3cae233d0bf # 20211102.0
mkdir build
cd build
cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl \
..
ninja
sudo ninja install
cd /usr/local/stow
sudo stow absl
修改cartographer_ros/CMakeLists.txt
的部分:1
2set(absl_DIR "/usr/local/stow/absl/lib/cmake/absl")
find_package(absl REQUIRED)
Protobuf
安装cartogapher新版本时候,编译后遇到Unrecognized syntax identifier "proto3". This parser only recognizes "proto2"。
检查protobuf版本: protoc --version
显示的是2.6版本。
使用locate protoc
发现我有两个protc,在/usr/bin
和/usr/local/bin
,分别检查版本,发现都是2.6。再次使用md5sum
检查,发现两个文件完全一样
安装 Protobuf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 版本不要太新
VERSION="v3.4.1"
# Build and install proto3.
git clone https://github.com/google/protobuf.git
cd protobuf
git checkout tags/${VERSION}
mkdir build
cd build
cmake -G Ninja \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DCMAKE_BUILD_TYPE=Release \
-Dprotobuf_BUILD_TESTS=OFF \
../cmake
ninja
sudo ninja install
或者1
2
3
4
5
6
7
8
9
10
11sudo apt-get install autoconf autogen
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
# 这一步可能会报错,无视就好
make check
sudo make install
sudo ldconfig # refresh shared library cache.
检查一下安装后protobuf的版本,protoc --version
编译器优先找了/usr/bin/protoc
的版本, 新安装的proto3是放在/usr/local/bin/protoc
下的,可以删除/usr/bin/protoc
,然后把/usr/local/bin/protoc
放入/usr/bin
,或者建立软连接:1
2sudo mv /usr/bin/protoc /usr/bin/protoc.bk
sudo ln -s /usr/local/bin/protoc /usr/bin/protoc
编译
有时编译遇到错误,只删除build_isolated/cartographer_ros/CMakeFiles
即可,不用全删编译完成的文件