1. 什么是ROS的工作空间
使用ROS实现机器人开发的主要手段是写代码,这些代码文件存放的空间就是工作空间。
工作空间(workspace)是一个用于存放工程开发相关文件的文件夹。目前,ROS默认使用的是Catkin编译系统(在CMake的基础上拓展得到的,将 cmake 与 make 指令做了一个封装从而完成整个编译过程)。在Catkin编译系统下,一个典型的工作空间一般包含四个目录空间:src
、devel
、build
、install
,结构如下:
workspace_folder/ |—— src/ |—— CMakeLists.txt |—— package_1/ |—— CMakeLists.txt |—— package.xml |—— ...... |—— package_2/ |—— CMakeLists.txt |—— package.xml |—— ...... |—— devel/ |—— setup.bash |—— ...... |—— build/ |—— ...... |—— install/
src
: 代码空间(Source Space),最常用、最重要的文件夹,用来存储所有ROS功能包(package)的源文件。build
: 编译空间(Build Space),由catkin_make
命令自动生成,用来存储工作空间编译过程中产生的缓存信息和中间文件。devel
: 开发空间(Development Space),由catkin_make
命令自动生成,用来放置编译生成的可执行文件。install
: 安装空间(Install Space),不是必需的,很多工作空间没有该文件夹。编译成功后,可以使用make install
命令将可执行文件安装到该空间中,运行该空间中的环境变量脚本,即可在终端中运行这些可执行文件。
Catkin的软件包(package)必须要包括两个文件:
package.xml: 包括了package的描述信息
name, description, version, maintainer(s), license
opt. authors, url's, dependencies, plugins, etc...
CMakeLists.txt: 构建package所需的CMake文件
调用Catkin的函数/宏
解析package.xml
找到其他依赖的catkin软件包
将本软件包添加到环境变量
catkin编译的工作流程如下:
首先在工作空间
catkin_ws/src/
下递归的查找其中每一个ROS的package。package中会有
package.xml
和CMakeLists.txt
文件,Catkin(CMake)编译系统依据CMakeLists.txt
文件,从而生成makefiles
(放在catkin_ws/build/
)。然后
make
刚刚生成的makefiles
等文件,编译链接生成可执行文件(放在catkin_ws/devel
)。
也就是说,Catkin就是将cmake
与make
指令做了一个封装从而完成整个编译过程的工具。catkin有比较突出的优点,主要是:
操作更加简单
一次配置,多次使用
跨依赖项目编译
工作空间并不是整个ROS开发所在的空间,不同的项目可以有各自的工作空间,只需要配置各自的环境变量即可(source devel/setup.bash
)。
2. 什么是ROS的功能包
功能包(package)是ROS中的基本单元,包含ROS节点、库、配置文件等。
一个功能包下常见的文件、路径有:
├── CMakeLists.txt #package的编译规则(必须) ├── package.xml #package的描述信息(必须) ├── src/ #源代码文件 ├── include/ #C++头文件 ├── scripts/ #可执行脚本 ├── msg/ #自定义消息 ├── srv/ #自定义服务 ├── models/ #3D模型文件 ├── urdf/ #urdf文件 ├── launch/ #launch文件
config
:功能包的配置文件,用户创建。include
:需要用到的头文件。scripts
:可以直接运行的Python脚本。src
:需要编译的C++代码。launch
:所有启动文件。msg
:自定义的消息类型。srv
:自定义的服务类型。action
:自定义的动作指令。CMakeLists.txt
:Catkin编译器编译功能包的规则。package.xml
: 功能包清单,可得到该package的名称、版本号、信息描述、作者信息和许可信息等。更重要的,<build_depend> ... </build_depend>
标签定义了代码编译所依赖的其它功能包,<exec_depend> ... </exec_depend>
标签定义了可执行程序运行时所依赖的其它功能包。
上面的这些文件夹并不是每一个都要有,根据需要创建即可,比如不需要运行python文件,就不用scripts
文件夹。此外,也可以自定义其他的文件夹。
ROS针对功能包的常用命令如下:
catkin_create_pkg # 创建功能包 catkin_make # 编译工作空间中的功能包 rospack # 获取功能包的信息 rosdep # 自动安装功能包依赖的其它包 roscd # 功能包目录跳转 roscp # 拷贝功能包中的文件 rosed # 编辑功能包中的文件 rosrun # 运行功能包中的可执行文件 roslaunch # 运行启动文件
rospack
rospack是对package管理的工具,命令的用法如下:
rostopic命令 | 作用 |
---|---|
rospack help | 显示rospack的用法 |
rospack list | 列出本机所有package |
rospack depends [package] | 显示package的依赖包 |
rospack find [package] | 定位某个package |
rospack profile | 刷新所有package的位置记录 |
以上命令如果package缺省,则默认为当前目录(如果当前目录包含package.xml)
roscd
roscd
命令类似与Linux系统的cd
,改进之处在于roscd
可以直接cd
到ROS的软件包。
rostopic命令 | 作用 |
---|---|
roscd [pacakge] | cd到ROS package所在路径 |
rosls
rosls
也可以视为Linux指令ls
的改进版,可以直接ls
ROS软件包的内容。
rosls命令 | 作用 |
---|---|
rosls [pacakge] | 列出pacakge下的文件 |
rosdep
rosdep
是用于管理ROS package依赖项的命令行工具,用法如下:
rosdep命令 | 作用 |
---|---|
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文件指定)。
参考: