《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
26、ice args:它调用提供的参数的服务。rosservice find msg-type:它按照服务类型查找服务。rosservice info/service:它打印该服务的信息。rosservice list:它列出活动的服务。rosservice type/service:它打印服务类型。rosservice uri/service:它打印ROSPRC URI服务。,消息,一个节点使用由主题发布的消息可以发送信息到另一个节点。消息有一个简单的结构,它使用标准类型或者是用户开发的类型。消息类型使用接下来的标准ROS命名约定;包的名字,然后是/,然后是.msg文件的名称。例如,std_ms
27、gs/msg/String.msg有一个std_msgs/String的消息类型。ROS有一个叫rosmsg的命令行工具可以获取关于消息的信息。接受的参数如下所示:,rosmsg show:它显示一个消息的域。rosmsg list:它列出所有的消息。rosmsg package:它列出一个包中所有的消息。rosmsg packages:它列出所有包含消息的包。rosmsg users:它查找使用该消息类型的所有代码文件。rosmsg md5:它显示一个消息的MD5总数。,记录袋,一个袋子就是ROS创建的带有.bag格式的文件,用来保存所有消息、主题、服务和其他的信息。你可以稍后使用这个数据来
28、可视化刚才发生的事情;你可以播放、暂停、倒放以及执行其他操作。记录袋文件可以在ROS中被重新产生,就像一个真实会话那样,在相同的时间发送给主题相同的数据。通常,我们使用这个功能来调试我们的算法。要使用bag文件,我们在ROS有以下工具:rosbag:用来记录、播放以及执行其他操作。rqt_bag:用来在一个图形环境中可视化数据。Rostopic:它帮助我们查看主题发送给节点的主题。,ROS管理器,ROS管理器为ROS系统中剩余的节点提供命名和注册服务。它除了跟踪服务之外还跟踪主题的发布者和订阅者。管理器的角色是使每个ROS节点都能定位到另外的任何一个。一旦这些节点已经定位到了对方,它们就能以一
29、种一对一的方式彼此通信。你可以在一个图形例子中看到ROS中发布一个主题、订阅一个主题以及发布一个消息所执行的步骤,在下面的图形中:,管理器还提供了参数服务器。管理器通常使用roscore命令来运行,该命令可以加载ROS管理器,同时伴随着其他必须的组件。,参数服务器,参数服务器是一个共享的、多变量的词典,可以通过网络访问。节点使用此服务器在运行时存储和检索参数。参数服务器是使用XMLRPC来实现,并且运行在ROS管理器内,这意味着它的API通过一般的XMLRPC类库来访问。XMLRPC是一个远程程序调用(RPC)协议,它使用XML来编码它的调用以及使用HTTP作为传输机制。参数服务器使用XMLR
30、PC数据类型作为参数值,它包含下列:32位的整数(32-bit integers)布尔型(Booleans)字符串(Strings),双精度(Double)ISO8601日期(ISO8601 dates)列表(Lists)Base64编码的二进制数据(Base64-encoded binary data)ROS有一个rosparam工具用来与参数服务器工作。支持的参数如下所示:rosparam list:它列出服务器上所有的参数。rosparam get parameter:它得到一个参数的值。rosparam set parameter value:它设置一个参数的值。rosparam de
31、lete parameter:它删除一个参数。rosparam dump file:它保存参数服务器到一个文件。rosparam load file:它加载一个文件(带有参数的文件)到参数服务器上。,理解ROS社区级,ROS社区级概念是ROS资源可以让不同的社区交换软件和知识。这些资源包括下面:分配(Distributions):ROS分配是收集的版本综合元包你可以安装。ROS分配扮演着一个类似于Linux分配号的角色。它们使安装一个软件的集合更容易。而且它们横跨一组软件还保持稳定的版本。ROS维基(ROS Wiki):ROS Wiki是记录关于ROS的信息主要的论坛。任何人都可以注册账号,贡
32、献它们自己的文档,提供校正或更新,编写教程,等等。,bug登记系统:如果你发现一个问题或想建议一种新的功能,ROS有这个资源来实现它。邮箱列表:ROS用户邮箱列表是主要的交流通道,关于ROS新的更新。所以它不仅仅是一个询问关于ROS的论坛。ROS问答:使用这个资源用户可以在论坛问问题。Blog:你可以查找定期的更新、图片和新闻。,ROS实践教程,是时候实践一下目前你所学的内容了。在接下来的部分,你将看到为你准备的例子,包括:创建包、使用节点、使用参数服务器、以及移动一个Turtlesim的模拟机器人。,使用ROS文件系统来导航,我们有命令行工具来导航文件系统。我们将解释最常用的这些。要获取包和
33、栈的信息或者移动到那里,我们使用rospack,rosstack,roscd和rosls。我们使用rospack和rosstack来获取关于包和栈、路径和依赖的信息。例如,如果你想查找turtlesim包路径,你可以使用如下的命令:$rospack find turtlesim你将得到如下的输出:/opt/ros/hydro/share/turtlesim,同样的事情发生在你安装在系统中的综合包。一个例子是如下的:$rosstack find ros_comm你将获得ros_comm综合包的路径如下所示:/opt/ros/hydro/share/ros_comm要列出包或者栈里面的文件,你可以
34、使用如下的命令:$rosls turtlesim如下是前述命令的输出:cmake images srv package.xml msg如果你想进入到文件夹,你可以使用roscd如下所示:$roscd turtlesim$pwd新的路径将如下所示:/opt/ros/hydro/share/turtlesim,创建我们自己的工作空间,在我们干任何事情之前,我们将创建我们自己的工作空间。在这个工作空间里,我们将拥有我们这本书里将使用的所有代码。要查看ROS正在使用的工作空间,使用如下的命令:$echo$ROS_PACKAGE_PATH你将看到类似于如下的输出:/opt/ros/hydro/share
35、:/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该工作空间。要做这个操作,我们使用如下的命令:$cd/dev/catkin_ws$catkin_make现在,如果你在该目录输入ls命令,你可以看到使用之前的命令创建的新的文件夹。这些就是build和devel文件夹。要完成
36、配置,使用如下的命令:$source devel/setup.bash这一步是重载setup.bash文件。如果你关闭并打开一个新的shell你将得到相同的结果。你应该在你的,/.bashrc文件末尾添加这行代码,因为我们在第1章,开始ROS Hydro使用了它。如果没有,你可以使用如下命令添加它:$echo source/opt/ros/hydro/setup.bash/.bashrc,创建一个ROS包和综合包,正如之前所说的,你可以手工创建一个包。为避免冗长的工作,我们将使用catkin_create_pkg命令行工具。我们将使用如下命令在之前创建的工作空间创建新的包:$cd/dev/ca
37、tkin_ws/src$catkin_create_pkg chapter2_tutorials std_msgs roscpp这个命令的格式包括包的名字和包的依赖,在我们的例子是std_msgs和roscpp。这在以下的命令显示:catkin_create_pkg package_name depend1 depend2 depend3,包含了如下的依赖:std_msgs:它包含一般的消息类型,表示原始数据类型和其他基本信息结构,例如MultiArray。roscpp:这是一个ROS的C+实现。它提供了一个客户端库,使C+开发者能快速和ROS主题、服务和参数进行交互。如果一切正确,你将看到如
38、下的截图:正如我们之前看到的,我们可以使用rospack,roscd和rosls命令来获取新包的信息。如下是使用的依赖:rospack profile:该命令通知你新添加进ROS系统的包。,rospack find chapter2_tutorials:该命令通知你新添加进ROS系统的包。rospack depends chapter2_tutorials:该命令帮助我们查看依赖。rosls chapter2_tutorials:该命令帮助我们查看内容。roscd chapter2_tutorials:该命令更改实际的路径。,编译一个ROS包,一旦你创建了一个自己的包而且你有了一些代码,那么有
39、必要build该包。当你build该包,真正发生的代码被编译了。要build一个包,我们使用catkin_make工具,如下所示:$cd/dev/catkin_ws/$catkin_make几秒钟后,你将看到如下截图所示的类似内容:,如果你没有遇到任何失败,那么该包就编译完成了。记住你应该在workspace文件夹内运行catkin_make命令行。如果你在任何其他的文件夹中运行它,命令都会失败。一个例子是如下命令行所提供的:$roscd chapter2_tutorials/$catkin_make如果你在chapter2_tutorials文件夹并且使用catkin_make试着编译该包,
40、你将得到如下的错误: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文件夹中执行catkin_make,你将得到一个正确的编译。,使用ROS节点,正如我们在”节点与节点集”那一部分所解释的,节点是可执行程序,这些可执行程序是在devel空间中的。要练习并且学习节点,我们将使用一个典型的包叫turtlesi
41、m。如果你已经安装了桌面安装程序,你将有turtlesim包预安装了;如果没有,可以使用如下的命令安装它:$sudo apt-get install ros-hydro-ros-tutorials在开始任何事情之前,你必须使用如下命令启动roscore:$roscore,要获取关于节点的信息,我们有rosnode工具。要查看能接受的参数,输入如下的命令:$rosnode你将得到一列的可接受参数,如下图所示:如果你想要关于这些参数的使用的更详细说明,使用如下的命令:$rosnode-h 既然roscore正在运行着了,我们将获取正在运行的节点,的信息,使用如下命令:$rosnode list你可
42、以看到唯一运行的节点是/rosout。这是正常的因为这个节点每当roscore运行时就会运行。我们可以通过使用参数来得到所有关于该节点的信息。试着使用如下命令获取更多信息:$rosnode info$rosnode ping$rosnode machine$rosnode kill$rosnode cleanup现在,我们将使用如下命令使用rosrun启动一个新的节点:$rosrun turtlesim turtlesim_node,我们将看到一个新的窗口出现中间有一个小乌龟,如下图所示。如果你现在查看节点列表,你将看到一个新的节点名为/turtlesim。你可以使用rosnode info
43、nameNode来查看该节点的信息。,你可以看到很多信息可以用来调试你的程序,使用如下命令:$rosnode info/turtlesim前述的命令行将打印如下的信息:Node/turtlesimPublications:*/turtle1/color_sensor turtlesim/Color*/rosout rosgraph_msgs/Log*/turtle1/pose turtlesim/PoseSubscriptions:*/turtle1/cmd_vel unknown typeServices:*/turtle1/teleport_absolute*/turtlesim/get_
44、loggers*/turtlesim/set_logger_level*/reset*/spawn*/clear*/turtle1/set_pen*/turtle1/teleport_relative*/kill,contacting node http:/127.0.0.1:43753/.Pid:32298Connections:*topic:/rosout*to:/rosout*direction:outbound*transport:TCPROS从以上信息中,我们可以看到该节点的发布(主题),订阅(主题),以及服务(srv),每个都有唯一的名称。现在,让我们看一下你如何使用主题和服务与结
45、点交互。,学习如何与主题交互,要与主题交互或者获得主题信息,我们有个rostopic工具。该工具接受如下的参数:rostopic bw TOPIC:它显示主题使用的带宽。rostopic echo TOPIC:它打印消息到屏幕。rostopic find TOPIC:它通过类型来查找主题。rostopic hz TOPIC:它展示主题的打印频率。rostopic info TOPIC:它打印关于活动的主题的信息。rostopic list:它列出活动的主题。rostopic pubs TOPIC:它发布数据到主题。rostopic type TOPIC:它打印主题类型。,如果你想查看更多关于这
46、些参数的信息,使用如下的-h:$rostopic bw h使用pub参数,我们可发布订阅到任何节点的主题。我们只需要使用正确的名字发布主题即可。我们稍后做这个测试;我们现在将使用一个可以为我们工作的节点:$rosrun turtlesim turtle_teleop_key使用该节点,我们可以使用箭头按键移动小乌龟,如下图所示:,当turtle_teleop_key执行时小乌龟怎么移动呢?如果你想看到关于/teleop_turtle和/turtlesim节点的信息,我们可以在下列代码中看到在Publications部分存在一个主题叫/turtle1/cmd_velgeometry_msgs/T
47、wist,并且在第二段代码Subscriptions部分,有一个/turtle1/cmd_velgeometry_msgs/Twist:$rosnode info/teleop_turtleNode/teleop_turtle.Publications:*/turtle1/cmd_vel geometry_msgs/Twist.$rosnode info/turtlesimNode/turtlesimSubscriptions:*/turtle1/cmd_vel geometry_msgs/Twist.,这意味着第一个节点发布主题,而第二个节点订阅主题。你可以使用如下的命令行查看主题列表:$r
48、ostopic list输出将会是如下所示:/rosout/rosout_agg/turtle1/color_sensor/turtle1/cmd_vel/turtle1/pose使用echo参数,你可以查看节点发送的信息。运行如下的命令行然后使用箭头按键查看发送的数据:$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你将看到如下输出类似的东西:
49、Geometry_msgs/Twist如果你想查看消息的域,你可以使用如下的命令实现:,$rosmsg show geometry_msgs/Twist你将看到类似于如下输出的东西:geometry_msgs/Vector3 linear 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_
50、vel geometry_msgs/Twist-r 1-1.0,0.0,0.0 0.0,0.0,1.0,你将看到小乌龟在做曲线运动,如下图所示:,学习如何使用服务,服务是另一种节点与节点之间相互交流的方式。服务允许节点发送一个请求和接收一个回复。我们将使用的与服务进行交互的工具叫rosservice。这个命令能接受的参数如下所示:rosservice args/service:它打印出服务的参数。rosservice call/service:它使用提供的参数调用服务。rosservice find msg-type:它使用服务类型查找服务。rosservice info/service:它打