第3章 ROS2节点通信之话题与服务-入门篇-话题与服务-6.服务之RCLPY实现
这里文件结构是关键点:

一定要搞清楚路径
setup.py是干嘛的?
依赖关系声明:
install_requires=[
'requests>=2.25.1',
'numpy>=1.19.5',
]
脚本与入口点的指定:可定义命令行工具,还能设置 Python 包的入口函数。
entry_points={
'console_scripts': [
'mycommand=example_package.cli:main',
],
}
这段代码的作用是将 Python 函数转变为可直接在终端运行的命令。具体来说:
当你在终端输入service_client_02时,系统会调用example_service_rclpy.service_client_02模块里的main函数。
同理,输入service_server_02,则会触发example_service_rclpy.service_server_02模块中的main函数。
【核心网址】
2.服务端实现
Node — rclpy 0.6.1 documentation (ros2.org)

3.客户端实现:
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
# 调用名为add_two_ints_srv的服务,请求两个整数的加法运算。
class ServiceClient02(Node):
# 创建一个名为ServiceClient02的节点类,继承自 ROS 2 的Node基类
def __init__(self,name):
super().__init__(name)
self.get_logger().info("节点已启动:%s!" % name)
self.client_ = self.create_client(AddTwoInts,"add_two_ints_srv")
# 初始化时创建一个客户端,连接到add_two_ints_srv服务,使用AddTwoInts服务类型
def result_callback_(self, result_future): #定义回调函数,当服务请求完成时被调用
response = result_future.result()
# 从从 future 对象中获取响应结果,并打印计算结果
self.get_logger().info(f"收到返回结果:{response.sum}")
#send_request方法用于发送服务请求:
# 循环等待服务端上线(每 1 秒检查一次)
def send_request(self, a, b):
while rclpy.ok() and self.client_.wait_for_service(1)==False:
self.get_logger().info(f"等待服务端上线....")
# 创建请求对象并设置参数
request = AddTwoInts.Request()
request.a = a
request.b = b
# 异步发送请求(call_async)
# 注册回调函数(result_callback_)处理响应
self.client_.call_async(request).add_done_callback(self.result_callback_)
def main(args=None):
# 初始化 ROS 2 Python 客户端
rclpy.init(args=args) # 初始化rclpy
# 创建服务客户端节点
node = ServiceClient02("service_client_02") # 新建一个节点
# 调用函数发送请求
node.send_request(3,4)
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
# 进入事件循环(spin),等待回调函数执行
rclpy.shutdown() # 关闭rclpy

浙公网安备 33010602011771号