问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ROS入门 — 2、ROS通信机制

创作时间:
作者:
@小白创作中心

ROS入门 — 2、ROS通信机制

引用
CSDN
1.
https://m.blog.csdn.net/A1127409282/article/details/139698480

本文详细介绍了ROS(Robot Operating System)的通信机制,包括节点、话题、服务和参数服务器的理论模型和操作指令。对于ROS初学者来说,本文将帮助你快速理解ROS的核心概念和基本操作。

一、ROS节点

1.1 ROS计算图

计算图(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 + 参数服务器(会在以后介绍)

1.2 节点

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

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

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

1.3 节点相关操作指令

1.3.1 roscore

  • 作用:roscore运行一个master+rosout+参数服务器,是运行所有ROS程序前首先要运行的命令。

  • 用法:

roscore
  • 注:

  • 如果roscore运行后没有初始化,很有可能是网络配置的问题。

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

sudo chown -R <your_username> ~/.ros

1.3.2 rosnode

  • 作用:rosnode显示当前正在运行的ROS节点信息

  • 用法:

rosnode list :列出启动的节点
rosnode info /rosout(某节点) :返回的是某个指定节点的信息。
rosnode ping my_turtle(某节点):测试某节点的是否正常
  • 注:

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

1.3.3 rosrun

  • 作用:用包名直接运行软件包内的节点(而不需要知道包的路径)。

  • 用法:

rosrun [package_name] [node_name]

二、ROS话题

2.1 话题通信理论模型

话题通信实现模型涉及到三个角色:

  • ROS Master (管理者):负责保管 Talker 和 Listener 注册的信息,并匹配话题相同的 Talker 与 Listener,帮助 Talker 与 Listener 建立连接
  • Talker (发布者):Talker 发布消息
  • Listener (订阅者):Listener 订阅消息

流程实现步骤:

  • Talker注册:Talker启动后,会通过RPC在 ROS Master 中注册自身信息,其中包含所发布消息的话题名称。ROS Master 会将节点的注册信息加入到注册表中。

  • Listener注册:Listener启动后,也会通过RPC在 ROS Master 中注册自身信息,包含需要订阅消息的话题名。ROS Master 会将节点的注册信息加入到注册表中。
  • ROS Master实现信息匹配:ROS Master 会根据注册表中的信息匹配Talker 和 Listener,并通过 RPC 向 Listener 发送 Talker 的 RPC 地址信息。
  • Listener向Talker发送请求:Listener 根据接收到的 RPC 地址,通过 RPC 向 Talker 发送连接请求,传输订阅的话题名称、消息类型以及通信协议(TCP/UDP)。
  • Talker确认请求:Talker 接收到 Listener 的请求后,也是通过 RPC 向 Listener 确认连接信息,并发送自身的 TCP 地址信息。
  • Listener与Talker件里连接:Listener 根据步骤4 返回的消息使用 TCP 与 Talker 建立网络连接。
  • Talker向Listener发送消息:连接建立后,Talker 开始向 Listener 发布消息。

  • 上述实现流程中,前五步使用的 RPC协议,最后两步使用的是 TCP 协议
  • Talker 与 Listener 的启动无先后顺序要求
  • Talker 与 Listener 都可以有多个
  • Talker 与 Listener 连接建立后,不再需要 ROS Master。也即,即便关闭ROS Master,Talker 与
    Listern 照常通信。

2.2 话题相关操作指令

2.2.1 rostopic

  • 作用:获取ROS话题的信息。

  • 用法:

rostopic echo [topic]:显示在topic话题上发布的数据。
rostopic list -v(选项):列出当前已被订阅和发布的所有话题。 -v:会列出所有发布和订阅的主题及其类型的详细信息。
rostopic type [topic]:来查看topic话题的消息类型。
rostopic pub [topic] [msg_type] [args]:向topic话题中发送具体msg_type类型、具体args参数的的数据
rostopic hz [topic]:查看topic话题中数据的发布速率

2.3 ROS消息

话题的通信是通过节点间发送ROS消息实现的。为了使发布者和订阅者进行通信,发布者和订阅者必须发送和接收相同类型的消息。所以ROS中的话题与消息,就好比生活中的水管和水。发布者与订阅者先通过水管
(话题)进行连接,随后开通水流(发送消息)。

  • ROS消息查看指令:
rosmsg show 消息:查看消息的详细信息

三、ROS服务

3.1 服务通信理论模型

服务通信中模型涉及到三个角色:

  • ROS master(管理者):保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接
  • Server(服务端):Client 发送请求信息
  • Client(客户端):Client 发送请求信息

流程实现步骤:

  • Server注册:Server 启动后,会通过RPC在 ROS Master 中注册自身信息,其中包含提供的服务的名称。ROS Master 会将节点的注册信息加入到注册表中。
  • Client注册:Client 启动后,也会通过RPC在 ROS Master 中注册自身信息,包含需要请求的服务的名称。ROS Master 会将节点的注册信息加入到注册表中。
  • ROS Master实现信息匹配:ROS Master 会根据注册表中的信息匹配Server和 Client,并通过 RPC 向 Client 发送 Server 的 TCP 地址信息。
  • Client发送请求:Client 根据步骤2 响应的信息,使用 TCP 与 Server 建立网络连接,并发送请求数据。
  • Server发送响应:Server 接收、解析请求的数据,并产生响应结果返回给 Client。

注:

  • 客户端请求被处理时,需要保证服务器已经启动;
  • 服务端和客户端都可以存在多个。

3.2 服务相关操作指令

3.2.1 rosservice

  • 作用:获取服务信息

  • 用法:

rosservice list:查看启动的所有服务
rosservice type [service]:输出service服务的类型
rosservice type /spawn | rossrv show:查看/spawn服务的rossrv show信息
rosservice call [service] [args]:用给定的args参数调用service服务
rosservice find [service]        按服务的类型查找服务
rosservice uri          输出服务的ROSRPC uri

四、ROS参数服务器

4.1 参数服务器理论模型

参数服务器中模型涉及到三个角色:

  • ROS Master (管理者):公共容器保存参数
  • Talker (参数设置者):向容器中设置参数
  • Listener (参数调用者):获取参数

流程实现步骤:

  • Talker 设置参数:Talker 通过 RPC 向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中。
  • Listener 获取参数:Listener 通过 RPC 向参数服务器发送参数查找请求,请求中包含要查找的参数名。
  • ROS Master 向 Listener 发送参数值:OS Master 根据步骤2请求提供的参数名查找参数值,并将查询结果通过 RPC 发送给 Listener。

参数可使用数据类型:

32-bit integers booleans strings
doubles iso8601 dates base64-encoded binary data
字典 lists

注意:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据

4.2 参数服务器相关操作指令

4.2.1 rosparam

  • 作用:能让我们在ROS参数服务器上存储和操作数据

  • 用法

rosparam set [param_name] [value]:设置参数
rosparam get [param_name]:获取参数
rosparam load [file_name] [namespace]:从文件中加载参数,还可以对文件重命名。
rosparam dump [file_name] [namespace]:向文件中转储参数
rosparam delete [param_name]:删除参数
rosparam list:查看参数服务器所有参数
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号