ROS1云课→07基础概念
Posted zhangrelay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS1云课→07基础概念相关的知识,希望对你有一定的参考价值。
上一篇中提及的基础概念的中文详细介绍补充如下:
节点与nodelet(动态加载节点)--内部可通信的多个节点
节点都是各自独立的可执行文件,能够通过主题、服务或参数服务器与其他进程(节点)通信。ROS通过使用节点将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。
ROS有另一种类型的节点,称为nodelet。这类特殊节点可以在单个进程中运行多个节点,其中每个nodelet为一个线程(轻量级进程)。这样,可以在不使用ROS网络的情况下与其他节点通信,节点通信效率更高,并避免网络拥塞。nodelet对于摄像头和3D传感器这类数据传输量非常大的设备特别有用。
节点在系统中必须有唯一的名称。节点使用特定名称与其他节点进行通信而不产生歧义。节点可以使用不同的库进行编写,如roscpp和rospy。roscpp基于C++,而rospy基于Python。在这本书里,我们将使用roscpp。
ROS提供了处理节点的工具,如rosnode。rosnode是一个用于显示节点信息的命令行工具,例如列出当前正在运行的节点。支持的命令如下所示:
- rosnode info NODE 输出当前节点信息。
- rosnode kill NODE 结束当前运行节点进程或发送给定信号。
- rosnode list 列出当前活动节点。
- rosnode machine hostname 列出某一特定计算机上运行的节点或列出主机名称。
- rosnode ping NODE 测试节点间的连通性。
- rosnode cleanup 将无法访问节点的注册信息清除。
在接下来的课程中,将通过一些示例学习如何使用这些命令。
ROS1节点的一个强大功能是可以在启动该节点时更改参数。此功能能够改变节点名称、主题名称和参数名称。无需重新编译代码就能重新配置节点,这样就可以在不同的场景中使用该节点。
一个改变主题名称的例子如下所示:
$ rosrun xxx_tutorials tutorialX topic1:=/level1/topic1
此命令将主题名称从topic1改为/level1/topic1。相信现在还不理解,但在后面的课程中会发现它的实用性。例如遥控多个小乌龟或机器人等。
更改节点中的参数和更改主题名称很类似。只需要在参数名称前添加一个下划线(_) ,例如:
$ rosrun xxx_tutorials tutorialX _param:=9.0
这样参数(param)就设置为浮点数9.0。
注意,不能使用系统保留的关键字名称,包括:
- __name 为节点名称保留的一个特殊关键字。
- __log 为记录节点日志存储地址保留的一个关键字。
- __ip和__hostname 表示ROS_IP和ROS_HOSTNAME的关键字。
- __master 表示ROS_MASTER_URI的关键字。
- __ns 表示ROS_NAMESPACE的关键字。
主题
主题(Topics )是节点间用来传输数据的总线。通过主题进行消息路由不需要节点之间直接连接。这就意味着发布者和订阅者之间不需要知道彼此是否存在。同一个主题也可以有很多个订阅者。一个主题可以有多个订阅者也可以有多个发布者,但是你需要注意用不同的节点发布同样的主题,否则会产生冲突。
每个主题都是强类型的,发布到主题上的消息必须与主题的ROS消息类型相匹配,并且节点只能接收类型匹配的消息。节点要想订阅主题,就必须具有相同的消息类型。
ROS的主题可以使用:
- TCP/IP和UDP传输。基于TCP传输称为TCPROS,它使用TCP/IP长连接。这是ROS默认的传输方式。
- 基于UDP传输称为UDPROS,它是一种低延迟高效率的传输方式,但可能产生数据丢失。所以它最适合于像远程操控的任务。
ROS1有一个rostopic工具用于主题操作。它是一个命令行工具,可获取主题的相关信息或直接在网络上发布数据。此工具的参数如下:
- rostopic bw /topic 显示主题所使用的带宽。
- rostopic echo /topic 将消息输出到屏幕。
- rostopic find message_type 按照类型查找主题。
- rostopic hz /topic 显示主题的发布频率。
- rostopic info /topic 输出活动主题、发布的主题、主题订阅者和服务的信息。
- rostopic list 输出活动主题的列表。
- rostopic pub /topic type args 将数据发布到主题。它允许我们直接从命令行中对任意主题创建和发布数据。
- rostopic type /topic 输出主题的类型,或者说主题中发布的消息类型。
在后面的课程中学习如何使用这些命令。
服务
当需要直接与节点通信并获得应答时(RPC),将无法通过主题实现,而需要使用服务。
服务需要由用户开发,节点并不提供标准服务。包含消息源代码的文件存储在srv文件夹中。
像主题一样,服务关联一个以功能包中.srv文件名称来命名的服务类型。与其他基于ROS文件系统的类型一样,服务类型是功能包名称和.srv文件名称的组合。
ROS关于服务的命令行工具有两个:rossrv和rosservice。可以通过rossrv看到有关服务数据结构的信息,并且与rosmsg具有完全一致的用法。
通过rosservice可以列出服务列表和查询某个服务。支持的命令如下所示:
- rosservice call /service args 根据命令行参数调用服务。
- rosservice find msg-type 根据服务类型查询服务。
- rosservice info /service 输出服务信息。
- rosservice list 输出活动服务清单。
- rosservice type /service 输出服务类型。
- rosservice uri /service 输出服务的ROSRPC URI。
消息
一个节点通过向特定主题发布消息,从而将数据发送到另一个节点。消息具有一定的类型和数据结构,包括ROS1提供的标准类型和用户自定义类型。
消息的类型在ROS1中按照以下标准命名方式进行约定:功能包名称/文件名称.msg。例如,std_msgs/msg/String.msg的消息类型是std_msgs/String。
ROS1使用命令行工具rosmsg来获取有关消息的信息。常用参数如下所示:
- rosmsg show 显示一条消息的字段。
- rosmsg list 列出所有消息。
- rosmsg package 列出功能包的所有消息。
- rosmsg packages 列出所有具有该消息的功能包。
- rosmsg users 搜索使用该消息类型的代码文件。
- rosmsg md5 显示一条消息的MD5求和结果。
消息记录包
消息记录包(bag)是由ROS创建的一组文件。它使用.bag格式保存消息、主题、服务和其他ROS数据信息。你可以在事件发生后,通过使用可视化工具调用和回放数据,检查在系统中到底发生了什么。你可以播放、停止、后退及执行其他操作。
记录包文件可以像实时会话一样在ROS中再现情景,在相同时间向主题发送相同的数据。通常情况下,我们可以使用此功能来调试算法。
若要使用记录包文件,我们可以使用以下ROS工具:
- rosbag 用来录制、播放和执行其他操作。
- rqt_bag 用于可视化图形环境中的数据。
- rostopic 查看节点发送的主题。
节点管理器
ROS节点管理器(ROS master)为ROS系统中其他节点提供命名和注册服务。它像服务一样跟踪主题的发布者和订阅者。节点管理器的作用是使ROS节点之间能够相互查找。一旦这些节点找到了彼此,就能建立点对点的通信。你可以看到以图例显示的ROS执行步骤,包括广播一个主题,订阅一个主题,发布一个消息,如下图所示:
节点管理器还提供了参数服务器。节点管理器通常使用roscore命令运行,它会加载ROS节点管理器及其他ROS核心组件。
参数服务器
参数服务器(Parameter Server)是可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时的参数。
参数服务器使用XMLRPC实现并在ROS节点管理器下运行,这意味着它的API可以通过通用的XMLRPC库进行访问。XMLRPC是一个使用XML编码并以HTTP作为传输机制的远程调用(Remote Procedure Call,RPC)协议。
参数服务器使用XMLRPC数据类型为参数赋值,包括以下类型:
- 32位整数(32-bit integer)
- 布尔值(Boolean)
- 字符串(String)
- 双精度浮点(Double)
- ISO 8601日期(ISO8601 date)
- 列表(List)
- 基于64位编码的二进制数据(Base64-encoded binary data)
ROS中关于参数服务器的工具是rosparam。其支持的参数如下所示:
- rosparam list 列出了服务器中的所有参数。
- rosparam get parameter 获取参数值。
- rosparam set parameter value 设置参数值。
- rosparam delete parameter 删除参数。
- rosparam dump file 将参数服务器保存到一个文件。
- rosparam load file 加载参数文件到参数服务器。
以上是关于ROS1云课→07基础概念的主要内容,如果未能解决你的问题,请参考以下文章