• 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。

  • 相关阅读:
    python 判断矩阵中每行非零个数的方法
    用Python 绘制分布(折线)图
    统计numpy数组中每个值出现的个数
    pandas 获取不符合条件的dataframe
    Python 中如何判断 list 中是否包含某个元素
    docker与Spring boot的集成:docker-maven-plugin使用
    处理kdevtmpfsi挖矿病毒
    使用docker-maven-plugin推送镜像到远程docker服务器
    docker 开启2375端口,提供外部访问docker
    Spring Boot 配置优先级顺序
  • 原文地址:https://www.cnblogs.com/thewaytotheway/p/12847223.html
Copyright © 2020-2023  润新知