求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 
ROS教程
1.初级教程
1.1 安装和配置ROS环境
1.2 ROS文件系统导览
1.3 创建ROS软件包
1.4 构建ROS软件包
1.5 理解ROS节点
1.6 理解ROS话题
1.7 理解ROS服务和参数
1.8 使用rqt_console和roslaunch
1.9 使用rosed在ROS中编辑文件
1.10 创建ROS消息和服务
1.11 编写简单的发布者和订阅者(C++)
1.12 编写简单的发布者和订阅者(Python)
1.13 检验简单的发布者和订阅者
1.14 编写简单的服务和客户端(C++)
1.15 编写简单的服务和客户端(Python)
1.16 检验简单的服务和客户端
1.17 录制和回放数据
1.18 从bag文件中读取消息
1.19 roswtf入门
1.20 探索ROS维基
1.21 接下来做什么?
2.中级教程
2.1手动创建ROS包
2.2管理系统依赖项
2.3Roslaunch在大型项目中的使用技巧
2.4ROS在多机器人上的使用
2.5自定义消息
2.6在python中使用C++类
2.7如何编写教程
ROS标准
ROS开发者指南
标准计量单位和坐标约定
 
 
理解ROS节点
来源: ros.org 在线教程    编辑:Alice(火龙果软件)
645 次浏览
4次  

描述: 该教程介绍了ROS图的概念,并探讨了roscore、rosnode和rosrun命令行工具的使用。

教程级别:初学者

预备工作

本教程中我们将会用到一个轻量级模拟器。如果你之前安装的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)提供数据。

  • 节点(Nodes):节点是一个可执行文件,它可以通过ROS来与其他节点进行通信。

  • 消息(Messages):订阅或发布话题时所使用的ROS数据类型。

  • 话题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息。

  • 主节点(Master):ROS的命名服务,例如帮助节点发现彼此。

  • rosout:在ROS中相当于stdout/stderr(标准输出/标准错误)。

  • roscore:主节点 + rosout + 参数服务器(会在以后介绍)。

节点

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

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

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

客户端库

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

  • rospy = Python客户端库

  • roscpp = C++客户端库

罗斯科

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

请运行:

$ roscore

然后你会看到类似下面的输出信息:

... logging to ~/.ros/log/9cf88ce4
-b14d-11df-8a75-00251148e8cf/
roslaunch-machine_name-13039.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://machine_name:33919/ ros_comm version 1.4.7 SUMMARY ======== PARAMETERS * /rosversion * /rosdistro NODES auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4
-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] started core service [/rosout]

 

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

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

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

使用rosnode

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

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

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

$ rosnode list

 

你会看到:

/rosout

 

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

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

$ rosnode info /rosout

 

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

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

Subscriptions:
 * /rosout [unknown type]

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

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

 

现在,让我们看看其他节点。为此,我们将使用rosrun调出另一个节点。

使用罗斯伦

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

用法:

$ rosrun [package_name] [node_name]

 

所以现在我们试着运行turtlesim包中的turtlesim_node。

在一个新终端中:

$ rosrun turtlesim turtlesim_node

 

你会看到turtlesim窗口:

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

在一个新终端中:

$ rosnode list

 

你会看到类似下面的输出信息:

/rosout
/turtlesim

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

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

$ rosrun turtlesim turtlesim_
node __name:=my_turtle

 

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

$ rosnode list

 

你会看到类似下面的输出信息:

/rosout
/my_turtle

 

注意:如果你仍看到/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节点是如何工作的,下一步,我们来看看理解ROS话题。如果想关闭turtlesim_node,可以随时按下Ctrl+C。

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



645 次浏览
4次