美文网首页ROS
ROS学习笔记(七)- 理解ROS Nodes

ROS学习笔记(七)- 理解ROS Nodes

作者: Savior2016 | 来源:发表于2017-03-01 20:29 被阅读197次

    这一篇介绍ROS graph的概念,并且讨论roscore,rosnode和rosrun命令行工具的用法

    1 预备知识

    又来一遍,以前的教程都有过了。
    $ sudo apt-get install ros-<distro>-ros-tutorials
    <distro>换成ROS版本号,我的是kinetic.

    2 快速了解概Graph的概念

    • Nodes:一个Node第一个可执行程序,通过ROS与其他Nodes连接。
    • Messages:是一种ROS数据类型,向topic订阅和发布时使用。
    • Topics:Node可以向Topic发送Message或者向Topic订阅Message。
    • Master:ROS名称服务,也就是帮助Node找到彼此。
    • rosout:ROS等价于stdout/stderr(我也不明白什么意思)。
    • roscore:Master + rosout + parameter server(参数服务后面再说)

    3 Nodes

    Node差不多就是包里的一个可执行程序,Node之间可以通过一些服务通信,可以向Topic推送或者订阅消息,也可以提供或者使用服务。

    4 客户库

    ROS客户库允许Node用不同的编程语言写入交流。

    • rospy = python client library
    • roscpp = c++ client library

    5 roscore

    roscore是使用ROS之前需要第一个运行的东西
    运行一下:
    roscore
    就会看到下面这个:

    ... logging to /home/qkingros/.ros/log/2f9f1242-fe5f-11e6-a174-000c29724ec8/roslaunch-ubuntu-4747.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://ubuntu:46865/
    ros_comm version 1.12.6
    
    
    SUMMARY
    ========
    
    PARAMETERS
     * /rosdistro: kinetic
     * /rosversion: 1.12.6
    
    NODES
    
    auto-starting new master
    process[master]: started with pid [4759]
    ROS_MASTER_URI=http://ubuntu:11311/
    
    setting /run_id to 2f9f1242-fe5f-11e6-a174-000c29724ec8
    process[rosout-1]: started with pid [4772]
    started core service [/rosout]
    

    6 使用rosnode

    新打开一个Terminal,用rosnode看一下roscore到底在做什么。
    rosnode显示当前正在运行的ROS nodes的信息。rosnode list命令列举出了这些活动的node:
    rosnode list
    你可以看到:

    /rosout

    显示只有一个node在运行,rosout总是在运行,因为它是用来收集和记录node调试输出的。
    rosnode info指令返回指定node的信息:
    $ rosnode info /rosout
    这个指令会返回更多关于rosout的信息,可以看到它发布了/rosout_agg,订阅了。。。额,订阅了自己,还有两个服务。

    --------------------------------------------------------------------------------
    Node [/rosout]
    Publications: 
     * /rosout_agg [rosgraph_msgs/Log]
    
    Subscriptions: 
     * /rosout [unknown type]
    
    Services: 
     * /rosout/set_logger_level
     * /rosout/get_loggers
    
    
    contacting node http://ubuntu:33983/ ...
    Pid: 4772
    

    下面要看更多node,我们要先使用rosrun再打开一个node。

    7 使用rosrun

    rosrun允许直接通过node的名称运行一个包内的node。
    用法:
    $ rosrun [package_name] [node_name]
    再打开一个Terminal,运行:
    $ rosrun turtlesim turtlesim_node
    就会显示一只小乌龟,可能是海龟的卡通图片。
    打开一个新窗口输入:
    rosnode list
    这个时候会显示:

    /rosout
    /turtlesim
    

    ROS一个比较特色的功能就是可以使用命令行更改名字。
    关掉海龟的窗口或者在运行海龟的命令行窗口Ctrl+C,现在重新运行,并且顺便给这个node改名:
    $ rosrun turtlesim turtlesim_node __name:=my_turtle
    你会发现,诶……海龟变了一个。然鹅,这并不是改名起的作用,海龟样式本来就是随机出现的。真正改变的是这里:
    $ rosnode list
    然后显示的就类似于下面这个:

    /my_turtle
    /rosout
    /turtlesim
    

    仍然存在/turtlesim的原因是,刚刚用Ctrl-C而不是直接关掉窗口关掉了第一只海龟,可以使用$ rosnode cleanup清理一下列表。
    根本原因是没有把 $ROS_HOSTNAME 环境变量设置成单机运行,可以进行如下设置之后再清理一下。

    $ export ROS_HOSTNAME=localhost
    $ export ROS_MASTER_URI=http://localhost:11311
    

    还可以ping它一下:
    $ rosnode ping my_turtle
    结果如下:

    rosnode: node is [/my_turtle]
    pinging /my_turtle with a timeout of 3.0s
    xmlrpc reply from http://ubuntu:44591/  time=1.052856ms
    xmlrpc reply from http://ubuntu:44591/  time=1.233101ms
    xmlrpc reply from http://ubuntu:44591/  time=1.811028ms
    xmlrpc reply from http://ubuntu:44591/  time=3.592014ms
    xmlrpc reply from http://ubuntu:44591/  time=1.348972ms
    xmlrpc reply from http://ubuntu:44591/  time=1.852036ms
    xmlrpc reply from http://ubuntu:44591/  time=1.216173ms
    xmlrpc reply from http://ubuntu:44591/  time=0.966072ms
    xmlrpc reply from http://ubuntu:44591/  time=0.771046ms
    xmlrpc reply from http://ubuntu:44591/  time=0.880003ms
    xmlrpc reply from http://ubuntu:44591/  time=0.697851ms
    xmlrpc reply from http://ubuntu:44591/  time=0.758171ms
    xmlrpc reply from http://ubuntu:44591/  time=0.686169ms
    xmlrpc reply from http://ubuntu:44591/  time=1.352072ms
    xmlrpc reply from http://ubuntu:44591/  time=0.720024ms
    xmlrpc reply from http://ubuntu:44591/  time=1.090050ms
    

    8 复习

    这个教程讲了:

    • roscore=ros+core:master(提供ROS名称服务)+rosout(stdout/stderr)+parameter server
    • rosnode=ros+node:ROS 获取node信息的工具
    • rosrun=ros+run:从一个指定的包中运行一个node
      现在我们已经了解了node是怎么工作的,下面介绍Topic是怎么工作的。
      而且接下来你可以放肆的使用Ctrl+C了。

    相关文章

      网友评论

        本文标题:ROS学习笔记(七)- 理解ROS Nodes

        本文链接:https://www.haomeiwen.com/subject/uctcgttx.html