第2章 ROS结构和概念_第1页
第2章 ROS结构和概念_第2页
第2章 ROS结构和概念_第3页
第2章 ROS结构和概念_第4页
第2章 ROS结构和概念_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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。 服务(

4、srv)类型:服务描述,存储在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给我们帮助的工具,其中某些

8、如下: rospack:这个命令是用来获取包的信息或者在系统中查找包。 catkin_create_pkg:当你想创建一个新的包时使用该命令。 catkin_make:该命令用来编译一个工作空间。 rosdep:该命令用来安装一个包的系统依赖。 rqt_dep:该命令用来以图的形式查看包的依赖。如果你想以图的方式查看包的依赖,你将会在rqt中找到一个叫package graph的插件。选择一个包然后查看依赖。要想在包和它们的文件夹和文件之间移动,ROS给我们一个非常有用的包叫rosbash,它提供非常近似于Linux的命令。下面是几个例子: roscd:该命令帮助我们更改目录。这跟我们Linu

9、x中的cd命令相似。 rosed:该命令用来编辑一个文件。 roscp:该命令用来从一个包中复制一个文件。 rosd:该命令列出一个包的目录。 rosls:该命令列出一个包的文件。这跟Linux中的ls命令相似。package.xml文件必须在一个包中,而且它用来指定该包的信息。如果你在一个文件夹里发现该文件,那么可能该文件夹是一个包或者综合包。如果你打开package.xml文件,你将会看到关于该包的名字、依赖等等的信息。所有这些都是用来使这些包的安装和分发容易。用在package.xml文件的两个典型标签是和。标签表示在安装当前包之前所必须安装的包。这是因为新的包可能使用另一个包的某个功能

10、。标签表示要运行该包的代码所必要的包。下面的截图是一个package.xml文件的例子:综合包正如早先所展示的,综合包是特殊的包,内部只有一个文件。这个文件就是package.xml。该包不含有其他的文件,例如代码、includes等等。综合包是用来指向其他的包的,通常是以特征功能的方式聚合在一起的,例如,导航栈,ros_tutorials等等。你可以使用某种迁移的规则从ROS Fuerte到Hydro转换你的栈和包。这些规则可以在以下找到:/catkin/migrating_from_rosbuild。在下面的截图中,你可以看到在ros_tutorials

11、综合包的package.xml的内容。你可以看到标签和标签。这些在包元文件中是必要的,如下图所示。如果你想定位ros_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节点发布

12、的数据值。使用这种描述,ROS可以生成几种不同编程语言下的这些消息类型的相应源代码。ROS有很多预定义的消息,但是如果你开发一种新的消息,它将在你的包的msg/文件夹。在那个文件夹内,包含.msg文件,文件里面定义了消息。一个消息必须包含两个主要的部分:域和常数。域定义了在消息里传递的数据类型,例如int32,float32和string,或者你早先创建的新类型,例如type1和type2。常数则定义了这些域的名字。一个msg文件的例子如下所示:int32 idfloat32 velstring name在ROS中,你可以发现很多可以用在消息里的标准类型,如下表所示:在ROS中一个特殊的类型叫

13、头类型。它用来添加时间、框架等等。它允许你给消息编上数字,查看谁发送的,以及更多对用户来说透明但ROS正在处理的函数。头类型包含如下的域:uint32 seqtime stampstring frame_id你可以使用如下的命令查看结构:$rosmsg show std_msgs/Header多亏了头类型,有可能记录机器人的时间戳和帧,正如我们将在将到来的章节中所看到的。在ROS中,存在处理消息的工具。rosmsg工具打印出消息的定义的信息,并能找到使用一个消息类型的源文件。在到来的部分,我们将看到如何使用正确的工具来创建消息。服务ROS使用了一种简洁的服务描述语言来描述ROS服务类型。它直接

14、建立在ROS msg格式上,从而使节点之间的通信的请求/回复功能成为可能。服务描述存储在一个包的srv/子目录的.srv文件。要调用一个服务,你需要使用包名,还有服务名;例如,你使用sample_package1/sample1将指的是sample_package1/srv/sample1.srv文件。有工具与服务进行操作。rossrv工具可以打印服务描述和包含.srv文件的包,并且查找使用一个服务类型的源文件。如果你想创建一个服务,ROS通过服务生成器能帮助你。这些工具从一个服务的最初描述生成代码。你只需要添加一行gensrv()代码到你的CMakeLists.txt文件即可。在接下来的部分

15、,你将学习如何创建你自己的服务。理解ROS计算图形级ROS创建了一个所有进程相互连接的网络。系统里的任何节点都可以连接到该网络,并与其他节点相联系,查看他们发送的信息,并将数据传递给网络。本级别的基本概念有节点、主服务器、参数服务器、消息、服务、主题和包,这些都以不同的方式向图提供数据,并在下面进行解释: 节点:节点是进行计算的过程。如果你想有一个过程与其他的节点进行交互,那么你需要在该进程创建一个节点连接到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是一个命令行工

20、具,可以用来展示关于节点的信息,例如列出当前正在运行的节点。支持的命令如下:rosnode info 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

22、前述命令将设置param为浮点数9.0。请记住,你不能使用系统保留的名字。它们如下: _name: 这是一个对于结点名称的特殊的保留关键字。 _log:这是一个指定结点的记录文件应该书写的位置保留关键字。 _ip和_ hostname:它们是ROS_IP和ROS_HOSTNAME的代用品。 _master:这是ROS_MASTER_URI的代用品。 _ns: 这是ROS_NAMESPACE的代用品。主题主题是由节点使用的用来传递数据的巴士。主题可以在没有节点之间直接连接的情况下传输,这意味着数据的产生和消耗是解耦的。一个主题可以有不同的订阅方,也可以有不同的发布者,但是你需要小心在不同节点间发

23、布相同主题因为它可能创建冲突。每一个主题都被用于由ROS消息类型发布,而节点只能接收匹配类型的消息。只有当消息具有相同的消息类型时,节点才能订阅该主题。ROS中的主题可以使用TCP/IP和UDP协议进行传递。基于TCP/IP的传输以TCPROS命名,使用永久的TCP/IP连接。这是在ROS里默认的传输。基于UDP的传输以UDPROS命名,而且是低延迟,有损传输的。所以,它最适合用于遥操作这样的任务。ROS有一个用于主题的工具叫rostopic。这是一个命令行工具给我们关于该主题的信息或者直接发布数据到网络上。此工具有如下的参数: rostopic bw /topic:它展示主题使用的带宽。 r

24、ostopic echo /topic:它打印消息到屏幕。 rostopic find message_type:它通过类型寻找主题。 rostopic hz /topic:它展示主题的发布频率。 rostopic info /topic:它将打印活动主题、发布的以及订阅的主题以及服务的信息。 rostopic list:它打印活动主题的信息。 rostopic pub /topic type args:它发布数据到主题。它允许我们创建并发布数据在我们想要的任何主题,直接通过命令行。 rostopic type /topic:它打印主题类型,是它发布消息的类型。服务当你需要与结点通信并且接收一

25、个回复时,你不能使用主题;你需要用服务来完成。服务是由用户开发的,而且标准的服务对结点来说不存在。消息的源代码相关文件存储在srv文件夹。与主题类似的,服务有一个相关的服务类型,即.srv文件的包资源名。就像其他的ROS的文件系统为基础的类型类似,服务的类型是包名和.srv文件的名称。例如,chapter2_tutorials/srv/chapter2_srv1.srv文件有一个chapter2_tutorials/chapter2_srv1的服务类型。ROS有两个与服务相关的命令行工具:rossrv和rosservice。使用rossrv,我们可以看到关于服务的数据结构信息,它具有与rosm

26、sg相同的用途。使用rosservice,我们可以列出以及查询服务。支持的命令如下: rosservice call /service args: 它调用提供的参数的服务。 rosservice find msg-type:它按照服务类型查找服务。 rosservice info /service:它打印该服务的信息。 rosservice list:它列出活动的服务。 rosservice type /service:它打印服务类型。 rosservice uri /service:它打印ROSPRC URI服务。消息一个节点使用由主题发布的消息可以发送信息到另一个节点。消息有一个简单的结构

27、,它使用标准类型或者是用户开发的类型。消息类型使用接下来的标准ROS命名约定;包的名字,然后是/,然后是.msg文件的名称。例如,std_msgs/msg/String.msg有一个std_msgs/String的消息类型。ROS有一个叫rosmsg的命令行工具可以获取关于消息的信息。接受的参数如下所示: rosmsg show:它显示一个消息的域。 rosmsg list:它列出所有的消息。 rosmsg package:它列出一个包中所有的消息。 rosmsg packages:它列出所有包含消息的包。 rosmsg users:它查找使用该消息类型的所有代码文件。 rosmsg md5:

28、它显示一个消息的MD5总数。记录袋一个袋子就是ROS创建的带有.bag格式的文件,用来保存所有消息、主题、服务和其他的信息。你可以稍后使用这个数据来可视化刚才发生的事情;你可以播放、暂停、倒放以及执行其他操作。记录袋文件可以在ROS中被重新产生,就像一个真实会话那样,在相同的时间发送给主题相同的数据。通常,我们使用这个功能来调试我们的算法。要使用bag文件,我们在ROS有以下工具:rosbag:用来记录、播放以及执行其他操作。rqt_bag:用来在一个图形环境中可视化数据。Rostopic:它帮助我们查看主题发送给节点的主题。ROS管理器ROS管理器为ROS系统中剩余的节点提供命名和注册服务。

29、它除了跟踪服务之外还跟踪主题的发布者和订阅者。管理器的角色是使每个ROS节点都能定位到另外的任何一个。一旦这些节点已经定位到了对方,它们就能以一种一对一的方式彼此通信。你可以在一个图形例子中看到ROS中发布一个主题、订阅一个主题以及发布一个消息所执行的步骤,在下面的图形中:管理器还提供了参数服务器。管理器通常使用roscore命令来运行,该命令可以加载ROS管理器,同时伴随着其他必须的组件。参数服务器参数服务器是一个共享的、多变量的词典,可以通过网络访问。节点使用此服务器在运行时存储和检索参数。参数服务器是使用XMLRPC来实现,并且运行在ROS管理器内,这意味着它的API通过一般的XMLRP

30、C类库来访问。XMLRPC是一个远程程序调用(RPC)协议,它使用XML来编码它的调用以及使用HTTP作为传输机制。参数服务器使用XMLRPC数据类型作为参数值,它包含下列: 32位的整数(32-bit integers) 布尔型(Booleans) 字符串(Strings) 双精度(Double) ISO8601日期(ISO8601 dates) 列表(Lists) Base64编码的二进制数据(Base64-encoded binary data)ROS有一个rosparam工具用来与参数服务器工作。支持的参数如下所示: rosparam list:它列出服务器上所有的参数。 rospar

31、am get parameter:它得到一个参数的值。 rosparam set parameter value:它设置一个参数的值。 rosparam delete parameter:它删除一个参数。 rosparam dump file:它保存参数服务器到一个文件。 rosparam load file:它加载一个文件(带有参数的文件)到参数服务器上。理解ROS社区级ROS社区级概念是ROS资源可以让不同的社区交换软件和知识。这些资源包括下面: 分配(Distributions):ROS分配是收集的版本综合元包你可以安装。ROS分配扮演着一个类似于Linux分配号的角色。它们使安装一个软

32、件的集合更容易。而且它们横跨一组软件还保持稳定的版本。 ROS维基(ROS Wiki):ROS Wiki是记录关于ROS的信息主要的论坛。任何人都可以注册账号,贡献它们自己的文档,提供校正或更新,编写教程,等等。 bug登记系统:如果你发现一个问题或想建议一种新的功能,ROS有这个资源来实现它。 邮箱列表:ROS用户邮箱列表是主要的交流通道,关于ROS新的更新。所以它不仅仅是一个询问关于ROS的论坛。 ROS问答:使用这个资源用户可以在论坛问问题。 Blog:你可以查找定期的更新、图片和新闻。/news。ROS实践教程是时候实践一下目前你所学的内容了。在接下来

33、的部分,你将看到为你准备的例子,包括:创建包、使用节点、使用参数服务器、以及移动一个Turtlesim的模拟机器人。使用ROS文件系统来导航我们有命令行工具来导航文件系统。我们将解释最常用的这些。要获取包和栈的信息或者移动到那里,我们使用rospack,rosstack,roscd和rosls。我们使用rospack和rosstack来获取关于包和栈、路径和依赖的信息。例如,如果你想查找turtlesim包路径,你可以使用如下的命令:$rospack find turtlesim你将得到如下的输出:/opt/ros/hydro/share/turtlesim同样的事情发生在你安装在系统中的综合

34、包。一个例子是如下的:$rosstack find ros_comm你将获得ros_comm综合包的路径如下所示:/opt/ros/hydro/share/ros_comm要列出包或者栈里面的文件,你可以使用如下的命令:$rosls turtlesim如下是前述命令的输出:cmake images srv package.xml msg如果你想进入到文件夹,你可以使用roscd如下所示:$roscd turtlesim$pwd新的路径将如下所示:/opt/ros/hydro/share/turtlesim创建我们自己的工作空间在我们干任何事情之前,我们将创建我们自己的工作空间。在这个工作空间里

35、,我们将拥有我们这本书里将使用的所有代码。要查看ROS正在使用的工作空间,使用如下的命令:$ echo $ROS_PACKAGE_PATH你将看到类似于如下的输出:/opt/ros/hydro/share:/opt/ros/hydro/stacks我们将要创建的文件夹是在/dev/catkin_ws/src/。要添加这个文件夹,我们使用如下的命令:$mkdir p /dev/catkin_ws/src$cd /dev/catkin_ws/src$catkin_init_workspace一旦我们创建完工作空间文件夹,里面没有包只有CMakeList.txt。下一步是build该工作空间。要做这

36、个操作,我们使用如下的命令:$cd /dev/catkin_ws$catkin_make现在,如果你在该目录输入ls命令,你可以看到使用之前的命令创建的新的文件夹。这些就是build和devel文件夹。要完成配置,使用如下的命令:$source devel/setup.bash这一步是重载setup.bash文件。如果你关闭并打开一个新的shell你将得到相同的结果。你应该在你的/.bashrc文件末尾添加这行代码,因为我们在第1章,开始ROS Hydro使用了它。如果没有,你可以使用如下命令添加它:$ echo source /opt/ros/hydro/setup.bash /.bashr

37、c 创建一个ROS包和综合包正如之前所说的,你可以手工创建一个包。为避免冗长的工作,我们将使用catkin_create_pkg命令行工具。我们将使用如下命令在之前创建的工作空间创建新的包:$cd /dev/catkin_ws/src$catkin_create_pkg chapter2_tutorials std_msgs roscpp这个命令的格式包括包的名字和包的依赖,在我们的例子是std_msgs和roscpp。这在以下的命令显示:catkin_create_pkg package_name depend1 depend2 depend3包含了如下的依赖: std_msgs:它包含一般

38、的消息类型,表示原始数据类型和其他基本信息结构,例如MultiArray。 roscpp:这是一个ROS的C+实现。它提供了一个客户端库,使C+开发者能快速和ROS主题、服务和参数进行交互。如果一切正确,你将看到如下的截图:正如我们之前看到的,我们可以使用rospack, roscd和rosls命令来获取新包的信息。如下是使用的依赖: rospack profile:该命令通知你新添加进ROS系统的包。 rospack find chapter2_tutorials:该命令通知你新添加进ROS系统的包。 rospack depends chapter2_tutorials:该命令帮助我们查看依

39、赖。 rosls chapter2_tutorials:该命令帮助我们查看内容。 roscd chapter2_tutorials:该命令更改实际的路径。编译一个ROS包一旦你创建了一个自己的包而且你有了一些代码,那么有必要build该包。当你build该包,真正发生的代码被编译了。要build一个包,我们使用catkin_make工具,如下所示:$ cd /dev/catkin_ws/$ catkin_make几秒钟后,你将看到如下截图所示的类似内容:如果你没有遇到任何失败,那么该包就编译完成了。记住你应该在workspace文件夹内运行catkin_make命令行。如果你在任何其他的文件夹

40、中运行它,命令都会失败。一个例子是如下命令行所提供的:$roscd chapter2_tutorials/$catkin_make如果你在chapter2_tutorials文件夹并且使用catkin_make试着编译该包,你将得到如下的错误:The specified base path /home/your_user/dev/catkin_ws/src/chapter2_tutorials contains a CMakeLists.txt but catkin_make must be invoked in the root of workspace如果你在catkin_ws文件夹中执行

41、catkin_make,你将得到一个正确的编译。使用ROS节点正如我们在”节点与节点集”那一部分所解释的,节点是可执行程序,这些可执行程序是在devel空间中的。要练习并且学习节点,我们将使用一个典型的包叫turtlesim。如果你已经安装了桌面安装程序,你将有turtlesim包预安装了;如果没有,可以使用如下的命令安装它:$ sudo apt-get install ros-hydro-ros-tutorials在开始任何事情之前,你必须使用如下命令启动roscore:$ roscore要获取关于节点的信息,我们有rosnode工具。要查看能接受的参数,输入如下的命令:$ rosnode你

42、将得到一列的可接受参数,如下图所示:如果你想要关于这些参数的使用的更详细说明,使用如下的命令:$ rosnode -h 既然roscore正在运行着了,我们将获取正在运行的节点的信息,使用如下命令:$rosnode list你可以看到唯一运行的节点是/rosout。这是正常的因为这个节点每当roscore运行时就会运行。我们可以通过使用参数来得到所有关于该节点的信息。试着使用如下命令获取更多信息:$ rosnode info$ rosnode ping$ rosnode machine$ rosnode kill$ rosnode cleanup现在,我们将使用如下命令使用rosrun启动一个

43、新的节点:$rosrun turtlesim turtlesim_node我们将看到一个新的窗口出现中间有一个小乌龟,如下图所示。如果你现在查看节点列表,你将看到一个新的节点名为/turtlesim。你可以使用rosnode info nameNode来查看该节点的信息。你可以看到很多信息可以用来调试你的程序,使用如下命令:$rosnode info /turtlesim前述的命令行将打印如下的信息:Node /turtlesimPublications: * /turtle1/color_sensor turtlesim/Color * /rosout rosgraph_msgs/Log *

44、 /turtle1/pose turtlesim/PoseSubscriptions: * /turtle1/cmd_vel unknown typeServices: * /turtle1/teleport_absolute * /turtlesim/get_loggers * /turtlesim/set_logger_level * /reset * /spawn * /clear * /turtle1/set_pen * /turtle1/teleport_relative * /killcontacting node :43753/ .Pid: 3229

45、8Connections: * topic: /rosout * to: /rosout * direction: outbound * transport: TCPROS从以上信息中,我们可以看到该节点的发布(主题),订阅(主题),以及服务(srv),每个都有唯一的名称。现在,让我们看一下你如何使用主题和服务与结点交互。学习如何与主题交互要与主题交互或者获得主题信息,我们有个rostopic工具。该工具接受如下的参数: rostopic bw TOPIC:它显示主题使用的带宽。 rostopic echo TOPIC:它打印消息到屏幕。 rostopic find TOPIC:它通过类型来查

46、找主题。 rostopic hz TOPIC:它展示主题的打印频率。 rostopic info TOPIC:它打印关于活动的主题的信息。 rostopic list:它列出活动的主题。 rostopic pubs TOPIC:它发布数据到主题。 rostopic type TOPIC:它打印主题类型。如果你想查看更多关于这些参数的信息,使用如下的-h:$rostopic bw h使用pub参数,我们可发布订阅到任何节点的主题。我们只需要使用正确的名字发布主题即可。我们稍后做这个测试;我们现在将使用一个可以为我们工作的节点:$rosrun turtlesim turtle_teleop_key

47、使用该节点,我们可以使用箭头按键移动小乌龟,如下图所示:当turtle_teleop_key执行时小乌龟怎么移动呢?如果你想看到关于/teleop_turtle和/turtlesim节点的信息,我们可以在下列代码中看到在Publications部分存在一个主题叫/turtle1/cmd_velgeometry_msgs/Twist,并且在第二段代码Subscriptions部分,有一个/turtle1/cmd_velgeometry_msgs/Twist:$ rosnode info /teleop_turtleNode /teleop_turtle.Publications: * /turt

48、le1/cmd_vel geometry_msgs/Twist .$ rosnode info /turtlesimNode /turtlesimSubscriptions: * /turtle1/cmd_vel geometry_msgs/Twist.这意味着第一个节点发布主题,而第二个节点订阅主题。你可以使用如下的命令行查看主题列表:$rostopic list输出将会是如下所示:/rosout/rosout_agg/turtle1/color_sensor/turtle1/cmd_vel/turtle1/pose使用echo参数,你可以查看节点发送的信息。运行如下的命令行然后使用箭头按键

49、查看发送的数据:$rostopic echo /turtle1/cmd_vel你将会看到类似于如下输出的东西:-linear: x: 0.0 y: 0.0 z: 0.0angular: x: 0.0 y: 0.0 z: 2.0-你将看到主题发送的消息的类型,使用如下命令:$rostopic type /turtle1/cmd_vel你将看到如下输出类似的东西:Geometry_msgs/Twist如果你想查看消息的域,你可以使用如下的命令实现:$rosmsg show geometry_msgs/Twist你将看到类似于如下输出的东西:geometry_msgs/Vector3 linear

50、float64 x float64 y float64 zgeometry_msgs/Vector3 angular float64 x float64 y float64 z这些工具很有用,因为使用这些信息,我们可以利用这样的命令发布主题:rostopic pub topic msg_type args。$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 - 1.0,0.0,0.0 0.0,0.0,1.0你将看到小乌龟在做曲线运动,如下图所示:学习如何使用服务服务是另一种节点与节点之间相互交流的方式。服务允许节点发送一个请求和接收

51、一个回复。我们将使用的与服务进行交互的工具叫rosservice。这个命令能接受的参数如下所示: rosservice args /service:它打印出服务的参数。 rosservice call /service:它使用提供的参数调用服务。 rosservice find msg-type:它使用服务类型查找服务。 rosservice info /service:它打印关于服务的信息。 rosservice list:它列出活动的服务。 rosservice type /service:它打印出服务的类型 rosservice uri /service:它打印ROSRPC URI服务。

52、我们将使用如下的命令列出turtlesim节点可用的服务。所以如果不能工作的话,运行roscore然后运行turtlesim节点:/clear/kill/reset/rosout/get_loggers/rosout/set_logger_level/spawn/teleop_turtle/get_loggers/teleop_turtle/set_logger_level/turtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relative/turtlesim/get_loggers/turtlesim/set_logger_

53、level如果你想查看任何服务的类型,如,/clear服务,使用如下的命令:$ rosservice type /clear你将看到类似于如下的输出的东西:std_srvs/Empty要调用一个服务,使用rosservice call service args。如果你想调用/clear服务,使用如下的命令:$rosservice call /clear在turtlesim窗口中,你现在将看到由乌龟运行所创建的线条将被删除。现在,我们将尝试另一个服务,例如,/spawn服务。这个服务将在另一个位置使用不同的方向创建另一个乌龟。开始之前,我们将看一下如下的消息的类型:$rosservice typ

54、e /spawn | rossrv show你将看到类似于如下的输出:float32 xfloat32 yfloat32 thetastring name-string name先前的命令是和如下命令相同的。如果你想知道为什么它们是相同的,可以google一下piping linux:$rosservice type /spawn你将看到类似于如下的输出:turtlesim/Spawn然后输入如下的命令:$rossrv show turtlesim/Spawn你将看到类似于如下的输出:float32 xfloat32 yfloat32 thetastring name-string name使

55、用这些域,我们知道如何调用这个服务了。我们需要x和y的位置,方向(theta),以及新的乌龟的名称:$rosservice call /spawn 3 3 0.2 “new_turtle”我们将得到如下的结果:使用参数服务器参数服务器是用来存储所有节点都可以使用的数据的。ROS有一个叫rosparam的工具用来管理参数服务器。它可接受的参数如下所示: rosparam set parameter value:它设置参数。 rosparam get parameter:它获取参数。 rosparam load file:它从文件加载参数。 rosparam dump file:它将参数扔到文件。

56、 rosparam delete parameter:它删除参数。 rosparam list:它列出参数的名字。例如,我们可以看到在服务器上的所有参数(所有节点的):$rosparam list我们得到如下的输出:/background_b/background_g/background_r/rosdistro/roslaunch/uris/host_aaronmr_laptop_60878/rosversion/run_id背景参数是turtlesim节点的参数。这些参数更改窗口的颜色,原始是蓝色。如果你想读一个值,你将使用get参数:$rosparam get /background_b

57、要设置一个新值,使用set参数:$rosparam set /background_b 100rosparam另一个重要的特征是dump参数。使用这个参数,你可以保存或者加载参数服务器的内容。要保存参数服务器,使用rosparam dump file_name如下所示:$rosparam dump save.yaml要为参数服务器使用新数据加载文件,使用rosparam load file_name namespace如下所示:$rosparam load load.yaml namespace创建节点在这一部分,我们将学习如何创建两个节点:一个是发布数据,另一个是接收这个数据。这是两个节点之

58、间进行通信的基本的方式,那就是,收到数据然后用该数据做事情。使用如下命令,导航到chapter2_tutorials/src/文件夹:$roscd chapter2_tutorials/src/创建两个文件,名为example1_a.cpp和example1_b.cpp。example1_a.cpp文件将使用节点名发送数据,而example1_b.cpp文件将在shell中显示数据。复制以下的代码到example1_a.cpp文件中或者直接从存储仓库中下载:#include ros/ros.h#include std_msgs/String.h#include int main(int arg

59、c, char *argv) ros:init(argc, argv, example1_a); ros:NodeHandle n; ros:Publisher chatter_pub = n.advertise(message, 1000); ros:Rate loop_rate(10); while (ros:ok() std_msgs:String msg; std:stringstream ss; ss I am the example1_a node ; msg.data = ss.str(); /ROS_INFO(%s, msg.data.c_str(); chatter_pub.

60、publish(msg); ros:spinOnce(); loop_rate.sleep(); return 0;这是前述代码的进一步解释:#include “ros/ros.h”#include “std_msgs/String.h”#include 需要引入的头文件是ros/ros.h,std_msgs/String.h和sstream。这里,ros/ros.h包括与ROS相关的节点使用的所有需要的文件,而std_msgs/String.h包括我们将使用的消息的类型的文件头。ros:init(argc, argv, “example1_a”);初始化节点并设置名字;记住名字必须是唯一的。ros:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论