ros学习5--Understanding Nodes (ROS节点理解)

本文系统配置ubuntu20.04+ros1,是初学者按照ros官网初级教程学习记录,仅作个人学习记录,如有问题可联系本文作者。

附上ros1官网学习教程链接Documentation - ROS Wikihttps://wiki.ros.org/ros2官网学习教程链接Project Governance — ROS 2 Documentation: Rolling documentationhttps://docs.ros.org/en/rolling/The-ROS2-Project/Governance.html

一、预备工作

因为本文中将会用到一个轻量级模拟器。如果之前安装的ROS不是完整桌面版(Desktop-Full),需要:

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

将<distro>替换成你安装的ROS发行版简称(比如kinetic或noetic等)。

二、图概念速览

计算图(Computation Graph)是一个由ROS进程组成的点对点网络,它们能够共同处理数据。ROS的基本计算图概念有节点(Nodes)、主节点(Master)、参数服务器(Parameter Server)、消息(Messages)、服务(Services)、话题(Topics)和袋(Bags),它们都以不同的方式向图(Graph)提供数据。

三、节点

节点实际上只不过是ROS软件包中的一个可执行文件。ROS节点使用ROS客户端库与其他节点通信。节点可以发布或订阅话题,也可以提供或使用服务

节点是ROS中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:

例如,有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。

四、客户端库

ROS客户端库可以让用不同编程语言编写的节点进行相互通信:

  • rospy = Python客户端库
  • roscpp = C++客户端库

五、roscore

roscore是你在运行所有ROS程序前首先要运行的命令。

请运行:

$ roscore

输出如下:

 

如果roscore运行后没有初始化,很有可能是网络配置的问题。参见网络配置 - 单机器配置

如果roscore不能初始化并提示缺少权限,可能是因为~/.ros目录属于root用户(只有root用户才能访问),可以用以下命令递归地更改该目录的所有权:

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

六、使用rosnode

打开一个终端,可以使用rosnode看看roscore运行时干了些什么, 需要保持以前的终端开着,比如打开一个新的标签页,或者最小化之前的窗口。

rosnode显示当前正在运行的ROS节点信息。rosnode list命令会列出这些活动的节点:

$ rosnode list

输出如下:

这表示当前只有一个节点在运行: rosout。因为这个节点用于收集和记录节点的调试输出,所以它总是在运行的。

【注意: 当打开一个新的终端时,环境将会重置,~/.bashrc文件将会生效。如果你在运行rosnode等命令时出现一些问题,那么可能需要将一些环境设置文件添加到~/.bashrc或手动source】

而rosnode info命令返回的是某个指定节点的信息。

$ rosnode info /rosout

输出如下:

这给了我们更多关于rosout的信息, 比如说实际上它是发布了一个/rosout_agg话题。

七、使用rosrun

rosrun可以用包名直接运行软件包内的节点,不需要知道包的路径。

用法:

$ rosrun [package_name] [node_name]

现在我们试着运行turtlesim包中的turtlesim_node,在一个终端中:

$ rosrun turtlesim turtlesim_node

注意:此处的乌龟可能和你turtlesim窗口上的不同。别担心,实际上有许多版本的turtle ,而你的是个惊喜!(一个可爱的小彩蛋~)】

在一个终端中:

$ rosnode list

输出如下:

 

ROS有一个强大的功能,就是你可以通过命令行重新分配名称。

关闭turtlesim窗口以停止节点(或回到rosrun turtlesim的终端并按Ctrl+C)。现在让我们重新运行它,但是这一次使用重映射参数来改变节点名称:

$ rosrun turtlesim turtlesim_node __name:=my_turtle

现在,如果我们回去使用rosnode list:

$ rosnode list 

输出如下:

如果你仍看到/turtlesim在列表中,这可能因为你是在终端中使用Ctrl+C停止的节点而不是关闭窗口,或者你没有按网络配置 - 单机器配置中的描述定义$ROS_HOSTNAME环境变量。可以尝试清除下rosnode列表:

$ rosnode cleanup

我们可以看到新的/my_turtle节点。使用另外一个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

(此处个人保留)

本节主要学习了主节点等相关内容:

  • roscore = ros+core:主节点(为ROS提供命名服务) + rosout (stdout/stderr) + 参数服务器(会在以后介绍)
  • rosnode = ros+node:获取节点信息的ROS工具
  • rosrun = ros+run:运行给定的软件包中的节点

在了解ROS节点是如何工作的之后,可以继续接下来的学习了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值