ROS学习-理解ROS节点

理解几个概念

  • Nodes: 一个节点是ROS中与其他节点进行联系的可执行文件。

(注意:事实上节点就是package中的一个可执行文件,ROS节点使用ROS的客户端库client library来与其他节点进行通讯。节点可以发布或者接收话题,同时,节点也可以提供或者使用服务)。

客户端库client library包括,rospy = python client library和roscpp = c++ client library。允许我们使用不同的编程语言进行编写。

  • Messages: 当发布话题时设置的ROS数据类型,例如point, path, image等。
  • Topics: 节点能够通过topic发布各种message消息,同时后续节点也能够通过topic接收消息。
  • Master: ROS的名字服务(例如帮助各种节点找到彼此)。
  • rosout: ROS 中的标准输出stdout/stderr。
  • roscore: Master + rosout + parameter server 组成了roscore,其中(parameter server在后续过程中介绍)。

启动ros

在启动ROS时首先要执行roscore。
例如,我们通过Ctrl + Alt + T 打开一个新的Terminal,执行roscore如果正常的话可以在命令行中看到类似于下述格式的内容。

roscore
... logging to /home/xiaochen/.ros/log/fc2129c0-4510-11ec-a53f-7085c2dc7a69/roslaunch-xiaochen-32511.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://xiaochen:40923/
ros_comm version 1.14.11


SUMMARY
========

PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.11

NODES

auto-starting new master
process[master]: started with pid [32528]
ROS_MASTER_URI=http://xiaochen:11311/

setting /run_id to fc2129c0-4510-11ec-a53f-7085c2dc7a69
process[rosout-1]: started with pid [32546]
started core service [/rosout]

如果roscore没有初始化并回复提示说缺乏权限的错误,那么可能是因为 ~/.ros文件夹的权限为root,可以使用以下命令递归更改该文件夹的所有权。

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

使用rosnode

保持上述窗口执行了roscore之后,继续使用Ctrl + Alt + T 再次打开一个新的Terminal(注意保持前一个窗口处于打开状态),使用下述命令来查看当前激活状态的node。

$ rosnode list

输出结果为:

/rosout

这代表我们现在只有一个node在运行,即rosout,因为其总是处于运行状态来收集并记录各node的debugging输出。

同时,可以使用下述命令来查看指定node的信息。

$ rosnode info /rosout

输出结果为:

--------------------------------------------------------------------------------
Node [/rosout]
Publications: 
 * /rosout_agg [rosgraph_msgs/Log]

Subscriptions: 
 * /rosout [unknown type]

Services: 
 * /rosout/get_loggers
 * /rosout/set_logger_level


contacting node http://xiaochen:35625/ ...
Pid: 4798

这给我们很多关于/rosout节点的信息,例如其发布和接收的消息,同时提供的服务。

使用rosrun

我们可以通过rosrun命令直接运行一个package中的节点node,命令形式如下。

$ rosrun [package_name] [node_name]

例如,我们现在想要运行turtlesim package中的turtlesim_node节点,则执行下述命令:

$ rosrun turtlesim turtlesim_node

可以看到下述界面:
在这里插入图片描述

注意:不同版本的ros所执行命令出现的小乌龟图案并不相同。这里是melodic。

随后,我们再次使用Ctrl + Alt + T 打开一个Terminal,在新的窗口中使用命令:

$ rosnode list

查看当前活动的节点,可以看到:

/rosout
/turtlesim

ros中另外一个有用的功能是我们可以通过命令对节点进行重命名。例如,我们可以通过下述命令把 turtlesim 包中的 turtlesim_node节点名字修改为my_turtle。

$ rosrun turtlesim turtlesim_node __name:=my_turtle

修改之后我们再使用rosnode list查看当前活动的节点就可以看到如下结果:

/my_turtle
/rosout

如果我们还是可以看到/turtlesim节点,这可能是因为我们使用了Ctrl + C结束上一个活动节点而不是直接关闭窗口。
为了避免出现这种情况,我们可以使用:

$ rosnode cleanup

清理所有的节点,然后再重新执行ros run调用对应的节点。

接着,我们使用rosnode中的另一个命令ping来测试我们当前活动的节点。

$ rosnode ping /my_turtle

可以看到返回结果类似于下述形式:

rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://xiaochen:36823/	time=0.252008ms
xmlrpc reply from http://xiaochen:36823/	time=1.084089ms
xmlrpc reply from http://xiaochen:36823/	time=1.111031ms
xmlrpc reply from http://xiaochen:36823/	time=1.095057ms

说明本机能够有效链接到/my_turtle节点。

总结

本博客中主要介绍了使用

$ roscore

启动ROS。
接着使用:

$ rosrun turtlesim turtlesim_node

启动对应包中的相应节点。
或者使用下述命令,修改节点的名字。

$ rosrun turtlesim turtlesim_node __name:=my_turtle

接着使用下述命令查看当前活动的节点列表:

$ rosnode list

并通过下述命令查看指定节点的信息:

$ rosnode info [nodeName]

最后,可以通过下述命令测试活动节点的连通性:

$ rosnode ping [nodeName]

猜你喜欢

转载自blog.csdn.net/wxc_1998/article/details/121315832