ROS

ROS Workspace Init

"ros workspace"

Posted by Stephen on January 15, 2020

前言

首先保证 ROS 已经正确安装了。安装方式可以参考在Ubuntu18.04 安装 ROS melodic 安装教程

简单地说,ROS workspace (工作空间)就是统一存放 ROS 文件的地方,比如一个项目的所有 ROS 文件最好都放在一个 workspace 中,便于统一管理、编译和调用。

catkin 是目前 ROS 的编译系统,自 ROS Groovy 版本开始使用,取代了之前的 rosbuild 编译系统。

ROS workspace 中可以包含若干 ROS package,每个 package 内部包含实现某些特定功能的文件。

环境

系统环境

Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
Linux version :       5.3.0-46-generic ( buildd@lcy01-amd64-013 ) 
Gcc version:         7.5.0  ( Ubuntu 7.5.0-3ubuntu1~18.04 )

软件信息

version : 	
     None

正文

创建 workspace

  1. 创建 workspace 文件夹

    mkdir -p ~/catkin_ws/src
    

    这里 workspace 的名字是 catkin_ws,这个名字可以按照自己项目的内容设定,但是 src 这个文件夹的名字是固定的。

  2. 初始化工作空间

    创建了上述目录之后,需要让 ROS 知道这是一个 ROS workspace。进入 src 目录,用命令

    cd src
    catkin_init_workspace
    

    初始化工作空间。这里 src 就是以后存放 ROS 源文件的地方。上述命令之后,会在 src 目录下产生 CMakeLists.txt 文件,这实际上是一个链接到ROS 安装目录下的 /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake 一个超链接文件,对工作空间做了一些初始设置。不用去管它,也不要随便修改它。

  3. 编译

    退到 src 所在的目录,运行

    cd ..
    catkin_make
    

    会一次性编译 src 文件夹中的所有源文件,同时生成 devel 和 build 两个文件夹。

    • build 文件夹存放编译过程中的缓存文件和中间过渡文件
    • devel 文件夹存放编译之后的目标文件和可执行文件。在该文件夹中有一个比较特殊的文件 setup.bash,只要通过 source 命令加载了这个 setup 文件,就相当于编译之后的文件安装在了本机中,可以直接调用他们。等测试没有问题了,再考虑 install 和 share with other developers.

    实际上,catkin_make 这个命令并没有特别神奇的地方,它只是把一系列基本的编译命令整合在了一起,一个 catkin_make 命令相当于如下的一系列命令:

    mkdir build  
    cd build    
    cmake ../src -DCATKIN_DEVEL_PREFIX=../devel    
    make
    

    如果要深入研究 catkin_make 编译方式,可以参考这篇文章:ROS 编译系统 catkin 详解

  4. 把 workspace 的信息载入系统环境变量中。

    source ~/catkin_ws/devel/setup.bash
    

    将 workspace 的信息载入系统环境变量。 这种方法载入的信息只对当前 terminal 有效。新开一个 terminal 就无效了。如果要对每个 terminal 都有效,可以将上述命令写入用户 home 路径下的 .bashrc 文件中:

    echo "source  ~/catkin_ws/devel/setup.bash"  >> ~/.bashrc
       
    

    编译之后,由于我们只是一个空的 workspace,还没有任何 package,所以没有什么实质性的东西,只是告诉系统这里有个 ROS workspace,算是在系统中注册了一下。

创建ROS package

package 是组织 ROS 文件的基本单元,一般来说,每个 package 完成一些特定功能。

package 中至少包含两个文件: package.xml 和 CMakeLists.txt.

  • package.xml: 包含了 package 的描述信息和依赖关系,主要是 ,前者是在 package 编译时依赖的其他 package,后者是在运行时依赖的 package。
  • CMakeLists.txt 则包含了 package 的编译过程的设置。

package 在 workspace 中的存放结构一般如下:

catkin_ws/src/CMakeLists.txt

为 toplevel.cmake

` ln -s /opt/ros/melodic/share/catkin/cmake/toplevel.cmake CMakeLists.txt`

catkin_ws/src/package1/package.xml, CMakeLists.txt catkin_ws/src/package2/package.xml, CMakeLists.txt . . .

也可采用其他的结构,但是要注意 package 之间不能嵌套,也就是在一个 package 中,不能再创建另一个 package ,所有 package 都必须是相对独立的目录。

用 catkin 创建 package 的过程很简单,用如下命令:

catkin_create_pkg pkg_name depend1, depend2, ...

其中 depend 为依赖的其他 package。这样创建之后,package 中的 CMakeLists.txt 和 package.xml 中会体现出这种依赖关系。创建时也可以不指明依赖关系,在后续编译 package 的时候再补上。

创建好了 package,就可以使用 rospack 相关的命令进行查找、进入等操作了。不过,有时会有延迟,可以用命令

rospack find package_name
# 或者
rospack list

查找、更新一下。

编译package

上述方式创建了 ROS package,然后就可以在其中编写 源文件了,可用的语言主要是 c++, python,我们现在的项目中还用到了 Julia。这里就不再细述具体的源文件编写过程了。

创建好了源文件,如果是 c++ 编写的,要编译一下。这里要设置好 package.xml 和 CMakeLists.txt 中的信息。如果依赖的 package 已经设置好了,就不需要修改 package.xml 了,只需要在 CMakeLists.txt 中添加源文件对应的编译信息如下:

add_executable(exe_file_name   cpp_file_name)    
target_link_libraries(exe_file_name  ${catkin_LIBRARIES})

实际上在 CMakeLists.txt 中有非常全面的模板,很容易找到在哪里添加这些编译文件信息。

设置好了编译信息,就可以回到 workspace 的 src 所在文件夹中,用如下命令编译:

catkin_make

该命令可以一次性编译 src 中的所有 package。如果只想编译指定的 package,可以用如下命令:

catkin_make --pkg pkg_name

但是,这个命令似乎有时不太管用,根据我们的实际经验,最有效的方法是用如下的 whitelist 命令:

catkin_make  -DCATKIN_WHITELIST_PACKAGES="package1;package2"

这样就是只编译 package1 和 package2。但是要注意,该命令中的 whitelist 具有记忆功能。用完该命令之后,下次如果要编译 src 中所有的 package,如果只用 catkin_make,则还是只编译 whitelist 中的 package,需要用如下命令清除一下 whitelist

catkin_make  -DCATKIN_WHITELIST_PACKAGES=""

以上就是使用 ROS 中的一些基本操作。

后记

参考:ROS 工作空间、package 及 catkin 编译系统