鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    python服务,call服务时提示:waiting for service to become available...

    已定时 已固定 已锁定 已移动
    ROS2机器人开发:从入门到实践
    ros2 service ros2 humble
    3
    4
    387
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • J
      Jason_Duan
      最后由 编辑

      按照小鱼教程:https://www.bilibili.com/video/BV13zpbeJEG2
      稍有改动

      环境:
      win11+wsl2+Ubuntu22.04+humble

      源文件:
      face_detect_ndoe.py

      import 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()
      

      setup.py

      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 都删除重新编译还是这样

      J 小鱼小 2 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        从你提供的信息来看,你的服务/face_detector已经成功注册,但是当你尝试调用这个服务时,系统提示“waiting for service to become available...”。这通常意味着服务客户端在尝试连接服务时,服务并没有正确地处理或响应请求。以下是一些可能的解决步骤和检查点:

        1. 服务名称匹配:
          确保你在调用服务时使用的服务名称与注册的服务名称完全匹配。在你的例子中,服务名称应该是/face_detector(没有_node后缀,因为/face_detect_node是节点名,而/face_detector是服务名)。你已经正确地在调用时使用了/face_detect(这里可能是个笔误,应该是/face_detector),但在确认无误的情况下继续检查其他点。

        2. 服务接口定义:
          确保你的服务接口(FaceDetector.srv)在服务端和客户端完全一致。任何不匹配都会导致服务无法被正确调用。

        3. 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)
          
        4. 服务回调函数的实现:
          确保你的服务回调函数能够正确处理所有可能的输入,并且总是返回一个有效的响应。在你的代码中,如果request.image.data为空,你使用了默认图像,这部分处理看起来是正确的。

        5. ROS 2 日志:
          检查ROS 2的详细日志输出,看是否有任何错误或警告信息。这可以通过设置ROS 2的日志级别为DEBUG来实现:

          export RCLCPP_DEFAULT_LOG_LEVEL=DEBUG
          ros2 run demo_python_service face_detect_node
          
        6. 服务调用命令:
          确保你使用正确的命令和参数调用服务。如果你的服务接口定义了图像输入,你需要提供一个有效的图像消息。例如,你可能需要先发布一个图像到某个话题,然后使用这个图像作为服务调用的输入,或者构造一个图像消息直接作为服务调用的输入。

        7. 重新构建和部署:
          每次修改代码后,确保重新构建你的包,并清理旧的构建文件。使用以下命令:

          colcon build --packages-select demo_python_service
          source install/setup.bash
          
        8. 网络问题:
          如果你在虚拟机或WSL环境中运行ROS 2,确保网络配置允许节点间通信。这通常不是问题,但在某些复杂的网络设置下可能会成为问题。

        按照上述步骤检查和修改后,重新运行你的节点和服务调用,看看问题是否得到解决。如果问题仍然存在,可能需要更深入地检查你的代码和ROS 2的配置。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        1 条回复 最后回复 回复 引用 0
        • J
          Jason_Duan @Jason_Duan
          最后由 编辑

          @Jason_Duan
          call的问题,命令输错了,服务名不是/face_detect,而是/face_detector,因为使用/face+tab,自动补全到face_detect,此时我以为完全补全了,实际没有!!!

          1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @Jason_Duan
            最后由 编辑

            @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

            服务名字搞错了

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            1 条回复 最后回复 回复 引用 0
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS