才子佳人博客

我的故事我讲述

ROS简介
 
来源:blog.csdn.net  编辑:xjh  2023-06-27

ROS是一种开源的机器人操作系统,它提供了一个分布式的通信框架和一系列的工具和库,使得机器人软件开发变得更加容易和灵活。ROS的常见术语和基本原理如下所述:

一、ROS简介

节点通信原理

ROS中的节点是指运行在不同进程或机器上的独立应用程序,节点之间的通信是通过ROS的master节点来实现的。当一个节点需要与其他节点通信时,它首先要向master节点注册自己,并查询其他节点的信息,比如名称、主题等。然后它可以通过发布器(publisher)和订阅器(subscriber)来发布和接收消息,消息会被master节点转发给订阅者的回调函数。

ROS消息格式

ROS的消息格式是基于ROS定义的消息格式,它是一种文本格式,用于在节点之间传输数据。每个消息类型都有一个由字符串表示的名称和一组由类型和名称组成的字段。ROS使用消息描述文件(.msg)来定义消息类型,这些文件通常以文本格式保存,并由ROS常规库提供的消息生成工具生成对应的源代码。

ROS参数服务器

ROS参数服务器是一个全局的键-值存储系统,用于节点之间的参数共享和修改。节点可以使用ROS API来读取和写入参数服务器中的参数,这些参数在ROS系统启动时从配置文件中加载,并可以在运行时动态修改。

ROS启动过程

ROS的启动过程主要包括master节点的启动,参数服务器的初始化,节点的注册和通信的建立。在ROS系统启动时,master节点会被首先启动,并监视节点的注册、卸载和通信请求。每个节点注册后,master会将它们加入到网络拓扑结构中,并将节点之间建立起通信。

ROS客户端库

ROS客户端库是一组用于构建和使用ROS节点和其它ROS工具的库,包括C++、Python等语言。ROS客户端库提供了一系列的API,包括用于节点注册和卸载、消息发布和订阅、参数读写和服务调用等功能。这些API封装了ROS系统中的底层细节,使得用户可以更加方便地使用ROS。

二、ROS系统的核心组件

节点(Node)

ROS节点是ROS系统中最基本的运行单元,它可以是一个独立的进程,也可以是多个进程的组合。节点之间可以通过发布/订阅、服务调用、参数服务器等方式进行通信和交互。例如,在开发一个机器人控制系统时,可以将机器人控制板的驱动部分作为一个节点,将感应器部分作为另一个节点。控制板节点通过发布电机控制指令到主题中,感应器节点通过订阅主题获取机器人编码器数据,两个节点通过主题通信协作实现了机器人的控制。

主节点(Master)

主节点是ROS系统的中心管理机构,负责节点之间的协调和通信。主要维护了节点之间的配对关系和消息路由信息,同时也负责节点之间的服务调用和参数传递等功能。例如,在访问ROS系统之前,必须先启动主节点。所有的节点在启动时都会向主节点注册,主节点管理节点之间的通信,包括查找节点、创建主题、建立服务等。

消息(Message)

ROS消息是ROS节点之间进行数据交换的基本单元,它可以是各种数据类型的结构体,包括数字、字符串、图像、点云等。消息可以通过主题进行发布和订阅。例如,在ROS中,常用的消息格式有std_msgs/Int32、sensor_msgs/Image、geometry_msgs/Point等,这些消息类型可以通过定义消息格式来实现节点之间的数据传递。

话题/主题(Topic)

话题是ROS节点之间消息传递的通道,它可以被认为是一个消息队列,其中包含了一个或多个发布者和订阅者。发布者负责将消息发送到主题,而订阅者则从主题中接收消息。主题的消息传递是异步的,并且是单向的,即发布者将消息发送到主题,而订阅者从主题中接收消息。例如,在机器人控制系统中,将电机控制指令发布到主题中,所有订阅该主题的节点都可以接收到这个消息。

服务(Service)

服务是ROS节点之间同步通信的一种方式,它可以被认为是一种RPC(远程过程调用)机制。服务请求者向服务提供者发送请求消息,服务提供者接收请求并发送响应消息给服务请求者。服务请求和响应是一对一的,请求者发送一个消息并等待回应。例如,在ROS中,可以创建一个名为“/add_two_ints”的服务,该服务接收两个整数,然后返回它们的和。

参数服务器(Parameter Server)

ROS参数服务器是ROS节点之间共享数据的一种机制,它可以存储节点的共享参数,并被所有节点访问和修改。参数服务器通常被用来存储配置参数、机器人模型参数等信息。例如,在机器人控制系统中,可以将机器人的PID控制器参数存储在参数服务器中,所有节点都可以访问这些参数并通过修改它们来修改控制器行为。

三、消息的订阅与发布

ROS要解决通信问题

ROS解决通信问题是为了让机器人系统中各个组件可以相互通信,实现数据交换和共享资源。在机器人系统中,不同的组件或节点需要传递消息来共同完成任务,例如传感器节点、控制节点、执行节点等都需要相互通信来实现机器人的控制和操作。而且,机器人系统中的节点数量通常非常庞大,需要实现高效、可靠的通信才能保证机器人系统的正确运行。

ROS通过提供基于消息传递的通信机制,让机器人系统中的各个组件之间可以方便、高效地传递消息和数据,让机器人系统更加容易地协同工作和实现复杂任务。同时,ROS提供了多种通信协议,以适应不同环境下的问题,让机器人开发者们可以根据实际需要灵活地选择适合的通信方式。

ROS中一个节点的诞生过程

在ROS中,一个节点的诞生过程可以大致分为以下步骤:

初始化ROS系统

第一步是调用 ros::init() 函数,在ROS系统启动时完成。该函数会读取命令行参数,检查ROS参数和ROS Master的启动情况,确保ROS系统的正确运行。如果ROS系统已经被初始化过,则调用此函数无效。

创建ROS节点

调用 ros::NodeHandle nh 函数,可以创建 ROS 节点,并在ROS系统中注册它的身份。在创建节点时,可以通过 ros::NodeHandle 构造函数中附加命名空间信息,从而在ROS系统中创建具有唯一命名的节点。这样一个ROS节点就被成功地创建出来了。

注册节点

在节点完成创建之后,需要将其注册到ROS Master上,以便其他节点可以找到并与之通信。使用 ros::spin() 函数或 ros::spinOnce() 函数来将节点注册到ROS Master上。

发布和订阅主题

节点需要订阅和发布主题以进行消息交换。创建它们的方法分别是 ros::Publisher 和 ros::Subscriber。创建它们后,就可以开始发布和订阅主题了。

服务调用

节点可以通过在ROS系统中注册服务以接受请求,并使用 ros::ServiceClient 向其他节点发送请求并获取响应。

处理消息

在启动节点后,它会不断等待从订阅的主题上接收到的消息,然后执行相应的回调函数进行处理。

以上就是ROS节点的诞生过程,节点可以创建、订阅和发布主题、调用服务以及处理消息。这些可以通过使用ROS提供的多种API来简化实现。需要注意的是,在节点中必须调用 ros::spin() 函数或 ros::spinOnce() 函数来启动节点和注册到ROS Master上,否则节点将无法接收到任何消息。

四、ROS核心函数分析

construct()函数

在创建ROS节点时,ros::NodeHandle 构造函数中会用到construct() 函数。

ros::start()函数

在 ros::start() 函数中,首先使用互斥锁保证函数的线程安全性。如果 ROS 系统已经启动,则跳过不执行任何操作。

接着,函数标志 ROS 系统正在启动中,并初始化一些相关的变量和选项。然后,函数解析 ROSCPP_ENABLE_DEBUG 环境变量,并决定是否启用 ROS 的调试模式。

接下来,函数初始化 TCP 连接会话的 keepalive 选项,并注册一个回调函数,以便在不同的线程中检查 ROS 系统是否需要关闭。然后绑定 ROS 的关闭命令到 XML-RPC 端口上,并初始化 ROS 的定时器管理器。

接下来,函数启动 ROS 的各种管理器,包括话题管理器、服务管理器、连接管理器、轮询管理器和 XML-RPC 管理器。如果在初始化过程中没有设置 NoSigintHandler 选项,则安装一个 SIGINT 信号处理函数。然后,函数初始化 ROS 时间,并创建一个 ROSOutAppender 对象,将日志消息输出到 roscpp/Logger 这个话题上。

接着,函数注册 get_loggers 和 set_logger_level 这两个服务。如果启用了调试模式,则注册一个关闭所有连接的服务。如果使用仿真时间,则设置 ROS 时间的当前值,并订阅 /clock 话题。

最后函数创建一个线程,运行内部回调队列的轮询线程函数,并输出 ROS 系统的启动信息,并记录日志。如果在启动中断期间接收到关闭请求,则等待关闭完全完成后再返回。

五、各个管理器的作用

下面我们分别来详细解释一下这5种管理器的作用,ROS的各种管理器,包括话题管理器、服务管理器、连接管理器、轮询管理器和 XML-RPC 管理器。

话题管理器

话题管理器负责管理 ROS 中的话题(Topic),它维护了一个话题列表,以及每个话题监听器和发布者的列表。当一个话题有新的消息发布时,话题管理器会将该消息推送到所有已经注册的监听器。话题管理器可以通过ros::Subscriber和ros::PublisherAPI来添加和删除话题的监听器和发布者。

服务管理器

服务管理器负责管理 ROS 中的服务(Service),它维护了一个服务列表,以及每个服务的监听器和客户端列表。当一个服务请求被发送时,服务管理器会将该请求转发给已经注册的服务监听器,并等待响应。服务管理器可以通过ros::ServiceServer和ros::ServiceClientAPI来添加和删除服务的监听器和客户端。

连接管理器

连接管理器负责管理 ROS 中的连接。它维护了一个连接列表,以及每个连接的状态和元数据。当用户通过ros::Publisher或ros::SubscriberAPI创建一个新的发布者或监听器时,连接管理器会为这个节点创建一个新的连接。当一个连接关闭时,连接管理器会从列表中删除这个连接,然后通知话题/服务管理器更新关联的监听器/服务的状态。

轮询管理器

轮询管理器负责执行轮询操作,以检查是否有新的 ROS 消息到达,或者是否有新的 XML-RPC 请求需要处理。轮询管理器根据一定的时间间隔执行轮询操作,并且可以通过ros::spin()等API来配合使用。

XML-RPC 管理器

XML-RPC 管理器负责处理 ROS 节点之间的 XML-RPC 请求。当 ROS 节点需要进行某些操作,比如发布一个新的消息或者调用某个服务时,它们将会向 XML-RPC 管理器发送一个 XML-RPC 请求。XML-RPC 管理器会接收这些请求,并将它们转发给对应的节点执行,然后将响应返回给请求方。

来源参考:
https://blog.csdn.net/weixin_48628189/article/details/129974025?spm=1001.2014.3001.5501


分类:网络日志| 查看评论
相关文章
文章点击排行
本年度文章点击排行
发表评论:
  • 昵称: *
  • 邮箱: *
  • 网址:
  • 评论:(最多100字)
  • 验证码: