1. 背景
阅读Cartographer代码,需要解决一些函数的跳转关系,但是这个项目有点庞大,Qt-creator-ros也不能直接对整个克隆下来的项目进行分析其中的依赖关系,导致很多函数跳转不能实现。
本文通过修改CMakeList.txt 以及 一些文件位置, 使得Qt-Creator可以解决跳转的问题,可以自由在代码海洋中穿梭。对于阅读Cartographer有更好的效果。
2. 下载&编译源码
2.1. 下载&编译
进入官方说明网页:https://google-cartographer-ros.readthedocs.io/en/latest/
按照指示进行编译。
1 | mkdir catkin_ws |
1 | src/cartographer/scripts/install_proto3.sh |
2.2. 注意
其中,上面有些步骤是需要设置代理才能执行的,这些步骤分别是
- wstool merge -t src
- rosdep update
否则,会报错如下: > https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list Website may be down.
2.3. 编译完成之后的提示
3. 创建QT-Ros的工作空间
3.1. 初始化src文件夹
在工作空间目录中,执行:
- wstool init src
catkin_make 一下
3.2. 把下载下来的Cartographer/src复制到src目录下
3.2.1. 把下载下来的Cartographer/src复制到src目录下
3.3. 进入QT-creator查看
3.4. 使用qt-cerator尝试进行编译
报错如下:
This workspace contains non-catkin packages in it, and catkin cannot build a non-homogeneous workspace without isolation. Try the 'catkin_make_isolated' command instead.
这个错误的意思是,这个项目里面包含了不是ros的package,不能使用catkin_make进行编译,需要使用"catkin_make_isolate"进行编译,这种编译方式就是说普通的C++项目,就使用cmake来编译,对于ros的package,就使用catkin_make来编译。
3.4.1. 修改一下,在qt——creator使用catkin_make_isolate编译
- 点击左侧“项目”
- 构建步骤
- 把原来的构建步骤删除
- 添加Build步骤
- 添加“自定义进程步骤”
3.4.2. 点一下小锤子,进行编译
可以开始正常编译了,编译过程如下
有时候会报一个关于 ascii 字符编码的错误,不用管,再次点小锤子,就可以继续编译。大概会遇到三次这样子:
编译完成:
3.4.3. 既然编译通过,那看看代码依赖问题是否解决了
虽然通过编译,但是依赖问题没有解决,还是不能实现跳转,而且左侧有很多报错,提示找不到这些头文件
可以发现,qt-creator-ros很操蛋,对于使用自定义的"catkin_make_isolate"不认,不能识别依赖,只认catkin_make操作
4. 在qt使用catkin_make编译
由于项目中有两个package不是ros项目,“cartographer” 和“ceres-solver” 都是要使用cmake进行编译的,因此需要将它们移出去。
4.1. 移除“cartographer” 和“ceres-solver”
4.2. 尝试使用catkin_make进行编译
这时候,开始报错啦,注意了 报错如下:
CMake Error at cartographer_ros/>cartographer_ros/CMakeLists.txt:38 (find_package): By not providing "Findcartographer.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "cartographer", but CMake did not find one.
Could not find a package configuration file provided by "cartographer" with any of the following names:
cartographerConfig.cmake cartographer-config.cmake
报错的原因是:Cartographer原本只是一个C++库,注意,是库。Cartographer-Ros是对这个库的封装和调用,我们把Cartographer移出去了,Cartographer-Ros就找不到关于这个库的头文件和动态库文件了。
解决思路
修改Cartographer-Ros的CMakeList.txt文件,修复依赖关系。
4.3. 先对cartographer_ros操作
4.3.1. CMakeList.txt
增加一行内容,用来指向查找cartographer库的
注意,下面的路径对应自己实际情况修改(将cartographer指向第一步下载下来并编译好的):
1 | #增加这一行 |
4.4. 再对cartographer_rviz的CMakeList.txt操作
进行同样的操作即可
4.4.1. CMakeList.txt
增加一行内容,用来指向查找cartographer库的
注意,下面的路径对应自己实际情况修改(将cartographer指向第一步下载下来并编译好的):
1 | #增加这一行 |
5. 再次使用catkin_make编译
先切换到构建release版本
5.1. 可以看到,这次可以使用catkin_make编译啦
编译过程
编译完成
6. 现在来看看代码头文件依赖情况吧
绿了吧
跳转正常