当前位置: 首页 > news >正文

ROS学习笔记之《ROS里那些专有名词》

第一次使用ROS有很多第一次接触的名词:节点 话题 服务。。。

节点(Nodes)

  • 定义:节点是 ROS 系统里执行计算的进程。简单来说,一个节点就是一个单独运行的程序,它能完成特定的任务,比如控制机器人的电机、处理传感器数据等。
  • 作用:不同的节点可以分工合作,共同完成复杂的机器人任务。例如,一个节点负责读取激光雷达的数据,另一个节点对这些数据进行处理,还有一个节点根据处理后的数据规划机器人的路径。
  • 示例:在一个简单的机器人系统中,可能有一个节点专门用于控制机器人的轮子转动,它接收来自其他节点的运动指令,并将这些指令转化为电机的控制信号。

话题(Topics)

  • 定义:话题是节点之间进行通信的一种机制。节点可以向话题发布消息,也可以订阅话题以接收消息。话题就像是一个 “公告板”,节点可以在上面张贴消息(发布),也可以查看上面的消息(订阅)。
  • 作用:通过话题,节点之间可以实现松耦合的通信。一个节点不需要知道其他节点的具体信息,只需要知道话题的名称,就可以进行数据的发送和接收。这样可以提高系统的灵活性和可扩展性。
  • 示例:假设机器人上有一个摄像头节点,它会不断地将拍摄到的图像数据发布到名为/camera_image的话题上。而另一个节点(比如图像处理节点)可以订阅这个话题,获取图像数据并进行处理。

订阅(Subscription)

  • 定义:订阅指的是节点向特定话题表达接收消息的意愿。当节点订阅了某个话题,它就会持续监听该话题,一旦有新消息发布,节点就能接收到这些消息并进行相应处理。
  • 作用:让节点能够获取其他节点发布的信息,从而实现节点间的数据交互和协作。例如,机器人的决策节点可以订阅传感器节点发布的话题,获取环境数据来做出决策。
  • 示例:在 Python 中使用 ROS 2 订阅/topic话题的代码片段如下:
    import rclpy
    from rclpy.node import Node
    from std_msgs.msg import Stringclass MinimalSubscriber(Node):def __init__(self):super().__init__('minimal_subscriber')self.subscription = self.create_subscription(String,'topic',self.listener_callback,10)self.subscription  # prevent unused variable warningdef listener_callback(self, msg):self.get_logger().info('I heard: "%s"' % msg.data)def main(args=None):rclpy.init(args=args)minimal_subscriber = MinimalSubscriber()rclpy.spin(minimal_subscriber)minimal_subscriber.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

在这个例子中,MinimalSubscriber节点订阅了/topic话题,当有新消息发布时,会调用listener_callback函数进行处理。

发布(Publication)

消息队列(Message Queue)

功能包(Packages)

它们之间的关系

节点通过话题进行通信,而这些节点和相关的资源(如配置文件、启动脚本等)被组织在功能包中。一个功能包可以包含多个节点,这些节点可以通过话题相互协作,共同完成功能包所定义的任务。例如,在一个机器人的 SLAM(同步定位与地图构建)功能包中,可能包含一个激光雷达数据采集节点、一个地图构建节点和一个定位节点,它们通过不同的话题进行数据交换,最终实现 SLAM 的功能。

服务(Services)

动作(Actions)

消息(Messages)

参数服务器(Parameter Server)

启动文件(Launch Files)

  • 定义:与订阅相对,发布是节点向特定话题发送消息的操作。节点可以将自己产生的数据封装成消息,然后发布到指定的话题上,供其他订阅该话题的节点接收。
  • 作用:使节点能够将自己的计算结果或采集到的数据分享给其他节点,促进系统内的数据流通和协作。
  • 示例:同样在 Python 中使用 ROS 2 发布消息到/topic话题的代码片段如下:
    import rclpy
    from rclpy.node import Node
    from std_msgs.msg import Stringclass MinimalPublisher(Node):def __init__(self):super().__init__('minimal_publisher')self.publisher_ = self.create_publisher(String, 'topic', 10)timer_period = 0.5  # secondsself.timer = self.create_timer(timer_period, self.timer_callback)self.i = 0def timer_callback(self):msg = String()msg.data = 'Hello World: %d' % self.iself.publisher_.publish(msg)self.get_logger().info('Publishing: "%s"' % msg.data)self.i += 1def main(args=None):rclpy.init(args=args)minimal_publisher = MinimalPublisher()rclpy.spin(minimal_publisher)minimal_publisher.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

    在这个例子中,MinimalPublisher节点每隔 0.5 秒就会向/topic话题发布一条消息。

    回调函数(Callback Functions)

  • 定义:在订阅过程中,当节点接收到话题的新消息时,会调用预先定义好的函数来处理这些消息,这个函数就是回调函数。
  • 作用:确保节点能够及时、正确地处理接收到的消息。回调函数可以对消息进行解析、计算、存储等操作,以满足节点的功能需求。
  • 定义:在发布和订阅过程中,为了处理消息的发送和接收速度不一致的问题,会使用消息队列。当发布者发布消息的速度超过订阅者处理消息的速度时,消息会先存储在队列中,等待订阅者处理。
  • 作用:保证消息的有序处理和不丢失。同时,也可以避免因消息处理不及时而导致的系统崩溃或数据错误。
  • 示例:在create_subscriptioncreate_publisher函数中,最后一个参数通常用于指定消息队列的大小。例如self.create_subscription(String, 'topic', self.listener_callback, 10)中的10表示消息队列的最大长度为 10。
    • 示例:在上述订阅示例中,listener_callback就是回调函数,它接收接收到的消息并将其内容打印出来。
    • 定义:功能包是 ROS 系统中组织代码的基本单位。一个功能包包含了实现特定功能所需的所有文件,如源代码、配置文件、启动脚本等。
    • 作用:功能包使得代码的管理和复用变得更加方便。你可以将相关的代码和资源打包在一起,然后在不同的项目中重复使用。同时,功能包也便于团队协作开发,不同的开发者可以负责不同的功能包。
    • 示例:一个用于机器人导航的功能包可能包含了路径规划算法的源代码、地图文件、配置参数等。其他项目如果需要使用这个导航功能,只需要引入这个功能包即可。
    • 定义:服务是节点之间进行同步通信的一种机制。与话题的异步通信不同,服务基于请求 - 响应模式。一个节点向另一个节点发送请求,然后等待接收方处理请求并返回响应。
    • 作用:适用于需要明确结果的操作,例如查询机器人的当前状态、设置机器人的参数等。这种模式可以确保节点之间的交互具有确定性和可靠性。
    • 示例:你可以创建一个服务,用于请求机器人的电池电量。客户端节点发送一个查询电池电量的请求,服务端节点接收到请求后,读取电池电量信息并返回给客户端。
    • 定义:动作是一种用于处理长时间运行任务的通信机制,它结合了话题和服务的特点。动作包含目标(Goal)、反馈(Feedback)和结果(Result)三个部分。客户端向服务端发送一个目标,服务端在执行任务的过程中可以定期向客户端发送反馈信息,任务完成后返回最终结果。
    • 作用:对于像机器人导航、机械臂运动这样的长时间任务非常有用,因为它允许客户端实时了解任务的执行进度。
    • 示例:当你要求机器人移动到某个位置时,你可以通过动作机制发送一个目标位置。在机器人移动过程中,它会不断发送反馈信息(如当前位置、剩余距离等),最终到达目标位置后返回完成结果。
    • 定义:消息是节点之间通信的数据载体。无论是通过话题、服务还是动作进行通信,节点之间传递的都是消息。消息有特定的数据类型,例如整数、浮点数、字符串、数组等,也可以是自定义的复杂数据结构。
    • 作用:消息定义了节点之间数据交换的格式,确保发送方和接收方能够正确理解和处理数据。
    • 示例:在 ROS 中,有许多预定义的消息类型,如std_msgs/String(用于传递字符串消息)、sensor_msgs/LaserScan(用于传递激光雷达数据)。你也可以根据需要自定义消息类型。
    • 定义:参数服务器是一个全局的共享数据库,用于存储和管理节点的配置参数。节点可以从参数服务器读取参数,也可以将参数写入参数服务器。
    • 作用:方便对系统的配置参数进行集中管理和动态调整。例如,你可以在参数服务器中设置机器人的运动速度、传感器的采样频率等参数,不同的节点可以根据这些参数进行相应的操作。
    • 示例:在一个机器人导航系统中,你可以将地图的分辨率、导航算法的参数等存储在参数服务器中,导航节点在启动时从参数服务器读取这些参数,而不需要在代码中硬编码。
    • 定义:启动文件是用于一次性启动多个节点的配置文件。在 ROS 中,通常一个复杂的系统需要同时运行多个节点,手动逐个启动这些节点会非常繁琐。启动文件可以帮助你自动化这个过程。
    • 作用:简化系统的启动过程,提高开发和调试效率。同时,启动文件还可以设置节点的参数、指定节点的命名空间等。
    • 示例:你可以创建一个启动文件,同时启动激光雷达节点、地图构建节点和导航节点,并为每个节点设置相应的参数。在启动系统时,只需要运行这个启动文件即可。
http://www.xdnf.cn/news/267661.html

相关文章:

  • 分布式事务解决方案
  • BG开发者日志505:项目总体情况
  • 强化学习中的策略评估与改进:从理论到实践(二)
  • 【JAVA】数组与内存模型:二维数组底层实现(9)
  • IO模型和多路复用
  • TCP协议:三次握手与四次挥手解析
  • 定时器6计时功能
  • KBNE女装是什么牌子?KBNE女装属于什么档次质量如何?
  • 琴生不等式 (Jensen‘s Inequality)
  • 基于Springboot+Mysql的校园博客系统(含LW+PPT+源码+系统演示视频+安装说明)
  • 第 13 届蓝桥杯 C++ 青少组省赛中 / 高级组 2022 年真题(编程第一题)
  • 马克思最基本的哲学思想--改造世界以实现人的自由全面发展--deepseek
  • linux的时间轮
  • 音视频开发成长之路与音视频知识总结
  • Python实例题:Python获取房天下数据
  • 【第23节 系统工程】
  • 《解锁GCC版本升级:开启编程新世界大门》
  • PyTorch_张量转换为numpy数组
  • 【教学类-34-10】20250503(通义万相)4*3蝴蝶拼图(圆形、三角、正方、半圆的凹凸小块+参考图灰色)
  • 3392. 统计符合条件长度为 3 的子数组数目
  • RabbitMQ 中的六大工作模式介绍与使用
  • 【RocketMQ NameServer】- NameServer 启动源码
  • mysql安装,操作详解,适用于所有版本
  • 【25软考网工】第五章 (3)IPv6 报文格式、地址分类、过渡技术
  • 具备智能广告拦截、个性化定制的便捷网页浏览器
  • Python functools.partial 函数深度解析与实战应用
  • AI大模型基础设施:AMD的霄龙系列CPU
  • 学习海康VisionMaster之线线测量
  • 【Python生成器与迭代器】核心原理与实战应用
  • 打印Activity的调用者