博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ROS学习笔记二:ROS系统架构及概念
阅读量:4963 次
发布时间:2019-06-12

本文共 6409 字,大约阅读时间需要 21 分钟。

本文主要是了解ROS的系统架构、文件夹结构以及工作所需的核心文件。

ROS系统架构主要被设计和划分为三部分,每一部分代表一个层级的概念:文件系统级(The filesystem level)、计算图级(The computation graph level)、开源社区级(The community level)。

一、理解ROS文件系统级

ROS_chap2_A.png

与其他操作系统类似,一个ROS程序的不同组件要被放在不同的文件夹下。这些文件夹是根据功能的不同来对文件进行组织的:

  • 功能包(Package):功能包是ROS中软件组织的基本形式。一个功能包具有用于创建ROS程序的最小结构和最少内容。它可以包含ROS运行的进程(节点)、配置文件等;
  • 功能包清单(Package Manifest):功能包清单提供关于功能包、许可信息、依赖关系、编译标志等的信息。一个包的清单有一个名为package.xml的文件管理;
  • 综合功能包(Metapackage):将几个具有某些功能的功能包组织在一起,就获得了一个综合功能包(Stack)。
  • 消息类型(Message(msg) type):消息是一个节点发送到其他节点的信息。ROS系统有很多的标准消息类型。消息类型的说明存储在对应功能包的msg文件夹下。
  • 服务类型(Servic(src) type):服务描述说明存储在对应功能包的src文件夹下,定义了在ROS中由每个进程提供的关于服务请求和响应的数据结构。

1.1 工作空间

工作空间就是一个包含功能包、可编辑源文件或编译包的文件夹。当想同时编译不同的功能包时非常有用,并且可以用来保存本地开发包,一般包含src、bulid和devel这三个文件夹。

  • 源文件空间(src文件夹):在源文件空间放置了功能包、项目、克隆包等。在这个空间中最重要的是CMakefile.txt。当你在工作空间中配置功能包时,src文件夹CMakefile.txt调用CMake。
  • 编译空间(build文件夹):在build文件夹里,CMake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。
  • 开发空间(devel文件夹):devel文件夹用来保存编译后的程序,这些是无需安装就能用来测试的程序。

1.2 功能包

功能包指的是一种特定的文件结构和文件夹组合。这种结果如下所示:

  • include/package_name/:此目录包含了你需要的库的头文件。
  • msg/:如果你要开发非标准消息,请把文件放在这里。
  • script/:其中包括Bash、Pytho或其他任何脚本的可执行脚本文件。
  • src/:这是存储程序源文件的地方。你可能会为节点在此创建一个文件夹。
  • CMakefile.txt:这是CMake的生成文件。
  • package.xml:这是功能包清单文件。

功能包的目录结构图如下图所示:

ROS_chap2_B_2.png

CMakeLists.txt 文件的内容结构图如下图所示:

ROS_chap2_C.png

package.xml 文件的内容结构图如下图所示:

ROS_chap2_D_2.png

功能包还能配置launch文件,launch文件编写规则如下图所示:

ROS_chap2_E.png

为了创建、修改或使用功能包,ROS给我们提供了一些工具:

  • rospack find [package_name] 使用此命令可以返回功能包的路径信息
  • catkin_create_pkg 用于创建一个新的功能包
  • catkin_make 用于编译工作空间
  • rosdep 此命令安装功能包的系统依赖项
  • rqt_dep 用来查看功能包的依赖关系图

若要在文件夹和功能包之间移动文件,ROS提供了非常有用的rosbash功能包,其中包含了一些非常类似于LInux命令的命令,例如:

  • roscd 此命令用来更改目录
  • rosed 此命令用来编辑文件
  • roscp 此命令用于从一些功能包复制文件
  • roscd 此命令列出功能包的目录
  • rosls 此命令列出功能包下的文件

1.3 综合功能包

综合功能包是一些只有一个package.xml文件的特定包,它不包含其他文件,如代码等。综合功能包用于引用其他功能特性类似的功能包,例如导航包、ros_tutorials等。

如果你想定位 ros_tutorials 综合功能包,可以使用下面的命令:

rosstack find ros_tutorials

显示路径为: /opt/ros/indigo/share/ros_tutorials

1.4 消息

ROS使用了一种简化的消息类型描述语言来描述ROS节点发布的数据值。通过这样的描述语言,ROS能够使用多种编程语言生成不同类型消息的源代码。

ROS提供了很多预定义消息类型。如果你创建了一种新的消息类型,那么就要把消息的类型定义放到功能包的msg文件夹下。在该文件夹中,有用于定义各种消息的文件。这些文件都以.msg为扩展名。

消息类型必须具有两个主要部分:字段和常量。字段定义了要在消息中传输的数据类型,例如int32、string或之前创建的新类型。常量用于定义字段的名称。

在ROS中有一些处理消息的工具。例如 rosmsg 命令行工具能够输出消息定义信息,并可以找到使用该消息类型的源文件。

1.5 服务

ROS使用了一种简化的服务描述语言来描述ROS的服务类型。这直接借鉴了ROS msg消息的数据格式,以实现节点之间的请求/响应通信。服务的描述存储在功能包的 srv/ 子目录下 .srv 文件中。

若要调用服务,你需要使用该功能包的名称及服务名称。例如 sample_package/srv/sample.srv 文件,可以把它称为 sample_package1/sample1 服务。

ROS中有一些执行服务的工具。rossrv 工具能输出服务说明、.srv 文件所在的功能包名称,并可以找到使用某一服务类型的源代码文件。

如果你想要在ROS中创建一个服务,可以使用服务生成器。这些工具能够从基本的服务说明中生成代码。你只需要在 CMakefile.txt 文件中加一行 gensrv() 命令。

二、理解ROS计算图级

ROS会创建一个连接到所有进程的网络。在系统中的任何节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发布的信息,并且将自身数据发布到网络上。如下图所示:

ROS_chap2_F.png

在这一层级中最基本的概念包括节点、节点管理器、参数服务器、消息、服务、主题和消息记录,这些概念都以不同的方式向计算图级提供数据:

  • 节点(Node) 节点是主要的计算执行进程。最好让每一个节点都具有特定的单一的功能,而不是创建一个包罗万象的大节点。节点需要使用如 roscpp 或 rospy 的ROS客户端进行编写。
  • 节点管理器(Master) 节点管理器向ROS系统中其他节点提供命名和注册服务。它像服务一样追踪主题的发布者和订阅者。节点管理器的作用是使节点之间能够互相查找。一旦这些节点找到了彼此,就能建立点对点的通信。
  • 参数服务器(Parameter Server) 参数服务器是可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时的参数。
  • 消息(Message) 节点通过消息完成彼此的沟通。消息包括一个节点发生到其他节点的信息数据。ROS中包括很多种标准类型的消息,同时你也可以基于标准消息开发自定义类型的消息。
  • 主题(Topic) 每个消息都必须有一个名称来被ROS网络路由。每一条消息都要发布到相应的主题。当一个节点发送数据时,我们就说该节点正在向主题发布消息。节点可以通过订阅某个主题,接受来自其他节点的消息。主题的名称必须是独一无二的,否则在同名主题之间的消息路由就会发生错误。
  • 服务(Service) 当你需要直接与节点通信并获得应答时,将无法通过主题实现,从而需要服务。此外,服务必须有唯一的名称。当一个节点提供某个服务时,所有的节点都可以通过使用ROS客户端编写的代码与它通信。
  • 消息记录包(Bag) 消息记录包是一种用于保存和回收ROS消息数据的文件格式(.bag)。它能够获取并记录各种难以收集的传感器数据。我们可以通过消息记录包反复获取实验数据,进行必要的开发和算法测试。在使用复杂机器人进行实验工作时,需要经常使用消息记录包。

2.1 节点(Node)

ROS有另一种类型的节点,称为 nodelet。这类特殊节点可以在单个进程中运行多个节点,其中每个 nodelet 为一个线程(轻量级进程)。这样,可以在不使用ROS网络的情况下与其他节点通信,通信效率更高,并避免网络堵塞。nodelet 对于摄像头和3D传感器这类数据传输量非常大的设备特别有用。

ROS提供了处理节点的工具,如rosnode。rosnode -h命令,可以查看此工具的所有支持命令:

  • rosnode info [node_name] 输出当前节点信息
  • rosnode kill [node_name] 结束当前运行节点进程或发送给定信号
  • rosnode list 列出当前活动节点
  • rosnode machine hostname 列出某一特定计算机上运行的节点或列出主机名称
  • rosnode ping [node_name] 测试节点间的连通性
  • rosnode cleanup 将无法访问节点的注册信息清除

使用某个节点时,只需要写出包名和节点名字就可以调用节点,不需要写路径。

$ rosrun [package_name] [node_name]

修改节点的名字可以直接在命令行进行(同时可以运行该节点做其他任务):

$ rosrun turtlesim turtlesim_node __name:=my_turtle

更改节点中的参数,只需要在参数名称前添加一个下划线,例如将参数(param)就设置为浮点数9.0:

$ rosrun book_tutorials tutorialx _param:=9.0

2.2 主题(Topic)

一个主题可以有多个订阅者也可以有多个发布者,但是需要注意用不同的节点发布同样的主题,否则会产生冲突。

每个主题都是强类型的,发布到主题上的消息必须与主题的ROS消息类型相匹配,并且节点只能接受类型匹配的消息。节点要想订阅主题,就必须具有相同的消息类型。

ROS的主题可以使用 TCP/IP 和 UDP 传输。基于 TCP 传输称为 TCPROS,它使用 TCP/IP 长连接。这是ROS默认的传输方式。

基于 UDP 传输称为 UDPROS,它是一种低延迟高效率的传输方式,但可能产生数据丢失。所以它适合像远程操控的任务。

ROS有一个 rostopic 工具用于主题操作。使用rostopic -h命令,可以查看此工具的所有支持命令:

  • rostopic echo [/topic_name] 将消息输出到屏幕
  • rostopic find message_type 按照类型查找主题
  • rostopic info [/topic_name] 输出活动主题、发布的主题、主题订阅者和服务的信息
  • rostopic list 输出活动主题的列表
  • rostopic pub [/topic_name] [type] [args] 将数据发布到主题。它允许我们直接从命令行中对任意主题创建和发布数据。
  • rostopic type [/topic_name] 输出主题的类型,或者说主题中发布的消息类型
  • rostopic hz [/topic_name] 显示主题的发布频率
  • rostopic bw [/topic_name] 显示主题所使用的带宽

2.3 服务(Service)

当你需要直接与节点通信并获得应答时,将无法通过主题实现,从而需要服务。服务需要由用户开发,节点并不提供标准服务。包含服务源代码的文件存储在 srv 文件夹中。

像主题一样,服务关联一个以功能包中 .srv 文件名称来命名的服务类型。与其他基于ROS文件系统的类型一样,服务类型是功能包名称和 .srv 文件名称的组合。例如 chapter2_tutorials/srv/chapter2srv1.srv 文件的服务类型是 chapter2_tutorials/chapter2srv1。

ROS关于服务的命令行工具有两个:rossrv 和 rosservice。我们可以通过 rossrv 看到有关服务数据结构的信息,并且与 rosmsg 具有完全一致的用法。使用rosservice -h命令,可以查看此工具的所有支持命令:

  • rosservice args [/service_name] 打印服务参数
  • rosservice call [/service_name] args 根据命令行参数调用服务
  • rosservice find [msg-type] 根据服务类型查询服务
  • rosservice info [/service_name] 输出服务信息
  • rosservice list 输出活动服务清单
  • rosservice type [/service_name] 输出服务类型
  • rosservice uri [/service_name] 输出服务的ROSRPC URI

2.4 消息(Message)

消息的类型在ROS中按照以下标准命名方式进行约定:功能包名称 /.msg 文件名称。例如,std_msgs/msg/String.msg 的消息类型是 std_msgs/String。

ROS有一个 rosmsg 工具用于消息操作。使用rosmsg -h命令,可以查看此工具的所有支持命令:

  • rosmsg show 显示一条消息的字段
  • rosmsg list 列出所有消息
  • rosmsg package 列出功能包的所有消息
  • rosmsg packages 列出所有具有该消息的功能包
  • rosmsg md5 显示一条消息的MD5求和结果

2.5 消息纪录包

消息纪录包是由ROS创建的一组文件。它使用 .bag 格式保存消息、主题、服务和其他ROS数据信息。你可以在事件发生后,通过使用可视化工具调用和回放数据,检查在系统中到底发生了什么。

若要使用纪录包文件,我们可以使用以下ROS工具:

  • rosbag 用来录制、播放和执行其他操作
  • rqt_bag 用来可视化图形环境中的数据

2.6 节点管理器

节点管理器通常使用 roscore 命令运行,它会加载ROS节点管理器及其他ROS核心组件。

2.7 参数服务器

参数服务器使用 XMLRPC 数据类型为参数赋值,包括以下类型:

  • 32位整数(32-bit integer)
  • 布尔值(Boolean)
  • 字符串(String)
  • 双精度浮点(Double)
  • 列表(List)

ROS中关于参数服务器的工具是 rosparam。使用'rosparam -h'命令,可以查看此工具的所有支持命令:

  • rosparam list 列出了服务器中的所有参数
  • rosparam get [parameter] 获取参数值
  • rosparam set [parameter] [value] 设置参数值
  • rosparam delete [parameter] 删除参数
  • rosparam dump file 将参数服务器保存到一个文件
  • rosparam load file 加载参数文件到参数服务器

三、理解ROS开源社区级

ROS开源社区级的概念主要是ROS资源,其能够通过独立的网络社区分享软件和知识。这些资源包括:

  • 发行版
  • 软件库
  • ROS维基
  • Bug提交系统
  • 邮件列表
  • ROS问答
  • 博客

转载于:https://www.cnblogs.com/linuxAndMcu/p/10565886.html

你可能感兴趣的文章
机电行业如何进行信息化建设
查看>>
9、总线
查看>>
Git 笔记 - section 1
查看>>
HDU6409 没有兄弟的舞会
查看>>
2018 Multi-University Training Contest 10 - TeaTree
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
《人人都是产品经理》书籍目录
查看>>
如何在git bash中运行mysql
查看>>
OO第三阶段总结
查看>>
构建之法阅读笔记02
查看>>
DataTable和 DataRow的 区别与联系
查看>>
检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
查看>>
mysql数据库中数据类型
查看>>
Fireworks基本使用
查看>>
两台电脑间的消息传输
查看>>
Linux 标准 I/O 库
查看>>
.net Tuple特性
查看>>
Java基础常见英语词汇
查看>>
iOS并发编程笔记【转】
查看>>