zoukankan      html  css  js  c++  java
  • ROS学习笔记二:ROS系统架构及概念

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

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


    一、理解ROS文件系统级


    与其他操作系统类似,一个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:这是功能包清单文件。


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


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


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


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


    为了创建、修改或使用功能包,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会创建一个连接到所有进程的网络。在系统中的任何节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发布的信息,并且将自身数据发布到网络上。如下图所示:


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

    • 节点(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问答
    • 博客

  • 相关阅读:
    站立会议第1天
    博客园用户体验
    风险评估
    寻找正整数中1的个数
    每个小组对本组的意见
    对每个小组的评论和建议
    每日scrum(六)
    每日scrum(五)
    分析电脑控制的丹佛机场行李系统
    每日scrum(四)
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/10565886.html
Copyright © 2011-2022 走看看