ROS结构和概念.ppt
《ROS结构和概念.ppt》由会员分享,可在线阅读,更多相关《ROS结构和概念.ppt(126页珍藏版)》请在三一办公上搜索。
1、第2章 ROS结构和概念,本章各小节目录,理解ROS文件系统级理解ROS计算图形级理解ROS社区级ROS练习教程总结,一旦你安装了ROS,你肯定会想:“OK,我已经安装了它,现在呢?”在本章,你将学习ROS的结构和它的组成部分。更多的是,你将开始创建节点和包然后使用ROS运行Turtlesim的例子。ROS结构已经设计好了,然后分成三个小节或概念级别:文件系统级计算图形级社区级第一级是文件系统级。在本级,使用了一系列的概念来解释ROS是如何基本构造的,文件夹结构以及它正常工作所需的最少文件数量。第二级是计算图形级,其中进行进程和系统之间的,通信。在此部分,我们将看到所有的关于ROS设置系统、处
2、理所有的进程、跟不止一个电脑通信等等的概念和系统。第三个级别是社区级,其中有某些与其他开发者用来共享知识、算法和代码的工具和概念。这个级别是重要的,因为ROS由于社区的支持而增长迅速。,理解ROS文件系统级,当你开始使用ROS或者开发ROS项目,你将看到虽然这个概念听起来很怪一开始,但是随着时间你会越来越熟悉它。,类似于操作系统,一个ROS程序分成多个文件夹,而且这些文件夹有描述它们的功能的文件:包:包组成了ROS的原子级。一个包有最小的结构和内容来在ROS中创建一个程序。它可能有ROS运行时过程(节点),配置文件等等。包元文件:包元文件提供了关于一个包、许可、依赖、编译标志等等的信息。一个包
3、的元信息是由一个叫package.xml的文件来管理的。综合包:当你想要在一个组中聚合多个包时,你将使用综合元包。在ROS Fuerte中,这种订阅包的形式叫做栈。为保持ROS的简洁性,栈被移除了,而现在,元综合包组成了这个功能。在ROS中,有很多的元综合包;其中的一个就是导航栈。综合包元信息:综合元包元信息(package.xml)是与,一般的包相似的,但是在XML中带有一个输出标签。它在它的结构上也有某些限制。消息(msg)类型:一个消息就是一个进程发送给其它进程的信息。ROS有很多标准类型的消息。消息描述是存储在:my_package/msg/MyMessageType.msg。服务(s
4、rv)类型:服务描述,存储在my_package/srv/MyServiceType.srv,定义在ROS中由每个进程提供的服务的请求和回复数据结构。在下面的截图中,你可以看到turtlesim包的内容。你看到的是一系列的代码、图像、启动文件、服务和消息的文件和文件夹。记住截图为了显示短一点的文件列表被编辑过了,真正的包有更多的文件和文件夹。,工作空间,基本上,工作空间就是一个放置我们的包、编辑源文件或者编译包的文件夹。当你同时想要编译不同的包时这是很有用的,而且这是让我们所有的开发都本地化的一个好地方。一个典型的工作空间以如下的截图显示。每一个文件夹都是不同的空间扮演着不同的角色。,源空间:
5、在源空间(src文件夹)中,你放置包、工程、克隆包,等等。其中最重要的一个文件是CMakeLists.txt。src文件夹有这个文件因为这是当你在工作空间中配置包时由CMake生成的。这个文件是由catkin_init_workspace命令生成的。Build(编译)空间:在build文件夹中,CMake和catkin为我们的包和工程保存缓冲信息、配置和其他中间文件。Development(开发)空间:devel文件夹是用来保存编译的程序。这是用来测试没有安装那一步的程序的。一旦程序测试过了,你可以安装或者导出包,从而与其他的开发者分享。对于使用catkin建立包你有两个选项。第一个是使用标准
6、的CMake工作流。使用它,你可以一次编译一个包,如下面的命令所示:$cmake packageToBuild/$make,如果你想编译所有的包,你可以使用catkin_make命令行,如下面的命令所示:$cd workspace$catkin_make两个命令在ROS中配置的build空间目录中生成执行文件。另一个关于ROS的有趣的特征是覆盖。当你使用一个ROS的包时,例如Turtlesim,你可以使用已安装版本做,或者你可以下载源文件然后编译从而使用你的修改版本。ROS允许你使用你的版本而不使用已安装版本。如果你是升级已安装版本的话那么这是非常有用的。此时此刻,也许你不理解这个的实用性,但
7、是在下一章,我们将使用这个特点来创建我们自己的插件。,包,通常,当我们讨论包时,我们指的是一个典型的文件和文件夹结构。这个结构看起来如下所示:include/package_name/:该路径包含你需要的库的文件头。scripts/:这些是可执行脚本,可以是Bash、Python或者任何其他脚本语言写成。src/:这是你的程序的源文件在的位置。你可以为节点和节点集创建一个文件夹,或者自己组织。srv/:这个表示服务(srv)类型。CMakeLists.txt:这是CMake编译文件。package.xml:这是一个包的元文件。,要创建、修改或者与包工作,ROS给我们帮助的工具,其中某些如下:r
8、ospack:这个命令是用来获取包的信息或者在系统中查找包。catkin_create_pkg:当你想创建一个新的包时使用该命令。catkin_make:该命令用来编译一个工作空间。rosdep:该命令用来安装一个包的系统依赖。rqt_dep:该命令用来以图的形式查看包的依赖。如果你想以图的方式查看包的依赖,你将会在rqt中找到一个叫package graph的插件。选择一个包然后查看依赖。要想在包和它们的文件夹和文件之间移动,ROS给我们一个非常有用的包叫rosbash,它提供非常近似于Linux的命令。下面是几个例子:,roscd:该命令帮助我们更改目录。这跟我们Linux中的cd命令相似
9、。rosed:该命令用来编辑一个文件。roscp:该命令用来从一个包中复制一个文件。rosd:该命令列出一个包的目录。rosls:该命令列出一个包的文件。这跟Linux中的ls命令相似。package.xml文件必须在一个包中,而且它用来指定该包的信息。如果你在一个文件夹里发现该文件,那么可能该文件夹是一个包或者综合包。如果你打开package.xml文件,你将会看到关于该包的名字、依赖等等的信息。所有这些都是用来使这些包的安装和分发容易。用在package.xml文件的两个典型标签是,和。标签表示在安装当前包之前所必须安装的包。这是因为新的包可能使用另一个包的某个功能。标签表示要运行该包的代
10、码所必要的包。下面的截图是一个package.xml文件的例子:,综合包,正如早先所展示的,综合包是特殊的包,内部只有一个文件。这个文件就是package.xml。该包不含有其他的文件,例如代码、includes等等。综合包是用来指向其他的包的,通常是以特征功能的方式聚合在一起的,例如,导航栈,ros_tutorials等等。你可以使用某种迁移的规则从ROS Fuerte到Hydro转换你的栈和包。这些规则可以在以下找到:。在下面的截图中,你可以看到在ros_tutorials综合包的package.xml的内容。你可以看到标签和标签。这些在包元文件中是必要的,如,下图所示。如果你想定位ros
11、_tutorials综合包,你可以使用如下的命令:$rosstack find ros_tutorials输出是一个路径,例如/opt/ros/hydro/share/ros_tutorials。要看内部代码,你可以使用如下的命令行:,$vim/opt/ros/hydro/share/ros_tutorials/package.xml记住Hydro使用综合包而不是栈,但是rosstack find命令行可以用来寻找综合包。,消息,ROS使用一种简洁的消息描述语言来描述ROS节点发布的数据值。使用这种描述,ROS可以生成几种不同编程语言下的这些消息类型的相应源代码。ROS有很多预定义的消息,但是
12、如果你开发一种新的消息,它将在你的包的msg/文件夹。在那个文件夹内,包含.msg文件,文件里面定义了消息。一个消息必须包含两个主要的部分:域和常数。域定义了在消息里传递的数据类型,例如int32,float32和string,或者你早先创建的新类型,例如type1和type2。常数则定义了这些域的名字。,一个msg文件的例子如下所示:int32 idfloat32 velstring name在ROS中,你可以发现很多可以用在消息里的标准类型,如下表所示:,在ROS中一个特殊的类型叫头类型。它用来添加时间、框架等等。它允许你给消息编上数字,查看谁发送的,以及更多对用户来说透明但ROS正在处理
13、的函数。头类型包含如下的域:uint32 seqtime stampstring frame_id你可以使用如下的命令查看结构:$rosmsg show std_msgs/Header多亏了头类型,有可能记录机器人的时间戳和帧,正如我们将在将到来的章节中所看到的。,在ROS中,存在处理消息的工具。rosmsg工具打印出消息的定义的信息,并能找到使用一个消息类型的源文件。在到来的部分,我们将看到如何使用正确的工具来创建消息。,服务,ROS使用了一种简洁的服务描述语言来描述ROS服务类型。它直接建立在ROS msg格式上,从而使节点之间的通信的请求/回复功能成为可能。服务描述存储在一个包的srv/
14、子目录的.srv文件。要调用一个服务,你需要使用包名,还有服务名;例如,你使用sample_package1/sample1将指的是sample_package1/srv/sample1.srv文件。有工具与服务进行操作。rossrv工具可以打印服务描述和包含.srv文件的包,并且查找使用一个服务类型的源文件。如果你想创建一个服务,ROS通过服务生成器能帮助你。,这些工具从一个服务的最初描述生成代码。你只需要添加一行gensrv()代码到你的CMakeLists.txt文件即可。在接下来的部分,你将学习如何创建你自己的服务。,理解ROS计算图形级,ROS创建了一个所有进程相互连接的网络。系统里
15、的任何节点都可以连接到该网络,并与其他节点相联系,查看他们发送的信息,并将数据传递给网络。,本级别的基本概念有节点、主服务器、参数服务器、消息、服务、主题和包,这些都以不同的方式向图提供数据,并在下面进行解释:节点:节点是进行计算的过程。如果你想有一个过程与其他的节点进行交互,那么你需要在该进程创建一个节点连接到ROS网络。你将看到最好创建多个节点然后每个节点处理一个功能,而不要在系统里创建一个大的节点处理所有事情。节点是以一个ROS客户端类库编写的,例如,roscpp或者rospy。管理器:管理器提供名字的注册,并且为剩余的节点查询服务。它还在节点间设立连接。如果你在系统里没有这个的话,你将
16、不能与节点、服务、消息等进行交流。在一个分布式系统里,你在一个计算机有管理器,然后你可以在这个或者其他的计算机执行节点。参数服务器:参数服务器给我们在中心位置使用键来,存储数据可能性。有了这个参数,那么当它正在运行时配置节点或者修改工作节点成为可能。消息:节点之间通过消息进行交流。消息包含发送消息给其他节点的数据。ROS有很多类型的消息,你还可以使用标准消息开发你自己的消息类型。主题:每个消息必须有一个被ROS网络跟踪的名字。当一个节点发送数据时,我们就说该节点正在发布一个主题。节点可以仅仅通过订阅到主题就接收其他的节点的主题。一个节点可以订阅到一个主题,然后没有必要发布该主题的节点一定存在。
17、这允许我们将生产与消费分开。主题的名字保持独一无二从而避免主题间相同名字的问题和困扰是很重要的。服务:当你发布主题时,你是在以一种多对多的方式发送数据的。但是当你需要从一个节点获取请求和回,答时,你不能使用主题来进行。服务给我们用节点交互的可能。而且,服务必须有一个独一无二的名字。当一个节点有一个服务时,所有的节点都可以与它通信,这多亏了ROS客户端类库。记录袋:袋子是一种保存并且回放ROS消息数据的形式。袋子是一种重要的存储数据的结构,例如传感器数据,可能很难收集但是对于开发和测试算法是很有必要的。当与复杂的机器人工作时,你将经常使用记录袋。在接下来的图中,你可以看到该级别的图形表示。它展示
18、了一个真实条件下的真实机器人工作的。在图中,你会看到节点和主题,其中节点订阅到主题,等等。该图并没有展现消息、记录袋、参数服务器和服务。使用其他工具看到它们的图形显示是必要的。用来创,建图形的工具叫rqt_graph;你将在“第3章:可视化和调试工具”了解更多关于它。这些概念在ros_comm存储仓库中实现。,节点和节点集,节点是可以使用主题、服务或者参数服务器与其他进程交流的执行程序。在ROS中使用节点可以为我们提供容错能力,并把代码与功能分离开来,使系统更简单。ROS有另一种类型的节点叫做节点集。这些特殊的节点被设计用来在一个过程运行多个节点。每个节点集是一个进程(光处理)。用这种方式,我
19、们避免了使用ROS网络,但是允许与其他节点交流。用这种方法,节点可以交流的更加有效率,而不用加载网络。节点集对摄像头系统和3D传感器尤其有用,因为数据传输的体积非常大。节点在系统中必须具有唯一的名称。此名称用来允许节,点与另一个节点进行通信而没有歧义。一个节点可以使用不同的类库来书写,比如roscpp和rospy;roscpp是为C+的,rospy是为Python。贯穿本书,我们使用的是roscpp。ROS有处理节点的工具,然后给我们关于节点的信息,比如rosnode。rosnode是一个命令行工具,可以用来展示关于节点的信息,例如列出当前正在运行的节点。支持的命令如下:rosnode inf
20、o NODE:这将打印关于节点的信息。rosnode kill NODE:这将杀死一个正在运行的节点或者发送一个给定的信号。rosnode list:这将列出活着的节点。rosnode machine hostname:这将列出运行在一个给定的机器上的节点,或者列出机器。rosnode ping NODE:这将测试给定的节点的连通性。,rosnode cleanup:这将清除不可触达的节点的注册信息。在接下来的部分,你将根据实例学习如何使用这些命令。ROS节点的一个强大特性是在启动节点时更改参数的可能性。此功能使我们能够更改节点名、主题名称和参数名称。我们使用这个来重配置节点而无需重编译代码,
21、这样我们可以在不同的场景使用节点。更改一个主题的名字的实例如下:$rosrun book_tutorials tutorialX topic1:=/level1/topic1这个命令将更改主题名称topic1为/level1/topic1。我确信此刻你不明白这一点,但是你会在接下来的章节中发现它的实用性。要更改节点中的参数,你可以做一些与修改主题名相似的操作。对于此,你只需要给参数名称添加一个下划(_)的;例如:,$rosrun book_tutorials tutorialX _param:=9.0前述命令将设置param为浮点数9.0。请记住,你不能使用系统保留的名字。它们如下:_name
22、:这是一个对于结点名称的特殊的保留关键字。_log:这是一个指定结点的记录文件应该书写的位置保留关键字。_ip和_ hostname:它们是ROS_IP和ROS_HOSTNAME的代用品。_master:这是ROS_MASTER_URI的代用品。_ns:这是ROS_NAMESPACE的代用品。,主题,主题是由节点使用的用来传递数据的巴士。主题可以在没有节点之间直接连接的情况下传输,这意味着数据的产生和消耗是解耦的。一个主题可以有不同的订阅方,也可以有不同的发布者,但是你需要小心在不同节点间发布相同主题因为它可能创建冲突。每一个主题都被用于由ROS消息类型发布,而节点只能接收匹配类型的消息。只有
23、当消息具有相同的消息类型时,节点才能订阅该主题。ROS中的主题可以使用TCP/IP和UDP协议进行传递。基于TCP/IP的传输以TCPROS命名,使用永久的TCP/IP连接。这是在ROS里默认的传输。,基于UDP的传输以UDPROS命名,而且是低延迟,有损传输的。所以,它最适合用于遥操作这样的任务。ROS有一个用于主题的工具叫rostopic。这是一个命令行工具给我们关于该主题的信息或者直接发布数据到网络上。此工具有如下的参数:rostopic bw/topic:它展示主题使用的带宽。rostopic echo/topic:它打印消息到屏幕。rostopic find message_type
24、:它通过类型寻找主题。rostopic hz/topic:它展示主题的发布频率。rostopic info/topic:它将打印活动主题、发布的以及订阅的主题以及服务的信息。rostopic list:它打印活动主题的信息。rostopic pub/topic type args:它发布数据到主题。它允许我们创建并发布数据在我们想要的任何主题,直接通过命令行。rostopic type/topic:它打印主题类型,是它发布消息的类型。,服务,当你需要与结点通信并且接收一个回复时,你不能使用主题;你需要用服务来完成。服务是由用户开发的,而且标准的服务对结点来说不存在。消息的源代码相关文件存储在s
25、rv文件夹。与主题类似的,服务有一个相关的服务类型,即.srv文件的包资源名。就像其他的ROS的文件系统为基础的类型类似,服务的类型是包名和.srv文件的名称。例如,chapter2_tutorials/srv/chapter2_srv1.srv文件有一个chapter2_tutorials/chapter2_srv1的服务类型。ROS有两个与服务相关的命令行工具:rossrv和rosservice。使用rossrv,我们可以看到关于服务的数据结构信息,,它具有与rosmsg相同的用途。使用rosservice,我们可以列出以及查询服务。支持的命令如下:rosservice call/serv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ROS 结构 概念
链接地址:https://www.31ppt.com/p-5446861.html