浏览量: 174 次浏览

ROS文件系统

2019年10月14日 0 作者 Nie Hen

title: ROS文件系统
tags: Catkin,package介绍,涅痕, 2019-10-7–13:2


ROS 文件系统

Catkin

对于ROS这样大体量的平台来说,就采用的是CMake,并且ROS对CMake进行了扩展,于是便有了Catkin编译系统
CMake 是一个跨平台的安装工具,可以用最简单的语句来描述所有平台的安装,为软件跨平台创建而生。
enter description here
一个Catkin的软件包(package)必须要包括两个文件:
package.xml
CMakeLists.txt

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工作空间
输入下列指令,完成初始创建。

mkdir -p ~/catkin_ws/src  
cd ~/catkin_ws/
catkin_make #初始化工作空间

第一行代码直接创建了第二层级的文件夹src,这也是我们放ROS软件包的地方。第二行代码使得进程进入工作空间,然后再是catkin_make。

进行编译
用catkin编译一个工程或软件包,只需要用catkin_make指令,一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件.

cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
catkin_make #开始编译
source ~/catkin_ws/devel/setup.bash #刷新坏境

显示文件结构
在工作空间下用tree命令,。

cd ~/catkin_ws
sudo apt install tree
tree

通过tree命令可以看到catkin工作空间的结构,它包括了src、build、devel三个路径
src/: ROS的catkin软件包(源代码包)
build/: catkin(CMake)的缓存信息和中间文件
devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量
enter description here

平常主要用到的是src文件夹
我们写的ROS程序、网上下载的ROS源代码包都存放在这里。
在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包

package

package是catkin工作空间的基本单元,我们在ROS开发时,写好代码,然后catkin_make,系统就会完成所有编译构建的工作。

package结构
enter description here
Package可以分为二进制和源代码。
二进制包里面包括了已经编译完成,可以直接运行的程序,一般是官方给的程序,无法修改查看源代码 一般在/opt/ros/kinetic/中存放
源代码是指第三方开发的,根据需求自己下载。通常放在 ~/catkin_ws/src,需要通过make/cmake/caktin 进行编译使用,可以进行修改源代码对于编译工具软件包等有依赖问题。

package相关命令
rospack是对package管理的工具,命令的用法如下:
rostopic命令 | 作用
——— |————
rospack help | 显示rospack的用法
rospack list | 列出本机所有package
rospack depends [package] | 显示package的依赖包
rospack find [package] |定位某个package
rospack profile |刷新所有package的位置记录
以上命令如果package缺省,则默认为当前目录(如果当前目录包含package.xml)
roscd命令类似与Linux系统的cd,改进之处在于roscd可以直接cd到ROS的软件包。
rosls也可以视为Linux指令ls的改进版,可以直接lsROS软件包的内容。
rosdep是用于管理ROS package依赖项的命令行工具,用法如下
rostopic命令 | 作用
——— |————
roscd [pacakge] |cd到ROS package所在路径
rosls命令 | 作用
rosls [pacakge] | 列出pacakge下的文件
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文件指定)。

package.xml

包括了package的描述信息,name, description, version, maintainer(s), license,opt. authors, url’s, dependencies, plugins, etc…
实际上rospack find、rosdep等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的package.xml文件
包含的标签有
enter description here
run_depend 也是运行依赖 不过是上一版本的标签,也能共用。
示例 小海龟的package.xml 部分文件
enter description here
可以使用 rospack find turtlesim 找到包的位置 或者 roscd turtlesim 直接找到该目录下

CMakeLists.txt: 构建package所需的CMake文件,调用Catkin的函数/宏,解析package.xml,找到其他依赖的catkin软件包,将本软件包添加到环境变量。

总体结构如下
enter description here
对于CMake的语法可以参考 《CMake实践》
示例 :
enter description here
这是小海龟的Cmakelists.txt 文件的一部分,具体可以到
/opt/ros/kinetic/share/turtlesim 中查看

launch文件

一般launch文件中会指定要启动哪些package下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。 launch文件通常放在软件包的launch/路径中中。

ROS为我们提供了一个命令能一次性启动master和多个node。该命令是:
$ roslaunch pkg_name file_name.launch
roslaunch就像是一个启动工具,能够一次性把多个节点按照我们预先的配置(写入launch文件中)启动起来

launch文件同样也遵循着xml格式规范,是一种标签文本,它的格式包括以下标签:
enter description here
参考链接:

示例
launch文件的写法和格式看起来内容比较复杂,我们先来介绍一个最简单的例子如下:
enter description here
这是官网给出的一个最小的例子,文本中的信息是,它启动了一个单独的节点talker,该节点是包rospy_tutorials软件包中的节点。
但是实际比这个更为复杂

Metapackage

功能包集,就是将多个功能接近,相互依赖的软件包放到一个集合中去。
ros中常用的Metapackage有

Metapacakge名称 描述
navigation 导航相关的功能包集
moveit 运动规划相关的(主要是机械臂)功能包集
image_pipeline 图像获取、处理相关的功能包集
vision_opencv ROS与OpenCV交互的功能包集
turtlebot Turtlebot机器人相关的功能包集
pr2_robot pr2机器人驱动功能包集

metapacakge中的 package.xml文件,CMakeLists.txt 文件 和普通pacakge不同点是:
CMakeLists.txt:加入了catkin_metapackage()宏,指定本软件包为一个metapacakge。
package.xml:标签将所有软件包列为依赖项,标签中添加标签声明。
metapacakge在我们实际开发一个大工程时可能有用