因为在用胡春旭的书学习ros,现在看到cartographer激光slam的章节,因此安装carto
但是万万没想到,这个东西的坑如此之多!
几个重要的参考链接,感谢这些博主的引路:
https://blog.csdn.net/qq_26482237/article/details/92676267
https://blog.csdn.net/qq_40081208/article/details/101606899
https://blog.csdn.net/m0_37923410/article/details/87407841
https://blog.csdn.net/seeseeatre/article/details/84863485?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/qq_38649880/article/details/87903654?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/mrh1714348719/article/details/103803110
https://blog.csdn.net/FK2016/article/details/83375048
首先,我这里使用的是官网的安装方法(也就是书上介绍的方法)。
在这之前我们先做些非常重要的准备工作
0.准备工作
- 解决一下github克隆慢的问题(网上很多帖子,不能fq的话考虑使用修改hosts)
- 加入谷歌服务器域名
sudo gedit /etc/resolv.conf
将原有的nameserver这一行注释,并添加以下两行:
nameserver 8.8.8.8
nameserver 8.8.4.4
然后保存并关闭文件。这里是为了以后的wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
这一行命令做铺垫的。(否则会很慢,这个以后再说)
- 尽量连接手机热点进行下面的下载操作
1.安装protobuf3
这是非常重要的一步,因为我之前安装ros的时候是proto2,这个低版本是不适用于cartographer的,因此重装proto3。
参考:https://blog.csdn.net/FK2016/article/details/83375048
当然,不用看参考,看我这里:
- 卸载ros自带proto2
# sudo apt-get remove libprotobuf-dev
# which protoc
// 运行完“which protoc”会显示一个protoc的路径,如果没有显示则下面这条命令不必执行
# rm /usr/local/bin/protoc
// 具体路径以“which protoc”显示的为准,如果是默认的话更有可能是usr/bin/protoc
到此,低版本的protobuf卸载完成。
- 安装protobuf3.6.0
(1) 首先安装依赖库
# sudo apt-get install autoconf automake libtool curl make g++ unzip
(2) 接下来克隆源码,注意,git submodule update --init --recursive这一步克隆子模块必须有,否则后面会报错(报找不到文件的错),当然,之前如果你没有解决github下载慢的问题(0-1),这里可能就要慢的绝望了。
# 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
# cd protobuf
# ./autogen.sh
# ./configure
# make
// 如果没有克隆子模块,make check会失败但是可以继续make install,但是使用某些功能时可能会出错
# make check
# sudo make install
# sudo ldconfig
// 输出protobuf版本信息则表示安装成功
# protoc --version
最后,查看安装位置
which protoc
结果应该是:
可以看到,其默认下载位置为 /usr/local/bin/protoc
这是我们不想要的,因为carto的搜索protoc的路径为/ usr/bin/protoc
因此有两种调整方法,推荐第二种干脆利落:
①建立软连接
$ sudo ln -s /usr/local/bin/protoc /usr/bin/protoc
如果后悔了,如何删除软连接看这篇文章
https://blog.csdn.net/weixin_44684139/article/details/104603432
②直接copy过去
sudo cp /usr/local/bin/protoc /usr/bin
或者干脆一点手动copy
最终,安装完毕protobuf3.6的版本,并完成位置的调整。
2.安装cartographer
- 安装工具
sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build
2.创建工作区间"carto_ws"并初始化
mkdir carto_ws
cd carto_ws
wstool init src
3.加入cartographer_ros.rosinstall并更新依赖
如果没有进行准备工作,将谷歌服务器域名加入的话(0-2),merge这一步可能就会链接超时了。
wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
输入完第一个命令后需要改文件的下载地址,另起终端输入:
gedit carto_ws/src/.rosinstall
将最后一个git来源网址由https://ceres-solver.googlesource.com/ceres-solver.git改为https://github.com/ceres-solver/ceres-solver.git
wstool update -t src
这里要注意的是更改最后一个ceres-solver的git来源网址
若不更改,则克隆ceres-solver的过程中会超时 time out
最终在你的工作空间中会出现 :
4.安装依赖并下载cartographer相关功能包
注意rosdistro=kinetic -y是根据自己ros的版本来的
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
(我默认版本为kinetic,若是其他ROS版本相应替换)
但是这里可能会报错:
ERROR: error loading sources list:
The read operation timed out
这是rosdep update的老毛病了,如果你做了准备0-3也就是换了4G进行这些操作,这里应该很容易通过。
如果还不行,则更改等待时间:
sudo vim /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
将DOWNLOAD_TIMEOUT = 15.0改成500
sudo vim /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
将DOWNLOAD_TIMEOUT = 15.0改成500
sudo vim /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
将DOWNLOAD_TIMEOUT = 15.0改成500
注意,三者缺一不可(当然啦,500这个数是随缘给的,比以前的数字大就行)
然后再次rosdep update成功几率会变大,如果卡住可以重新再来几次
- 编译并安装
catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash
如果catkin_make_isolated --install --use-ninja这一步报错了(如:未定义的引用的错误等)!那么不妙,可能是你的protoc3未安装成功或protoc2有残留,当然最乐观的情况是你没有调整protoc的位置,只需要回到步骤1-2-3去调整位置即可
,否则需要卸载干净protoc2或者3,并重新安装protoc3,并重新进行所有步骤
如果没报错,则安装成功。
当然,可以将最后这行命令放到bashrc文件中,否则每次运行demo都需要输入一遍,否则找不到launch文件
采用:
source /home/mjy/dev/carto_ws/install_isolated/setup.bash
也可以手动添加,bashrc文件位于home/下的隐藏文件。
6.尾声——测试
在cartographer官网
①先下载个2D包,如
然后进行编译:
其格式为
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=跟上bag的路径
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=/home/mjy/dev/carto_ws/b0-2014-07-21-12-42-53.bag
②再测试个3D包
roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=跟上bag的路径
roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=/home/mjy/dev/carto_ws/b3-2016-03-01-13-39-41.bag
3.补充
如果你要安装turtlebot,则还是原先的流程,新建一个工作空间,然后balabala…
只不过需要将
wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
也就是需要谷歌服务器那一句改为:
wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_turtlebot/master/cartographer_turtlebot.rosinstall
就可以,其余流程一样,可参考:https://www.ncnynl.com/archives/201810/2777.html