小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
python服务,call服务时提示:waiting for service to become available...
-
按照小鱼教程:https://www.bilibili.com/video/BV13zpbeJEG2
稍有改动环境:
win11+wsl2+Ubuntu22.04+humble源文件:
face_detect_ndoe.pyimport rclpy from rclpy.node import Node from chapt4_interfaces.srv import FaceDetector import face_recognition import cv2 from ament_index_python.packages import get_package_share_directory # 获取功能包share目录绝对路径 import os from cv_bridge import CvBridge import time class FaceDetectNode(Node): def __init__(self): super().__init__('face_detect_node') self.service = self.create_service(FaceDetector, 'face_detector', self.detect_face_callback) self.bridge = CvBridge() # 实例化cvbridge self.number_of_times_to_upsample = 1 self.model = 'hog' self.default_image_path = os.path.join(get_package_share_directory('demo_python_service'), 'resource/zidane.jpg') self.get_logger().info('人脸检测服务初始化成功!') def detect_face_callback(self, request, response): if request.image.data: cv_image = self.bridge.imgmsg_to_cv2() else: self.get_logger().info(f'图像传入为空,使用默认图像。') cv_image = cv2.imread(self.default_image_path) self.get_logger().info(f'图像加载完成,开始识别...') start_time = time.time() # 识别 face_locations = face_recognition.face_locations(cv_image, self.number_of_times_to_upsample, model=self.model) response.use_time = time.time() - start_time self.get_logger().info(f'图像识别完成,用时{response.use_time} s') response.number = len(face_locations) # response.top = [] # response.right = [] # response.bottom = [] # response.left = [] for top, right, bottom, left in face_locations: response.top.append(top) response.right.append(right) response.bottom.append(bottom) response.left.append(left) return response def main(): rclpy.init() node = FaceDetectNode() rclpy.spin(node) rclpy.shutdown()
from setuptools import find_packages, setup package_name = 'demo_python_service' setup( name=package_name, version='0.0.0', packages=find_packages(exclude=['test']), data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), ('share/' + package_name + '/resource', ['resource/zidane.jpg']), ], install_requires=['setuptools'], zip_safe=True, maintainer='inno_duan', maintainer_email='inno_duan@todo.todo', description='TODO: Package description', license='Apache-2.0', tests_require=['pytest'], entry_points={ 'console_scripts': [ 'learn_face_detect=demo_python_service.learn_face_detect:main', 'face_detect_node=demo_python_service.face_detect_node:main', ], }, )
FaceDetector.srv
sensor_msgs/Image image # 人脸图像 --- int16 number float32 use_time int32[] top int32[] right int32[] bottom int32[] left
source以后,运行节点:
ros2 run demo_python_service face_detect_node
输出:
[INFO] [1730434748.123180134] [face_detect_node]: 人脸检测服务初始化成功!
另一个窗口source以后,调用服务
ros2 service call /face_detect chapt4_interfaces/srv/FaceDetector
显示:
waiting for service to become available...
查看service list,显示结果(有/face_detector这个服务)
/face_detect_node/describe_parameters /face_detect_node/get_parameter_types /face_detect_node/get_parameters /face_detect_node/list_parameters /face_detect_node/set_parameters /face_detect_node/set_parameters_atomically /face_detector
查看节点(/face_detect_node节点也存在)
/face_detect_node
也参考本社区另一个问题:https://fishros.org.cn/forum/topic/2781/服务之rclpy实现遇到问题-waiting-for-service-to-become-available
我把install build 都删除重新编译还是这样 -
从你提供的信息来看,你的服务
/face_detector
已经成功注册,但是当你尝试调用这个服务时,系统提示“waiting for service to become available...”。这通常意味着服务客户端在尝试连接服务时,服务并没有正确地处理或响应请求。以下是一些可能的解决步骤和检查点:-
服务名称匹配:
确保你在调用服务时使用的服务名称与注册的服务名称完全匹配。在你的例子中,服务名称应该是/face_detector
(没有_node
后缀,因为/face_detect_node
是节点名,而/face_detector
是服务名)。你已经正确地在调用时使用了/face_detect
(这里可能是个笔误,应该是/face_detector
),但在确认无误的情况下继续检查其他点。 -
服务接口定义:
确保你的服务接口(FaceDetector.srv
)在服务端和客户端完全一致。任何不匹配都会导致服务无法被正确调用。 -
CvBridge 使用问题:
在你的detect_face_callback
函数中,你使用了self.bridge.imgmsg_to_cv2()
但没有传递任何参数。imgmsg_to_cv2
函数需要一个sensor_msgs/Image
类型的消息作为输入。你应该从request.image
中获取这个输入。修改如下:cv_image = self.bridge.imgmsg_to_cv2(request.image)
-
服务回调函数的实现:
确保你的服务回调函数能够正确处理所有可能的输入,并且总是返回一个有效的响应。在你的代码中,如果request.image.data
为空,你使用了默认图像,这部分处理看起来是正确的。 -
ROS 2 日志:
检查ROS 2的详细日志输出,看是否有任何错误或警告信息。这可以通过设置ROS 2的日志级别为DEBUG来实现:export RCLCPP_DEFAULT_LOG_LEVEL=DEBUG ros2 run demo_python_service face_detect_node
-
服务调用命令:
确保你使用正确的命令和参数调用服务。如果你的服务接口定义了图像输入,你需要提供一个有效的图像消息。例如,你可能需要先发布一个图像到某个话题,然后使用这个图像作为服务调用的输入,或者构造一个图像消息直接作为服务调用的输入。 -
重新构建和部署:
每次修改代码后,确保重新构建你的包,并清理旧的构建文件。使用以下命令:colcon build --packages-select demo_python_service source install/setup.bash
-
网络问题:
如果你在虚拟机或WSL环境中运行ROS 2,确保网络配置允许节点间通信。这通常不是问题,但在某些复杂的网络设置下可能会成为问题。
按照上述步骤检查和修改后,重新运行你的节点和服务调用,看看问题是否得到解决。如果问题仍然存在,可能需要更深入地检查你的代码和ROS 2的配置。
以上为生成回答,仅供参考~
-
-
@Jason_Duan
call的问题,命令输错了,服务名不是/face_detect,而是/face_detector,因为使用/face+tab,自动补全到face_detect,此时我以为完全补全了,实际没有!!! -
@Jason_Duan 在 python服务,call服务时提示:waiting for service to become available... 中说:
ros2 service call /face_detect chapt4_interfaces/srv/FaceDetector
ros2 service call /face_detector chapt4_interfaces/srv/FaceDetector
服务名字搞错了