1.工作空间
工作空间(work space)是ROS系统中存放工程开发相关的文件夹,其目录结构如下:
src:代码空间(Source Space),用于存放开发代码
build:编译空间(Build Space),catkin(CMake)的缓存信息和中间文件
devel:开发空间(Development Space),生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环
境变量
install:安装空间(Install Space)
一个最小的项目结构如图所示
后两个路径由
catkin
系统自动生成、管理,我们日常的开发一般不会去涉及,而主要用到的是src文件夹,我们写的
ROS
程序、网上下载的
ROS
源代码包都存放在这里。 在编译时,catkin
编译系统会递归的查找和编译
src/
下的每一个源代码包。因此你也可以把几个源代码包放到同一个文件夹下,如下图所示:
更加详细的目录结构如下:
1.1 如何创建并编译一个工作空间
创建工作空间
在根目录下创建一个叫catkin_ws的工作空间,并进入到src目录下进行初始化
$ source /opt/ros/kinetic/setup.bash
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
编译工作空间
catkin_make相当于cmake编译器,ROS对其进行改造(加入CMakeLists.txt进行功能包索引)。一般在修改了src下的程序代码或配置文件后需要进行编译。
$ cd ~/catkin_ws
$ catkin_make
设置环境变量
在这里记住一点,但凡编译过工作空间,一定要重新source环境变量,否则代码不会更新。
这里使用的是setup.bash,还有两个文件为setup.sh和setup.zsh,要source哪个文件取决于你的默认解释程序(echo $SHELL)
$ souce ~/catkiin_ws/devel/setup.bash
补充:工作空间的覆盖
ROS系统中工作空间存在Overlaying机制,即工作空间覆盖机制,catkin支持包的逐层覆盖, 当前最高,其它依据source的顺序逐层变高, 高层可覆盖低层. ,符合以下规则:
1)工作空间的路径记录在ROS_PACKAGE_PATH环境变量中
2)新设置的路径(source后)会放在ROS_PACKAGE_PATH变量的最前端
3)运行程序时,ROS会优先在靠近前端的工作空间中查找指定的功能包
4)只有当前端工作空间不存在该功能包时才向后查找
如图所示
可以观察到source当前工作空间后,将当前工作空间的绝对路径放到了系统工作空间之前
2.功能包
1.Ros功能包简介
ROS中的package的定义更加具体,它不仅是Linux上的软件包,更是catkin编译的基本单元,我们调用 catkin_make 编译的对象就是一个个ROS的package,也就是说任何ROS程序只有组织成package才能编译
。所以
package
也是
ROS
源代码存放的地方,任何
ROS
的代码无论是
C++
还是Python
都要放到
package
中,这样才能正常的编译和运行。
一个
package
可以编译出来多个目标文件(
ROS
可执行程序、动态静态库、头文件等等)。
2.功能包创建方式
ROS里的功能包用于区分某个文件夹下代码的功能,如机器人有移动,导航,视觉等功能,我们为整个机器人创建工作空间,也可称为一个项目,接来要开发它的各个功能,于是我们使用功能包来分隔一类别代码。下面是创建功能包的方式:
下面命令创建了一个叫做test1个功能包,导入了rospy roscpp依赖包,ROS支持python和c++开发,所以导入这两个依赖包让功能包可以通过这两种语言开发。
创建完功能包后需要catkin_make进行编译,编译后需要source当前工作空间,这样就完成了功能包的创建
$ cd ~/catkin_ws/src
$ catkin_create_pkg test1 rospy roscpp
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
补充:如果是第三方下载的,如需进行catkin_create_pkg,直接执行catkin_make编译即可
2.ros功能包的目录结构
如果所示,一个功能包的目录结构如下,CmakeLists.txt和package.xml是必须的,分别定义编译规则和描述信息。
其他类似src、include、scripts这些目录命名都是约定俗成的,并未明确定义,但是ros默认会去这些目录下找相关文件,所以为了标准化,请规范命名
更加详细的描述如下
- CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package
- 不可少的成分
- package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成
- 分
- src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py)
- include/: 存放C++源码对应的头文件
- scripts/: 存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py)
- msg/: 存放自定义格式的消息(.msg)
- srv/: 存放自定义格式的服务(.srv)
- models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
- urdf/: 存放机器人的模型描述(.urdf或.xacro)
- launch/: 存放launch文件(.launch或.xml)
注意:同一个工作空间不能存在相同名称的功能包,不同工作空间可以存在相同名称的功能包
3.功能包相关命令rospack
rospack
是对
package
管理的工具,命令的用法如下:
- rospack list :列出本机所有package
- rospack depends [package] :显示package的依赖包
- rospack find [package] :定位某个package
- rospack profile :刷新所有package的位置记录
4.功能包相关命令roscd
roscd
命令类似与
Linux
系统的
cd
,改进之处在于
roscd
可以直接
cd
到
ROS
的软件包。
- roscd [package]:cd到ROS Package的目录
补充:使用前必须source空间
5.功能包相关命令
rosdep 是用于管理ROS package依赖项的命令行工具,用法如下:
- rosdep check [pacakge] :检查package的依赖是否满足
- rosdep install [pacakge] :安装pacakge的依赖
- rosdep db :生成和显示依赖数据库
- rosdep init :初始化/etc/ros/rosdep中的源
- rosdep keys :检查package的依赖是否满足
- rosdep update :更新本地的rosdep数据库
一个较常使用的命令是
rosdep install --from-paths src --ignore-src --rosdistro=kinetic - y ,
用于安装工作空间中
src
路径下所有
package
的依赖项(由
pacakge.xml
文件指定)
使用方式形如:
rosdep install --from-paths /home/user/catkin_ws/src --ignore-src --rosdistro=kinetic - y
3.Catkin编译系统
1.两个文件
一个
Catkin
的软件包(
package
)必须要包括两个文件:
- package.xml: 包括了package的描述信息,例如name, description, version, maintainer(s), license
- CMakeLists.txt: 构建package所需的CMake文件,作用为:调用Catkin的函数/宏,解析 package.xml ,找到其他依赖的catkin软件包,将本软件包添加到环境变量
2.catkin编译的工作流程
- 1. 首先在工作空间 catkin_ws/src/ 下递归的查找其中每一个ROS的package。
- 2. package中会有 package.xml 和 CMakeLists.txt 文件,Catkin(CMake)编译系统依据 CMakeLists.txt 文件,从而生成 makefiles (放在 catkin_ws/build/ )。
- 3. 然后 make 刚刚生成的 makefiles 等文件,编译链接生成可执行文件(放在 catkin_ws/devel )。
也就是说,
Catkin就是将 cmake 与 make 指令做了一个封装从而完成整个编译过程的工具
。 catkin有比较突出的优点,主要是操作更加简单、一次配置,多次使用 、跨依赖项目编译
3.使用方式
要用
catkin
编译一个工程或软件包,只需要用
catkin_make
指令。一般当我们写完代码,执行一次 catkin_make
进行编译
,
调用系统自动完成编译和链接过程,构建生成目标文件。编译的一般性流程如下:
$ cd ~/catkin_ws #进入工作空间,catkin_make必须在工作空间下执行
$ catkin_make #开始编译
$ source ~/catkin_ws/devel/setup.bash #刷新坏境
编译之后,catkin_make运行后终端输出文件部分解析
#基本路径
Base path: /home/user/catkin_ws
Source space: /home/user/catkin_ws/src --SOURCE SPACE 源空间
Build space: /home/user/catkin_ws/build --BUILD SPACE 编译空间
Devel space: /home/user/catkin_ws/devel --DEVEL SPACE 开发空间
Install space: /home/user/catkin_ws/install --INSTALL SPACE 安装空间
注意: catkin编译之前需要回到工作空间目录, catkin_make 在其他路径下编译不会成功。编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误
4.catkin_make可选参数
用ninja或nmake方式编译
- --use-ninja :用ninja取代make
- --use-nmake:用nmake取'make --force-cmake 强制cmake,即使已经cmake过
指定源码位置,如果源码不在当前工作空间的src下
- --source my_src :my_src为指定的src路径(默认为'workspace_base/src')
- --build BUILD :build的路径 ,指定编译后build文件存放的位置(默认为'workspace_base/build')
仅编译指定的功能包
- catkin_make -DCATKIN_WHITELIST_PACKAGES="package1":编译指定的包,仅编译package1
编译所有包
- catkin_make -DCATKIN_WHITELIST_PACKAGES="":在双引号内不填代表编译所有包
使用install模式
- catkin_make install :使用install模式,编译后的可执行文件将存放在install目录中
5.install与devel
devel模式通常用于代码编写与调试阶段,若是希望上线使用,应使用install模式,且删除devel目录。在source时应source install目录下的setup文件。
使用install模式的原因是devel包含源码,而install模式为可执行代码,从而保护了代码安全
下一篇文章: [ROS]CmakeLists.txt 与 Package.xml