第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

posted @ 2025-06-08 15:49  长恨水长东  阅读(41)  评论(0)    收藏  举报