ROS系列实践1.2-工作空间架构理解

ROS系列实践

第一部分:机器人环境感知与路径规划( Turtlebot 机器人)

(二)工作空间架构理解

上一节中我们安装好了需要用的基本软件并做了测试。本节我们来了解所谓的ROS机器人操作系统是如何工作的。

注:上一节中我们更多的是解决安装测试过程中的工程问题,这一节开始我们需要实际理解这一套架构的工作原理,这有助于我们今后利用它进行我们需要的开发。这部分的学习我参照的是中科院软件所在中国大学生MOOC上的视频教程,讲得非常详细清楚,强烈推荐。如果想在阅读本篇的时候有更好的体验,建议上B站直接搜索ROS,找到中科院软件所的视频教程看一看。同时,本篇还会引用部分该教程的图示,如有侵权请联系我删除。

所谓的ROS工程结构指的是我们开发过程中的工程文件在磁盘中是如何组织的,实际上相当于操作系统中的文件系统,简单来说就是文件夹和文件是如何摆放的。只有弄清了我们运行的代码,或者要写的代码是放在哪里,如何编译,如何交互的,我们才能更好地了解ROS。常见的ROS开发工程结构如下图:

在这里插入图片描述

1.2.1 顶层文件夹catkin workspace与catkin_make

最顶层的文件夹叫做catkin workspace,这个文件夹在电脑里可以是任何名字,一般把它放在根目录下。一个电脑可以有多个catkin workspace。在catkin workspace中,ROS按照CMake的扩展规则编译整套工程文件并生成可执行文件。在catkin workspace文件夹之下一般有三个文件夹,src、build和devel。src存放的是工程源码,是我们开发的时候需要编辑的文件,是我们关心的主角;build中存放的是编译过程中的中间文件或缓存信息,由ROS的catkin编译系统来自动生成,无需我们染指;devel是由编译器生成的可执行文件,也就是二进制文件或脚本文件,也无需我们染指。

(注:build文件夹虽然是自动生成的无需我们染指,但在很多情况下我们可以通过删除build文件夹中的内容再重新编译来解决一些代码更新问题)

在这里插入图片描述
我们通过以下的操作来建立catkin workspace顶层文件夹并进入:

mkdir -p catkin_ws/src
cd catkin_ws

这里我们默认将catkin workspace文件夹命名为catkin_ws,并在根目录下建立。可以看到我们只需要建立其三个子文件夹之一的src就可以了,其他两个会由以下的操作自动生成:

catkin_make

这一操作是对catkin workspace的初始化,同时对src中的源码进行编译。**注意,catkin_make指令只能在catkin workspace顶层文件夹之下运行。**在这一过程中终端会显示大量的编译信息,在src中有很多代码的时候这个过程会比较慢,当src中的代码有问题的时候过程还会报错(报错一般会用红色显示出来,并立即停止编译)。在这一过程结束后,我们会发现catkin_ws文件夹之下应有的三个文件夹src、bulid和devel都齐了,只不过这时候src中只有一个cmakelist.txt,没有实际的工程文件。

此时我们要注意一点,如果我们想让这个catkin workspace中生成的可执行文件能够在ROS工程中发挥作用,也就是我们使用命令行可以直接找到并运行其中的文件,我们必须能让ROS系统找到他们。所以我们需要如下的操作:

source ~/catkin_ws/devel/setup.bash

devel中的setup.bash这一文件,可以理解为是其所在catkin workspace的初始化文件,让其中的可执行文件能被ROS找到。然而命令行source这一操作的生命周期仅仅在这一个终端,我们希望每打开一个终端,系统都能帮我们自动完成source的操作,那么可以使用如下的命令:

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

将source的操作写入~/.bashrc中,这样每一次打开终端,系统都会自动帮我们完成source的操作。

此后我们可以记住,在每一次改变src中的内容之后(自己编写代码或克隆了其他地方的代码),都首先进行catkin_make编译它,编译成功后source操作,或关闭这个终端重新开启让系统帮你完成source操作。

1.2.2 源码文件夹package

package是ROS软件的基本组织单元,代码放在catkin workspace之下的src文件夹下,catkin_make的时候是以package为单位,在src文件夹递归地查找package来编译。package中可以定义节点,并且可以定义多个节点,还可以通过launch文件来定义同时启动多个节点。典型的package结构有以下这么几种:

1.2.2.1 最精简的结构

在这里插入图片描述最简单的package只有CMakeList.txt和package.xml两个文件,同时任何package都至少要包含这两个文件才可以被catkin编译系统识别。前者顾名思义是cmake编译的规则文件;后者是xml文件,定义了包的基本信息,依赖项等。精通cmake和xml自然是好事,但在开发的时候我们大可以选择改别人的模板,理解即可。

1.2.2.2 c与c++代码或python代码

在这里插入图片描述
我们在CMakeList和xml文件的基础上为package填充实实在在的内容,发挥作用的就是代码文件或脚本文件。例如我们的路径规划代码、传回图像的分析代码等等,可以用python或c与c++文件实现。

1.2.2.3 ROS自定义信息或launch与配置文件

在这里插入图片描述
在后面的笔记中我们会学习ROS特有的通信机制:topic->message、service、action等等。这些通信机制支持我们自定义信息的传递格式,分别以.msg、.srv和.action的文件来存储和使用。

在这里插入图片描述
前文提到launch文件支持我们在一个package里面一次启动多个节点,这些节点启动的定义通过launch文件来实现。而.yaml文件可以用来设置节点启动的配置,成为配置文件。

以上提到的就是package里所有常见的文件类型和结构了。

下面我们用指令来创建自己的package,命名为my_pkg:

cd ~/catkin_ws/src
catkin_create_pkg my_pkg

现在我们打开src,会发现系统为我们创建了my_pkg这一文件夹,其中包含了CMakeList和xml文件。catkin_create_pkg指令还可以指定参数来在初始创建的时候设定依赖包。例如我们希望在自己的包里同时使用python和c++来编写代码,就需要添加rospy和roscpp两个依赖包:

catkin_create_pkg my_pkg_1 rospy roscpp

在添加package之后别忘了进行catkin_make和source的操作来让自定义的package生效。下面也记录一些常用的package指令方便查阅:

在这里插入图片描述作为初学者,我们大部分时候还是在下载和分析别人的包,因此在catkin_make的阶段会遇到一系列报错,我们读懂报错信息逐个解决即可,这个过程需要平心静气,上网查阅资料,解决问题的过程也是熟悉ROS系统一个很好的方式。

至此,我们了解了ROS的工程文件架构、各个文件的作用和其常见的操作。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值