机器人操作系统ROS Indigo 入门学习(6)——理解ROS Nodes

    xiaoxiao2021-03-25  67

     1.理解ROS Node

    这个教程将会介绍ROS图的概念并且会讨论roscoe,rosnode,和rosrun命令行工具。

     

    1.1前提

    在这个教程中我们会用到小型仿真器,请安装

     

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

    <distro>是你的版本名字

    1.2图概念的概论

    Nodes:node是使用ROS去和其它node通信的可执行文件。

    Messages:ROS中订阅或者发布给topic的一种数据形式

    Topics:Nodes可以发布messages给一个topic,也可以订阅一个topic去接受它的messages

    Master:为ROS提供名称服务(比如帮助nodes找到彼此)

    rosout:相当于ROS中的stdout/stderr

    roscore:Master+rosout+parameter server(参数服务之后会介绍)

     

    1.3 Nodes

    Node不过是ROS package中一个可执行文件。ROS node 利用ROS用户库去和其他node进行通信。nodes也可以topic发起发布或者订阅,nodes也可以提供或者使用一个service.

     

    1.4用户库

    用户库允许用不同语言编写的nodes之间进行通信:

    rospy = Python client library 

    roscpp = c++ client library 

     

    1.5roscore

    roscore是使用ROS时第一个要使用的工具

    $ roscore

     

    输出:

    ... logging to /home/ros/.ros/log/add59068-aab1-11e4-99b0-6c71d92ff4a1/roslaunch-ros-K45VD-17626.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://ros-K45VD:42183/

    ros_comm version 1.11.10

     

     

    SUMMARY

    ========

     

    PARAMETERS

     * /rosdistro: indigo

     * /rosversion: 1.11.10

     

    NODES

     

    auto-starting new master

    process[master]: started with pid [17638]

    ROS_MASTER_URI=http://ros-K45VD:11311/

     

    setting /run_id to add59068-aab1-11e4-99b0-6c71d92ff4a1

    process[rosout-1]: started with pid [17651]

    started core service [/rosout]

     

    如果roscore没有初始化,你也许会遇到网络配置问题。查看Network Setup - Single Machine Configuration解决.

    如果roscore没有初始化并且说缺少权限,也许是~/.ros文件夹的用户是root,可以用一下命令递归改变文件夹的所有者:

    $ sudo chown -R <your_username> ~/.ros

     

    1.6使用rosnode

    打开一个新的终端(前面那个roscore不要关闭),你的环境变量会重置,~/.bashrc被启用了,如果运行rosnode等命令时有问题时,需要添加一些环境变量setup文件去使这些命令到~/.bashrc中,或者手动使它们生效。

    rosnode显示了关于正在运行的ros node的信息。rosnode list列出活动的node.

    $ rosnode list

     

    可以看到:

    /rosout

    这告诉我们这里只有一个node在运行。这个node总是在运行因为它会收集和记录node的调试信息。

     

    rosnode info命令可以返回特定node的信息

    $ rosnode info /rosout

     

    输出:

    ------------------------------------------------------------------------

    Node [/rosout]

    Publications:

     * /rosout_agg [rosgraph_msgs/Log]

     

    Subscriptions:

     * /rosout [unknown type]

     

    Services:

     * /rosout/set_logger_level

     * /rosout/get_loggers

     

    contacting node http://machine_name:54614/ ...

    Pid: 5092

    接下来让我们看看其他的nodes。我们打算用rosrun去运行另一个node。

     

    1.7使用rosrun

    rosrun允许你在一个package中去用package的名字直接运行一个node(不需要知道package的路径)。

    用法:

    $ rosrun [package_name] [node_name]

     

    因此我们可以利用rosrun去运行在turtlesim的package中turtlesim_node

    在一个新的终端中运行:

    $ rosrun turtlesim turtlesim_node

    你会在窗口看到:

     

     

    在一个新终端中运行:

    $ rosnode list

    将会看到:

    /rosout

    /turtlesim

    ROS一个强大的特点是可以在命令行重命名。

    关闭窗口,再用Remapping Argument重新命名node

    $ rosrun turtlesim turtlesim_node __name:=my_turtle

     

    再次运行:

    $ rosnode list

    看到:

    /rosout

    /my_turtle

    如果用Ctrl+c结束进程而不是关闭turtle的窗口那么在rosnode list时还会看到之前关闭的node,可以用rosnode cleanup清理。

     

     

     再看看新的/my_turtle node,用rosnode ping命令去测试它是否正在运行:

    $ rosnode ping my_turtle

    rosnode: node is [/my_turtle]

    pinging /my_turtle with a timeout of 3.0s

    xmlrpc reply from http://aqy:42235/     time=1.152992ms

    xmlrpc reply from http://aqy:42235/     time=1.120090ms

    xmlrpc reply from http://aqy:42235/     time=1.700878ms

    xmlrpc reply from http://aqy:42235/     time=1.127958ms

     

    1.8回顾

    roscore = ros +core:master(提供ros的命名服务)+rosout(stdout/stderr)+ parameter server (参数服务之后会介绍);

    rosnode = ros +node ;ros用来获取关于node信息的工具;

    rosrun = ros + run;从一个给定的package运行一个node.

     

    既然你已经理解ros node 是怎样工作的了,再来看看ros的topic怎样工作的

    转载请注明原文地址: https://ju.6miu.com/read-40490.html

    最新回复(0)