zoukankan      html  css  js  c++  java
  • ROS-1.1-基本概念

    ROS 的核心是node之间的通信。node(节点)是使用 ROS 中继设备通信的 ROS 程序。一个 node 的启动是独立于其他 node 的,而且 node 启动的顺序是任意的。在一台计算机上可以运行多个 node,node 也可以分布式地运行在计算机网络上。一个 node 能真正体现其价值的时候是与其他 node 通信的时候。

    node 之间的通信又包括这些概念:topic(话题),messages(消息),roscore,publishers(发布者),subscribers(订阅者),service(服务)。节点之间的所有通信都是串行网络通信。publisher 发布 messages,messages 是可以使用关联密钥解析的数据包。 由于每个 message 都是作为比特流接收的,因此有必要通过密钥(message 的数据类型)以了解如何解析这些比特流并重建相应的数据结构。比如说,有个 messages 的数据类型是 Float64,这个数据类型是 ROS 的 std_msgs 预定义的一种 message 数据类型,此时 publisher 将要发布的浮点数 message 打包到 64 位的比特流中,subscriber 则按照 Float64 的数据类型将比特流解析成原来的浮点数 message。

    当 publisher 将消息发布了之后,所有需要这种消息的 subscribers 节点都可以订阅这种消息。此时 subscribers 节点要建立已与发布数据之间连接。 通常,发布的数据来自不同的节点。 之所以会发生这种情况,是因为这些发布者由于软件的运行而发生了变化,或者因为某些发布者节点在某些情况下和一些订阅者节点是相关的,而在其他情况下与其他节点相关。在一些复杂的环境下,搞清楚节点和消息之间的关系更加困难,这就引出了 topic 的概念。

    多个 publisher 可以轮流发布消息到该 topic。因此,subscribers 只需要知道 topic 的名称,而不需要知道这个消息是哪个或哪些节点发布的。例如,速度命令的主题名为 vel_cmd,机器人的低级控制器应该订阅此主题以接收速度命令,可能有多个发布者发布关于此主题的速度命令消息,这些发布者节点有可能是轨迹规划中发布速度的节点,也有可能是测试时实验人员直接下发速度的节点。

    下一个重要概念是 roscore,这可以说是所有 ROS 通信的中继设备,roscore 节点负责协调通信,就像老式电话线路的接线员一样。虽然可以有许多ROS节点分布在多个联网的计算机上,但是只能有一个 roscore 实例运行,并且在其上运行 roscore 的机器称为主计算机(master)。

    publisher 节点通过向 roscore 告知 topic 的消息类型来发起 topic,这个动作称为 advertising。为此,publisher 实例化一个 ros::Publisher 类的对象。之后通过调用成员函数 advertise 说明消息类型,并为话题命名,之后调用 publish 成员函数就可以发布消息了。

    既然 roscore 起到了中继节点的作用,那么 roscore 应该在所有节点启动之前启动,在命令行中输入 roscore:

    cxw@cxw:~$ roscore
    ... logging to /home/cxw/.ros/log/d15d3dd2-905d-11ea-9047-000c2911626c/roslaunch-cxw-2286.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.
    
    started roslaunch server http://cxw:40635/
    ros_comm version 1.12.14
    
    
    SUMMARY
    ========
    
    PARAMETERS
     * /rosdistro: kinetic
     * /rosversion: 1.12.14
    
    NODES
    
    auto-starting new master
    process[master]: started with pid [2297]
    ROS_MASTER_URI=http://cxw:11311/
    
    setting /run_id to d15d3dd2-905d-11ea-9047-000c2911626c
    process[rosout-1]: started with pid [2310]
    started core service [/rosout]
    

    从输出里面我们可以获得一些有效信息,比如主机地址ROS_MASTER_URI,核心节点/rosout。当一个终端运行了 roscore 之后就不能干其他的活了,如果你想启动其他节点就只能再开一个终端。当 roscore 的进程被结束掉后,整个 ros 程序也就结束了。

    启动了 roscore 之后,我们就可以启动发布者节点了,发布者节点 advertise topic 并且可以发布消息,要注意这个消息是以一定频率发布的,这个频率的上限取决于操作系统的性能,一般而言,传感器或者底层控制器的消息频率差不多 1KHz 就够了。当发布者发布主题后,不需要所有节点都监听这个消息,有可能多个节点同时订阅这个话题。发布者不知道有没有订阅者,有几个订阅者。这些问题都是 roscore 来解决的。

    订阅者最好在发布者之前启动,即便没有订阅者的话题被发布,订阅者也在 roscore 中注册了他要订阅的话题信息,当该话题信息出现时就被订阅者接收。

    当然,一个节点既可以是订阅者,也可以是发布者。例如,控制节点需要作为订阅者接收传感器信号,并作为发布者发出控制命令。这只需要在节点内实例化订阅者对象和发布者对象。它对于流水线处理顺序处理的消息也很有用。例如,低级图像处理例程(例如,用于边缘查找)可以订阅原始相机数据并发布低级处理的图像。更高级别的节点可以订阅边缘处理的图像,在这些图像中查找图像特征,并发布其结果(例如,识别的形状)以供更高级别的过程进一步使用。

    下一节我们来实现最简单的 publisher 和 subscriber。

  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/thewaytotheway/p/12847223.html
Copyright © 2011-2022 走看看