目录
话题通信(Topics)
话题是一种发布/订阅(Publish/Subscribe)通信机制,节点可以通过发布者(Publisher)将消息发送到话题,其他节点则可以通过订阅者(Subscriber)接收这些消息。
以下是话题通信的主要特点和使用方法:
-
发布者(Publisher):发布者是将消息发送到话题的节点。它们通过指定话题名称和消息内容来发布消息。发布者可以是任何ROS节点,通过ROS提供的API来创建并发布消息。例如,一个激光传感器节点可以将激光扫描数据发布到名为"/scan"的话题上。
-
订阅者(Subscriber):订阅者是从话题接收消息的节点。它们通过指定要订阅的话题名称来接收消息。一旦订阅了话题,订阅者就会收到发布者发送到该话题的所有消息。订阅者可以处理收到的消息并采取相应的行动。例如,一个移动机器人的导航节点可以订阅激光传感器发布的"/scan"话题,以进行障碍物检测和避障。
-
消息(Message):消息是在话题上传输的数据单元。它们可以是任何数据类型,包括基本数据类型(例如整数、浮点数)以及自定义数据类型(例如传感器数据、控制命令)。在ROS中,消息由.msg文件定义,包含消息的数据结构和字段。发布者和订阅者必须使用相同的消息类型来确保正确的消息传输。
-
话题名称(Topic Name):话题名称是唯一标识一个话题的字符串。在ROS中,话题名称通常以斜杠("/")开头,例如"/scan"、"/odom"等。发布者和订阅者通过指定话题名称来连接到特定的话题。
通过话题通信,ROS节点可以实现松散耦合的通信,使得系统模块化且易于扩展。这种通信方式也支持多对多的通信模式,允许多个节点同时发布和订阅同一个话题,从而实现复杂的数据交换和协作。
服务通信(Services)
服务是一种请求/响应(Request/Response)通信机制,节点可以提供服务,其他节点可以发送请求并等待响应。
服务的定义通常保存在.srv
文件中,其中包含请求和响应的消息类型及其字段。例如,一个简单的服务定义文件可能如下所示:
int64 a
int64 b
---
int64 sum
这个服务定义了一个包含两个整数参数的请求(a和b),以及一个整数结果的响应(sum)。
-
服务节点(Service Node):服务节点是提供或调用服务的ROS节点。一个节点可以同时作为服务的提供者和服务的调用者,也可以只提供服务或只调用服务。
-
服务提供者(Service Provider):服务提供者是提供特定服务的节点。它将服务请求消息作为输入,并根据请求执行相应的任务,然后将结果打包到响应消息中返回给服务调用者。
-
服务调用者(Service Caller):服务调用者是发送服务请求的节点。它将请求消息发送给服务提供者,并等待响应消息返回。一旦收到响应,服务调用者就可以继续执行其他任务。
-
服务通信流程:
- 服务调用者创建一个与所需服务相匹配的客户端(Client),并填充请求消息。
- 客户端将请求消息发送到服务提供者。
- 服务提供者接收到请求消息,执行相应的任务,并将结果打包到响应消息中。
- 服务提供者将响应消息发送回客户端。
- 客户端收到响应消息,并可以从中提取结果。
-
服务通信示例:假设有一个名为
add_two_ints
的服务,用于计算两个整数的和。服务调用者可以像下面这样调用该服务:
#!/usr/bin/env python
import rospy
from my_package.srv import AddTwoInts
def add_two_ints_client(x, y):
rospy.wait_for_service('add_two_ints')
try:
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
response = add_two_ints(x, y)
return response.sum
except rospy.ServiceException as e:
print("Service call failed: %s" % e)
if __name__ == "__main__":
rospy.init_node('add_two_ints_client')
x = 5
y = 3
print("Requesting %s + %s" % (x, y))
print("Sum: %s" % add_two_ints_client(x, y))
在ROS中,服务通信提供了一种方便的方式,允许节点之间进行复杂的交互和协作,从而实现更灵活和高效的机器人系统。
行为通信(Actions)
行为通信是一种高级通信机制,它允许节点执行长时间运行的任务,并提供反馈以及可取消的功能。
行为通信是一种ROS消息类型,它包含三部分:目标(Goal)、反馈(Feedback)和结果(Result)。行为的定义通常保存在.action
文件中,其中包含目标、反馈和结果的消息类型及其字段。例如,一个简单的行为定义文件可能如下所示:
int64 order_id
---
int32 percent_complete
---
string status_message
这个行为定义了一个包含订单ID的目标,以及在执行过程中返回的完成百分比反馈和状态消息结果。
-
行为节点(Action Node):行为节点是提供或调用行为的ROS节点。一个节点可以同时作为行为的提供者和行为的调用者,也可以只提供行为或只调用行为。
-
行为服务器(Action Server):行为服务器是提供特定行为的节点。它接收来自行为客户端的目标,并在执行过程中定期发送反馈,并最终返回结果。
-
行为客户端(Action Client):行为客户端是发送目标并接收反馈和结果的节点。它将目标发送到行为服务器,并等待反馈和结果。
-
行为通信流程:
- 行为客户端创建一个与所需行为相匹配的客户端(Client),并填充目标消息。
- 客户端将目标消息发送到行为服务器。
- 行为服务器接收到目标消息,并开始执行任务。在执行过程中,它会定期发送反馈消息到客户端,以提供任务执行的进度信息。
- 当任务完成时,行为服务器将结果消息发送回客户端。
- 客户端收到结果消息,并可以从中提取执行结果。
-
行为通信示例:假设有一个名为
move_base
的行为,用于将移动机器人移动到指定位置。行为客户端可以像下面这样调用该行为:
#!/usr/bin/env python
import rospy
import actionlib
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
def move_base_client():
client = actionlib.SimpleActionClient('move_base', MoveBaseAction)
client.wait_for_server()
goal = MoveBaseGoal()
goal.target_pose.header.frame_id = "map"
goal.target_pose.pose.position.x = 1.0
goal.target_pose.pose.position.y = 2.0
goal.target_pose.pose.orientation.w = 1.0
client.send_goal(goal)
client.wait_for_result()
return client.get_result()
if __name__ == "__main__":
try:
rospy.init_node('move_base_client')
result = move_base_client()
print("Result: %s" % result)
except rospy.ROSInterruptException:
print("Program interrupted before completion")
在ROS中,行为通信提供了一种灵活和高效的方式,允许节点执行长时间运行的任务,并在执行过程中提供进度反馈,从而实现更复杂的机器人行为。
参数服务器(Parameter Server)
参数服务器是用于存储和检索参数的分布式多机器人配置系统,它允许节点动态地获取参数值。
在ROS中,参数服务器是一种用于存储和检索参数的分布式多机器人配置系统。它允许节点动态地获取参数值,并提供了一种方便的方式来管理和共享配置参数。以下是ROS中参数服务器的通信方式:
-
参数设置(Parameter Setting):节点可以通过ROS API将参数设置到参数服务器上。这些参数可以是整数、浮点数、字符串等不同类型的数据。参数设置允许节点在运行时动态地调整配置参数,而无需重新编译或重新启动节点。例如,一个移动机器人节点可以将最大速度和加速度参数设置到参数服务器上,以便在运行时进行调整。
-
参数获取(Parameter Getting):节点可以通过ROS API从参数服务器上获取参数值。节点可以根据需要获取特定参数的值,并据此执行相应的操作。例如,一个控制器节点可以从参数服务器上获取运动规划的参数,以便在运行时进行路径规划。
-
参数搜索(Parameter Search):参数服务器支持参数的层级结构,允许参数按照命名空间进行组织和管理。节点可以通过指定参数名称的前缀来搜索参数服务器上的参数。这种参数搜索的方式使得节点可以更轻松地管理大量的参数,并提高了参数的可读性和可维护性。
-
参数更新通知(Parameter Update Notifications):当参数服务器上的参数发生变化时,ROS会向订阅了参数更新通知的节点发送通知消息。这样,节点可以及时感知到参数的变化,并根据需要进行相应的调整和处理。
通过参数服务器,ROS节点可以实现参数的集中管理和共享,使得系统配置更加灵活和可配置。参数服务器还提供了一种方便的方式来实现参数的动态调整和更新,从而提高了系统的可维护性和适应性。