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_subscription
和create_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 中,通常一个复杂的系统需要同时运行多个节点,手动逐个启动这些节点会非常繁琐。启动文件可以帮助你自动化这个过程。
- 作用:简化系统的启动过程,提高开发和调试效率。同时,启动文件还可以设置节点的参数、指定节点的命名空间等。
- 示例:你可以创建一个启动文件,同时启动激光雷达节点、地图构建节点和导航节点,并为每个节点设置相应的参数。在启动系统时,只需要运行这个启动文件即可。
- 示例:在上述订阅示例中,