【ROS 官方教程网站】:http://wiki.ros.org/
【创建ROS工作空间】:http://wiki.ros.org/cn/ROS/Tutorials/InstallingandConfiguringROSEnvironment
如官网所说:
【注意】这里是必须的新建一个catkin_ws/src文件夹的,catkin_make命令会在src文件夹下生成一个总的CMakeLists.txt文件,如果没有设置这个文件夹,直接用catkin_make命令,会报如下错误:
会要求你必须得创建一个src文件。
创建完成后,执行catkin_make命令:
这时会创建一个catkin的工作空间。
创建的空间目录结构如下:
这些东西都是自动创建的。
在官网后面的教程中,会涉及到source ~/catkin_ws/devel/setup.bash
这个命令的将当前的工作空间设置在ROS的最顶层,用到这个命令的条件是:当devel中通过编译生成了新的可执行文件的时候,需要source一下,使得ros系统能够索引到这个可执行文件,进而可以通过系统安装它。
【补充】这里还要说一下ROS_PACKAGE_PATH
这个环境变量,这个变量在官网中也有所涉及
echo $ROS_PACKAGE_PATH
执行之这个命令会看到返回的包路径,一共有两个,以冒号(:)分割开
这两个路径下都是ros系统中涉及到的包,就是所谓的package。这样的话,知道这个package_path的话,就可以轻松使用后面的roscd、rosls等之类的命令了
cd /home/tiamo/catkin_ws/src
显示如下:
可以看到这个路径下有三个包:beginner_tutorials, foobar, test
cd /opt/ros/melodic/share
里面的包就数不胜数了,有了这两个路径,就可以查看路径下的包,就可以用roscd随意cd包了,非常方便。
【Catkin Workspaces】:http://wiki.ros.org/catkin/workspaces
这是官方给的文件系统目录,对应于每一个src下的package包,它的目录结构如图所示:
对文件系统进行分析:
工作空间包括三部分,如官方给的图所示,分为src、build、devel:
src源文件空间:这个文件夹放置各个功能包和一个用于这些功能包的CMake配置文件CMakeLists.txt。这里做一下说明,由于ROS中的源码采用catkin工具进行编译,而catkin工具又是基于cmake技术的,所以我们会在src源文件空间和各个功能包中都会见到一个文件CMakeLists.txt,这个文件就是起编译配置的作用,这个文件在使用cmake进行catkin project配置的时候会被使用。src源文件空间包含了各种包的源代码,在这里你可以编辑你想build的包的源代码,在源文件空间里面你可以放置很多个catkin包,注意,这个空间在你进行build,install的时候最好不要进行修改。
build编译空间:从最上面的图中可以看到官方说这个build space 文件夹是catkin_ignore的,说需要禁止catkin进入这个文件夹。这个文件夹放置CMake和catkin编译功能包时产生的缓存、配置、中间文件等。这个文件是cmake指令build src文件夹下catkin package的地方,这个文件夹其实没必要非得在工作空间catkin_ws目录下,也没有必要非得在src文件夹的外面,这一切只不过是推荐这样做。
devel开发空间:这个文件夹放置编译好的可执行程序,这些可执行程序是不需要安装就能直接运行的。一旦功能包源码编译和测试通过后,可以将这些编译好的可执行文件直接导出与其他开发人员分享。devel工作空间的位置被一个叫做CATKIN_DEVEL_PREFIX的变量控制着。官网上说它的默认路径其实是build文件夹下,但是这个默认操作,可能会使用户感到迷惑。所以推荐将devel放置在build文件夹的同级目录下。
其实官网还说了另外两个space,但是我觉得官网上说的可能过时了,因为确实,可执行文件不需要安装就可以执行,但是官网上说,还需要安装之类的,官网链接地址:http://wiki.ros.org/catkin/workspaces
其他的我个人作为一个补充:
对ROS的文件系统中的文件层级进行了解后,就可以按照官网的教程进行相应的命令学习了。
这里我也只是说几个需要注意的地方:
官网中主要提供了几个命令,
【ROS文件系统介绍】:http://wiki.ros.org/cn/ROS/Tutorials/NavigatingTheFilesystem
rospack find <package_name>
roscd [package_naem[/子目录]] # package_name 不写的话默认cd到devel文件夹下
rosls [package_name[/子目录]] # package_name 不写的话默认与ls功能相同
[]代表可选
<>代表必选
roscd log
如图:
可以看到roscore存储的日志到了~/.ros/log文件夹下,而roscd log cd到的log文件夹就是这个文件夹。
【创建ROS程序包】:http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage
【编译ROS程序包】:http://wiki.ros.org/cn/ROS/Tutorials/BuildingPackages
其实对于这个,感觉没啥可说的,官网上已经说的很详细了,主要说几点:
在一开始,官网说的:
这里补充两句,对于一个catkin程序包,可以在src目录下使用catkin_create_pkg命令来自动创建一个包
如上图所示,自动创建了好多东西。
其实如果想要这个包被rospack命令找到,只需要满足有一个package.xml文件就可以被rospack find命令找到了,与CMakeLists.txt有无无关。
当然,CMakeLists.txt也是极其重要的,package.xml的作用仅仅是标识一个包,可以让开发人员方便的了解到包的依赖、简介、版本之类的。真正的编译源文件还是靠CMakeLists.txt文件,这也是为啥在CMakeLists.txt文件里面可以看到好多与package.xml重复的内容了,在执行cmake指令的时候,是针对的CMakeLists.txt文件的,与package.xml文件无关。
至于在编译的时候,我只是提醒一句,编译是在~/catkin_ws
catkin工作空间下进行编译,同样是执行catkin_make
命令,编译会生成可执行文件,可执行文件在devel文件夹下的lib里面,消息和服务生成的cpp文件在devel文件夹下的include文件夹下。