1、ROS工作空间
每个ROS项目都有固定的、相同的目录结构,即ROS工程以目录结构来构建。将这种有固定结构的文件夹作为工作空间,工作空间中有四个重要的子目录:build、devel、install、src,其中只有src需要手动创建,其它三个三通过构建命令自动生成,下面会详细说明这四个子目录的作用
~/workspace/ros$ tree -L 1
.
├── build
├── devel
├── install
└── src
2、创建工作空间
2.1 创建工作空间根目录
创建一个空目录作为工作空间根目录,例如本人的根目录为:~/workspace/ros
$ mkdir -p ~/workspace/ros
2.2 创建源码目录src
所有源码都将放入src中,进入工作空间根目录
$ cd ~/workspace/ros
创建src
$ mkdir src
2.3 初始化工作空间
进入src目录,执行命令catkin_init_workspace
$ cd src/
$ catkin_init_workspace
Creating symlink "~/workspace/ros/src/CMakeLists.txt" pointing to "/opt/ros/melodic/share/catkin/cmake/toplevel.cmake"
可以通过打印信息了解到,初始化工作空间就是创建了一个软链接CMakeLists.txt指向==/opt/ros/melodic/share/catkin/cmake/toplevel.cmake==,可以使用cat CMakeLists.txt查看这个文件的内容
$ cat CMakeLists.txt
# toplevel CMakeLists.txt for a catkin workspace
# catkin/cmake/toplevel.cmake
cmake_minimum_required(VERSION 3.0.2)
project(Project)
set(CATKIN_TOPLEVEL TRUE)
略……
2.4 编译
编译需要在工作空间根目录中执行,因此先返回上级目录
~/workspace/ros/src$ cd ..
~/workspace/ros$ ls
src
使用catkin_make命令编译,编译过程中会创建两个目录build和devel;
build:编译目录,存放编译过程中生成的临时文件;
devel:开发空间,存放编译最终生成的可执行文件、脚本文件、配置文件等
$ catkin_make
Base path: ~/workspace/ros
Source space:~/workspace/ros/src
Build space: ~/workspace/ros/build
Devel space:~/workspace/ros/devel
Install space:~/workspace/ros/install
####
#### Running command: "cmake~/workspace/ros/src -DCATKIN_DEVEL_PREFIX=~/workspace/ros/devel -DCMAKE_INSTALL_PREFIX=~/workspace/ros/install -G Unix Makefiles" in "~/workspace/ros/build"
####
-- The C compiler identification is GNU 7.5.0
略……
-- Configuring done
-- Generating done
-- Build files have been written to: ~/workspace/ros/build
####
#### Running command: "make -j6 -l6" in "~/workspace/ros/build"
####
从打印信息中,可以看出,等于执行如下两条命令cmake和make
cmake ~/workspace/ros/src -DCATKIN_DEVEL_PREFIX=~/workspace/ros/devel -DCMAKE_INSTALL_PREFIX=~/workspace/ros/install -G Unix Makefiles
make -j6 -l6
2.5 安装
执行catkin_make install 命令,会将可以执行文件、脚本、配置文件等拷贝、安装到install目录中,实际等于执行make install命令
catkin_make install
Base path:~/workspace/ros
Source space:~/workspace/ros/src
Build space: ~/workspace/ros/build
Devel space: ~/workspace/ros/devel
Install space:~/workspace/ros/install
####
#### Running command: "make cmake_check_build_system" in "~/workspace/ros/build"
####
####
#### Running command: "make install -j6 -l6" in "~/workspace/ros/build"
####
Install the project...
-- Install configuration: ""
-- Installing: ~/workspace/ros/install/_setup_util.py
略……
很多人抱怨devel和install目录中的内容是基本重复的,因此在ROS2中去掉了devel,只保留了install目录;
本人猜测“抱怨”的人应该是之前没有做过软件开发项目……
至此,一行代码没敲,生成的文件如下
~/workspace/ros$ tree -L 2
.
├── build
│ ├── atomic_configure
│ ├── catkin
│ ├── catkin_generated
│ ├── CATKIN_IGNORE
│ ├── catkin_make.cache
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── CTestConfiguration.ini
│ ├── CTestCustom.cmake
│ ├── CTestTestfile.cmake
│ ├── gtest
│ ├── install_manifest.txt
│ ├── Makefile
│ └── test_results
├── devel
│ ├── cmake.lock
│ ├── env.sh
│ ├── lib
│ ├── local_setup.bash
│ ├── local_setup.sh
│ ├── local_setup.zsh
│ ├── setup.bash
│ ├── setup.sh
│ ├── _setup_util.py
│ └── setup.zsh
├── install
│ ├── env.sh
│ ├── local_setup.bash
│ ├── local_setup.sh
│ ├── local_setup.zsh
│ ├── setup.bash
│ ├── setup.sh
│ ├── _setup_util.py
│ └── setup.zsh
└── src
└── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
11 directories, 27 files
3、创建功能包
3.1 命令格式
catkin_create_pkg <package_name> [depend1] [depdend2] [……]
3.2 创建
创建功能包时,需要在src目录下执行,并且功能包的源码文件会放入对应的包文件夹下,src目录不能直接放源码文件
进入src,执行命令catkin_create_pkg
$ cd ~/workspace/ros/src
$ catkin_create_pkg test_pkg std_msgs rospy roscpp
Created file test_pkg/CMakeLists.txt
Created file test_pkg/package.xml
Created folder test_pkg/include/test_pkg
Created folder test_pkg/src
Successfully created files in ~/workspace/ros/src/test_pkg. Please adjust the values in package.xml.
自动生成的目录结构如下
:~/workspace/ros/src$ tree
.
├── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
└── test_pkg
├── CMakeLists.txt
├── include
│ └── test_pkg
├── package.xml
└── src
4 directories, 3 files
3.3 编译
返回工作空间根目录,再次执行catkin_make
$ cd ..
$ catkin_make
略……
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~ traversing 1 packages in topological order:
-- ~~ - test_pkg
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'test_pkg'
-- ==> add_subdirectory(test_pkg)
-- Configuring done
-- Generating done
略……
可以看出再次编译时,将功能包test_pkg编译进入了
3.4 更新环境变量
将当前工作空间的路径加入环境变量中,以ROS_PACKAGE_PATH为例:
没有更新环境变量之前:
$ echo $ROS_PACKAGE_PATH
/opt/ros/melodic/share
执行更新环境变量命令:
$ source ~/workspace/ros/devel/setup.bash
执行更新环境变量之后:
$ echo $ROS_PACKAGE_PATH
~/workspace/ros/src:/opt/ros/melodic/share
3.5 ROS相关的环境变量
可以使用命令== printenv | grep ROS==查看ROS相关的环境变量
$ printenv | grep ROS
ROS_ETC_DIR=/opt/ros/melodic/etc/ros
ROS_ROOT=/opt/ros/melodic/share/ros
ROS_MASTER_URI=http://localhost:11311
ROS_VERSION=1
ROS_PYTHON_VERSION=2
ROS_PACKAGE_PATH=/opt/ros/melodic/share
ROSLISP_PACKAGE_DIRECTORIES=
ROS_DISTRO=melodic