ROS 工作空间
简介
工作空间是一个存放工程开发相关文件的文件夹,包括以下四个文件夹
- src 代码空间 (放置所有功能包,代码
- build 编译空间 (放置编译过程中产生的中间文件,不用怎么关心)
- devel 开发空间 (放置编译生成的可执行文件,库,一些脚本,最后编译出的文件都是在这里运行的)
- install 安装空间 (安装软件的位置,类似于windows的program files 文件夹)
可以观看古月居的介绍视频ROSworkspace
所有的源码,配置文件,编译出来的可执行文件都是放在工作空间里。
可以将工作空间理解为C++的PROJECT。
src 源空间
主要使命 : 存放功能包
工作空间/src 文件夹内文件的结构可由下图表示
功能包是ROS文件系统中组织程序文件的基本单元,也就是catkin编译的基本单元。一个 package 下必须包含 CMakeLists.txt 和 package.xml 两个文件:
- CMakeLists.txt 文件中规定了功能包的编译规则,包括指定功能包名称,指定编译依赖项,指定要编译的源文件,指定要添加的消息格式文件/服务格式文件/动作格式文件,指定生成的消息/服务/动作,指定头文件搜索目录,指定链接库搜索目录,指定生成的静态链接库文件,指定需要链接的库文件,指定编译生成的可执行文件以及路径等等。
- package.xml 文件定义了功能包的属性信息,包括包名,版本号,作者,编译依赖和运行依赖等。
另外
- include 和 src 分别存放头文件(.h)和源程序文件(.c/.cpp等);
- scripts 存放脚本文件(比如Python文件 *.py,shell文件 *.sh);
- launch 存放 launch文件(*.launch),用于批量运行多个可执行文件;
- config 存放配置文件(*.yaml等);
此外,还有自定义的通信格式文件,包括消息(.msg)、服务(.srv)以及动作(*.action)。
build 编译空间
存放CMake和catkin的缓存信息、配置信息和其他中间文件。
devel 开发空间
存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
install 安装空间
即开发完成后的安装包。
如何创建工作空间
创建工作空间主体上可以按下图所示步骤来完成:
创建工作空间
- 第一步创建工作空间,用mkdir创建文件夹,名为catkin_ws
$ mkdir -p ~/catkin_ws/src
attention: workspace 的名字是可以自定义的,比如不叫catkin_ws,改作wocao, 但是src这个文件夹的名字不能改。
mkdir:创建目录。
-p: 创建mydir目录以及mydir目录下面的dir_test文件。允许创建目录及子目录
-m:创建指定权限的目录
- 进入文件夹内
$ cd ~/catkin_ws/src
这一步也可以鼠标操作,进入文件夹后打开终端
- 通过下面的语句将catkin_ws变成ROS工作空间的属性
$ catkin_init_workspace
创建成功的提示为
Creating symlink "/home/jpy/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/melodic/share/catkin/cmake/toplevel.cmake"
catkin_init_workspace命令和catkin_ws的名字没有关系,固定的写法,就算工作空间叫wocao,命令也是这么写。
编译工作空间
- 回到工作空间的根目录下
$ cd ..
# 或者 cd ~/catkin_ws/
# 或者鼠标操作
- 编译
$ catkin_make
catkin_make是ROS里面catkin编译器提供的编译指令,通过这个指令可以编译src下面所有功能包的源码,根据我们的配置来编译,结果会放在devel和install里面。编译成功时终端显示如下
但是目前没有产生实际的编译效果,要产生install这个文件夹的话需要运行以下指令
$ catkin_make install
到目前为止就已经产生了四个文件夹:
强调一遍,src文件夹存放之后功能包的源码,install是安装空间,里面存放编译生成的可执行文件,devel是开发空间,里面存放开发过程中产生的一些可执行文件,包括一些库,devel与install的一些功能是类似的,只不过一个是开发中,一个是开发结束之后发布给客户使用的可执行文件/结果文件,build是编译过程当中产生的中间文件,一些二进制文件,我们基本上用不到,不用操心
空的工作空间也是可以编译的,就像在VS里面建立一个空的project,也还是可以编译的。
创建代码一定要创建功能包,功能包是ROS里面源码的最小单元,所有源码都必须放到功能包里面,不能直接放到src下面去编译,这是不被允许的。必须要创建功能包。
创建功能包要用到下面的指令模板:
$ catkin_create_pkg<package_name>[depend1][depend2][depend3][...]
指令中要包含几个参数,
ITEM | EXPLAIN |
---|---|
package_name | 功能包的名字 |
depend | 功能包的依赖, 可能要依赖工作空间中其他的功能包, 包里要用到的库 |
功能包一定要放置在src里面
e.g.
$ cd~/catkin_ws/src
$ catkin_create_pkg test_pkg std_msgs rospy roscpp
操作步骤
- 进入src文件夹 创建功能包
$ cd 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 /home/jpy/catkin_ws/src/test_pkg. Please adjust the values in package.xml.
src存放的是用来放置功能包的代码,cpp或者py
include用来存放头文件,如cpp里的 .h 文件
CMakeLists.txt 和 package.xml是每个功能包必须要有的文件,有了这两个文件才标志着这个test_pkg文件夹叫做一个功能包而不是一个普通文件夹的属性
src里面是功能包+CMakeLists.txt,功能包文件夹点开之后一定会有CMakeLists.txt 和 package.xml
创建了功能包之后就可以编译了,编译过程就按照以上的指令做就可以了。
设置环境变量
编译成功之后,如果要运行功能包里面某一个程序的话,需要设置一下工作空间的环境变量,很多的工作变量都是工作空间里面放置的,为了系统能够找得到这些可执行文件,需要设置环境变量
$ source devel/setup.bash
这是针对catkin_ws工作空间的环境变量设置,只有设置后才能让系统找到我们的工作空间并且找到工作空间里面对应的功能包。
检查环境变量
$ echo $ROS_PACKAGE_PATH
ROS_PACKAGE_PATH 是一个ROS本身的一个环境变量,它会通过这个环境变量来查找所有ROS功能包的路径,只有设置setup.bash环境变量之后,PATH里面才会包含工作空间的路径,才能找到我们写的功能包
运行上面的语句之后,指令反馈为:
/home/jpy/catkin_ws/src:/opt/ros/melodic/share
可以看到,第一段就是工作空间下的src文件夹路径,只要我们的功能包是放在工作空间文件夹下的src文件夹里面,系统就可以通过环境变量找到功能包。所以环境变量的设置是极其重要的。
CMakeLists.txt 和 package.xml 介绍
package.xml
文件里面的内容是通过xml这种语言描述的一些与功能包相关的信息,比如说功能包的名字,版本号,描述信息(功能包干吗用的),功能包维护者的email地址,还有license(开源的许可证)
另外一部分就是功能包的依赖信息,比如说roscpp rospy std_msgs
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
如果在当初创建功能包时没有写全,也可以随时在这里修改手动扩展依赖,主要是编译依赖build和运行依赖exec。
CMakeLists.txt
这个文件主要用来描述功能包的编译规则,文件内使用的语法是CMAKE语法。
- find_package
编译之前要找到哪些功能包,这些功能包是我依赖的,这里面依赖的库、头文件都可以调用
参考博客文章: