使用QT-Creator-Ros阅读Google-Cartographer代码_解决依赖-跳转问题-全绿_

Catalogue
  1. 1. 1. 背景
  2. 2. 2. 下载&编译源码
    1. 2.1. 2.1. 下载&编译
    2. 2.2. 2.2. 注意
    3. 2.3. 2.3. 编译完成之后的提示
  3. 3. 3. 创建QT-Ros的工作空间
    1. 3.1. 3.1. 初始化src文件夹
    2. 3.2. 3.2. 把下载下来的Cartographer/src复制到src目录下
      1. 3.2.1. 3.2.1. 把下载下来的Cartographer/src复制到src目录下
    3. 3.3. 3.3. 进入QT-creator查看
    4. 3.4. 3.4. 使用qt-cerator尝试进行编译
      1. 3.4.1. 3.4.1. 修改一下,在qt——creator使用catkin_make_isolate编译
      2. 3.4.2. 3.4.2. 点一下小锤子,进行编译
      3. 3.4.3. 3.4.3. 既然编译通过,那看看代码依赖问题是否解决了
  4. 4. 4. 在qt使用catkin_make编译
    1. 4.1. 4.1. 移除“cartographer” 和“ceres-solver”
    2. 4.2. 4.2. 尝试使用catkin_make进行编译
    3. 4.3. 4.3. 先对cartographer_ros操作
      1. 4.3.1. 4.3.1. CMakeList.txt
    4. 4.4. 4.4. 再对cartographer_rviz的CMakeList.txt操作
      1. 4.4.1. 4.4.1. CMakeList.txt
  5. 5. 5. 再次使用catkin_make编译
    1. 5.1. 先切换到构建release版本
    2. 5.2. 5.1. 可以看到,这次可以使用catkin_make编译啦
  6. 6. 6. 现在来看看代码头文件依赖情况吧

1. 背景

阅读Cartographer代码,需要解决一些函数的跳转关系,但是这个项目有点庞大,Qt-creator-ros也不能直接对整个克隆下来的项目进行分析其中的依赖关系,导致很多函数跳转不能实现。

本文通过修改CMakeList.txt 以及 一些文件位置, 使得Qt-Creator可以解决跳转的问题,可以自由在代码海洋中穿梭。对于阅读Cartographer有更好的效果。

2. 下载&编译源码

2.1. 下载&编译

进入官方说明网页:https://google-cartographer-ros.readthedocs.io/en/latest/

按照指示进行编译。

1
2
3
4
5
6
7
8
9
10
11
mkdir catkin_ws

cd catkin_ws

wstool init src

wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall

wstool update -t src

src/cartographer/scripts/install_proto3.sh
1
2
3
4
5
6
7
src/cartographer/scripts/install_proto3.sh

# sudo rosdep init 这步可以省略

rosdep update

rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

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编译

  1. 点击左侧“项目”
  2. 构建步骤
  3. 把原来的构建步骤删除
  4. 添加Build步骤
  5. 添加“自定义进程步骤”

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
2
3
4
5
6
#增加这一行
set(cartographer_DIR /你的路径/cartographer/install_isolated/share/cartographer)

find_package(cartographer REQUIRED)

include("${CARTOGRAPHER_CMAKE_DIR}/functions.cmake")

4.4. 再对cartographer_rviz的CMakeList.txt操作

进行同样的操作即可

4.4.1. CMakeList.txt

增加一行内容,用来指向查找cartographer库的

注意,下面的路径对应自己实际情况修改(将cartographer指向第一步下载下来并编译好的):

1
2
3
4
5
6
#增加这一行
set(cartographer_DIR /你的路径/cartographer/install_isolated/share/cartographer)

find_package(cartographer REQUIRED)

include("${CARTOGRAPHER_CMAKE_DIR}/functions.cmake")

5. 再次使用catkin_make编译

先切换到构建release版本

5.1. 可以看到,这次可以使用catkin_make编译啦

编译过程

编译完成

6. 现在来看看代码头文件依赖情况吧

绿了吧

跳转正常