• ROS计算图级


    上一节说到一个 package 可以包含多个可执行文件(节点),可执行文件需要被运行,就要了解ROS的通信架构,也就是计算图级,例:


    小萝卜机器人拥有驱动系统,感知系统,控制系统等,要让它从指定位置到另一位置一定得启动多个节点,计算图级展示了 ROS 如何对这些节点进行管理和通信的。

    计算图级结构如下:

    节点管理器(master)和节点(node)

    在 ROS 中要管理节点和进程,需要一个节点管理器,它的名称是 master,它的存在有两个作用:


    1.每个节点启动时都必须向它注册

    2.master管理节点(node)间的通信


    因此,在启动节点前,需要使用 roscore 命令启动 master,roscore 还顺带启动了 rosout(日志输出) 和 parameter server(参数服务器)

    rosout 也是一个节点,负责记录当前系统中的 error 或 warning 信息,parameter server 则是做一些参数配置。

    这里再介绍一下节点(node),一个 node 就是一个进程,进程就是程序的一次执行,因此节点只是 ROS 对进程的专有称呼,接下来介绍一些实例:

    首先安装一个模拟器,用你使用的ROS发行版本名称(例如electric、fuerte、groovy、hydro等)替换掉'<distro>'

    sudo apt-get install ros-<distro>-ros-tutorials

    开启一个终端,运行

    roscore

    新开一个终端,运行

    rosnode list

    会看到

    只有 roscore 启动的日志输出节点,用

    rosnode info /rosout

    查看特定节点信息



    接下来运行节点,用 rosrun 命令

    命令格式:rosrun [package_name] [node_name]
    rosrun turtlesim turtlesim_node

    出现

    此时新开一个终端,再次运行 rosnode list

    发现多了一个节点,再用 rosnode info /turtlesim


    一个节点可以利用 rosrun + 包名 + 节点名,但是如果有几十个几百个呢?这时候 ROS 提供了一个更简单的方法——roslaunch。上一节说到 pkg 下面存放有 launch 文件,这个文件就是 roslaunch 所要运行的文件,因此,roslaunch + 包名 + launch名 就可以启动 master 和 多个节点。

    roslaunch 在启动节点前会检测系统是否已经启动 master ,如果没有,它会自动开启 master。

    launch 文件写法如下:


    通信方式

    ROS提供了 主题(topic),服务(service),参数服务器(parameter service) 和动作库(actionlib) 这四种通信方式。


    1.topic 通信方式和message

    两个节点需要通信,需要先定义一个共同的话题,就像这样

    node 之间通过 publish - subscribe 方式通信。即节点 A 通过 topic 发布消息,节点 B 通过 topic 订阅消息。

    一个节点可以发布多个话题,一个话题可以订阅多个话题。

    举个例子:

    在刚才的小乌龟的例子中,新开一个终端,运行这个节点

    rosrun turtlesim turtle_teleop_key

    它可以让你用方向键来控制小乌龟的运动,再开一个终端,安装如下软件:

    sudo apt-get install ros-indigo-rqt
    sudo apt-get install ros-indigo-rqt-common-plugins

    再运行

     rosrun rqt_graph rqt_graph

    可以看到以下结果

    message

    message 是 topic 内容的数据类型,定义在  *.msg 文件中。message 可以理解为 C++ 中的int,float,类等,它的数据类型有如下:


    常用命令:

    2.service 通信方式

    topic 通信方式是异步通信,比如现在有两个检测路障的节点,节点 A 发布路况信息,节点 B 检测,如果是用 topic 通信方式,那么节点 B 会一直订阅话题,可是有效的订阅是检测到路障,因而这种方式会浪费大量的计算资源。而 service 通信方式则实现了同步通信,它会解决这一问题。

    service 通信方式中,两个节点之间的通信方式是request - reply 方式。

    和 topic 想似,srv 是 service 通信方式的数据格式,定义在 *.srv 文件中。

    常用命令:

    3.parameter service 参数服务器
    参数服务器维护一个存储着各种参数的字典,字典就是为了方便读写一些不常改变的参数,给它们加上索引,这个索引是唯一的。

    其中 rosparam load 后面的文件必须遵从 yaml 格式

    通俗的说就是 key : 键值 。

    4.Action 通信方式

    在 service 通信方式中,client 发出请求后,会进入阻塞状态,直到 server 完成了请求,才转而继续运行,在这期间,server 端究竟是在完成别的任务还是 server 也进入阻塞状态,无法知晓。因此,action 是在 service 基础上改进的通信方式。

    action 通信过程中,server 会带有一个状态反馈,


    发送的请求有 目标,取消目标,回传的信息有 状态,任务完成后的结果,实时状态。

    通常用在 长时间(导航,机械臂运动),可抢占(可被打断)的任务。

    和 topic,service 相似,action 是 action 通信方式的数据格式,定义在 *.action 文件中。

    关于计算图级的更详细介绍会在后续文章中更新。

  • 相关阅读:
    基础数据补充
    购物车
    小数据池、深浅拷贝和集合
    列表、元组和range
    小数据池、深浅拷贝和集合练习
    字典
    字符串练习
    列表练习
    练习
    字典练习
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9450740.html
Copyright © 2020-2023  润新知