添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

看了下官方的安装步骤,本以为没太多的依赖,结果还是趟了一路的坑。。。
先做下总结,说下安装思路,在针对具体问题描述下解决办法。

首先最大的坑来自Dockerfile,使用cartographer自带的Dockerfile文件,经过番茄等一些列操作,下载镜像还算顺利,
但是在跑demo时遇到以下问题:

    1).docker中调用Rviz时, 存在GUI显示服务的问题,这个问题的常规解法是用X11显示服务
          ubuntu1604的做法是
           xhost +
           docker run -id --name cartographer_rosc -v /data/apollo_all/slam:/work -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY cartographer_ros:1.1
          Mac OS上的做法需要安装   XQuartz ,详情参考此连接
    2). 就算上面能够解决docker GUI的问题,但在ubuntu上依然存在显卡驱动问题,涉及到nvidia驱动,这个实在是太繁琐,最后直接放弃了。

总之最终结论是建议绕过Dockerfile,直接安装在ubuntu系统上。

完全可以先按照cartographer官方的文档中的步骤进行编译安装,如果问题太多,总是编译不过,再考虑我下面的思路。

protobuf与cartographer编译版本不匹配,这个问题简直头疼死了,
要么报google::protobuf的什么函数未定义(例如, undefined reference to `google::protobuf::internal::ComputeUnknownFieldsSize),
要么是xx未使用(error: ‘dynamic_init_dummy_src_2fproto_2fgrpc_2fcore_2fstats_2eproto’ defined but not used [-Werror=unused-variable),

对这个问题,没有其他办法,就是反复的尝试proto的不同版本+反复编译cartographer,
一定要用下面的方法确保protobuf完全安装成功,要make check,
在每次重新编译cartographer之前,一定要删除原来编译一半的文件夹。

如果官网的步骤通不过,那就按照自己的步骤安装吧,

    1) 安装Ros-kenitic,以及rosdep各种依赖,
    2) 单独下载cartographer , cartographer_ros, 和ceres-solver 源码
    3)安装protobuf
    4) 手动编译安装ceres-solver, 参考 src/cartographer/script/install_ceres.sh
    5) 手动编译安装 cartographer,参考src/cartographer/script/install_cartographer_cmake.sh
    6)最后在catkin_ws的工作目录下,直行catkin_make_isolated --install --use-ninja, 建立完整的工作环境

然后就可以用了^^~

source install_isolated/setup.bash
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=/data/apollo_all/slam/ros_bag/2d/cartographer_paper_deutsches_museum.bag

以下是我在Ubuntu16.04上的安装详情:

安装Ros-Kenitic

本步骤中参考ros的官方指导安装即可,

遇到的坑:

    1)找不到某个ros-*包的问题, 
         需要更新ros的源, 亚洲源 + deb源 ,这两个源也都来自官方的参考说明

先离线下载源码

官方提供的下载方式是用rosinstall file,但是里面ceres的git地址要科学上网,可以自己把三部分源码下到 src

https://github.com/googlecartographer/cartographer
https://github.com/googlecartographer/cartographer_ros
https://github.com/ceres-solver/ceres-solver

下载后都是最新的,也不用 wstool update -t src 这条了

安装Protobuf

protobuf-master
git clone https://github.com/protocolbuffers/protobuf.git
$ cd protobuf
$ git submodule update --init --recursive
$ ./autogen.sh
$ ./configure --disable-werror  #这个选项需要带着防止gtest报错
$ make
$ make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.
1)error: ‘dynamic_init_dummy_src_2fproto_2fgrpc_2fcore_2fstats_2eproto’ defined but not used [-Werror=unused-variable
                 ./configure --disable-werror 解决此问题
2)编译cartographer时,遇到 undefined reference to `google::protobuf::internal::ComputeUnknownFieldsSize)  
或类似的报错
 反复编译protobuf 和cartorgrapher,一定要注意编译的顺序,还有删除所有没有编译完成的文件夹。

安装其他cartorgrapher相关的包

只要上面的准备工作做好了,剩下的就按cartographer照官网的步骤安装即可

sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
最近在学习C++,顺带学些了一下CMake,但是当链接(link)的时候,总是出现类似于下面的错误。注:所有关于protobuf的调用链上的函数都显示这个问题,这里只粘贴了其中的一条。
c++ undefined reference to google::protobuf::internal::VerifyVersion(int, int, char const*)
由于是链接时出现了问题,因此查看build/CMakeFiles/test_server/link.txt文件,发现该文件
原因总结
所用的protobuf是旧版本的GCC(5之前的版本)所编译的,所以需要卸载后重新用新版本的编译一遍,如果有其他项目引用了旧版本的protobuf,就也不能用了。
明明是新下载安装protobuf,用的也是新的gcc,仍然有这样的问题。是因为在安装protobuf之前,其实系统里还有一个protobuf,所以用的时候发生了冲突,项目实际上用的是这个旧的。我因为之前安装过ros,里面自带了一个3
一、卸载遗留文件,完全卸载protobuf
二、安装高版本的protobuf 安装protobuf(cpp版)
注:如果非要那个版本的protobuf,那就安装一个低版本的g++,然后重新编译,但是要注意设置优先级
升级g++后,设置多版本优先级
				
我的电脑一开始使用sudo apt-get install libprotobuf-dev命令装了protobuf,不过版本用是2.6.1. 在编译程序时,看到指定要求的是protobuf 3以上的版本,所以就根据网上的指示手动装了3.12版本,安装目录为usr/local/protobuf 然后在cmakelist中指定protobuf包的位置 find_package(OpenCV REQUIRED) set(Protobuf_PREFIX_PATH "/usr/local/protobuf/i
在编译google protobuf原码时出现错误 In function `google::protobuf::DescriptorPool::NewPlaceholderWithMutexHeld(std::string const&, google::protobuf::DescriptorPool::PlaceholderType) const': descriptor.cc:...
lc@lc-host:~/PycharmProjects/cplus/proto_bazel_test$ g++ main.cpp msg.pb.cc -o main.out -lprotobuf /usr/bin/ld: /tmp/ccxuZhla.o: in function `descriptor_table_msg_2eproto_metadata
问题是在我用Qt5.14.1的Mingw7.5编译Protocol buffer3.11.4出的问题。编译还算顺利,测试过程中就出问题了:(当然我还遇到其他问题,在其他地址再详细说) 这个错误似乎有个共性,就是abi::cxx11或是std::__cxx11错误 于是乎去查资料,终于找到原因了: 查看这个CMakeList.txt 第22行到第29行: # Add c++11 flags if (CYGWIN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=