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

    服务之RCLPY实现遇到问题:waiting for service to become available...

    已定时 已固定 已锁定 已移动 已解决
    综合问题
    动手学ros2 服务之rclpy实现
    3
    13
    1.6k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 1
      1785360876
      最后由 1785360876 编辑

      正常启动service_server_02节点后,ros2 service call时终端显示waiting for service to become available...
      service和node均正常

      0e1262ae-0371-4edb-828d-f8dcd4b5ed0a-image.png

      本人使用的环境是win11下wsl2里安装的Ubuntu22,ros版本是humble

      service_server_02.py内容如下

      import rclpy
      from rclpy.node import Node
      from example_interfaces.srv import AddTwoInts
      
      
      class ServiceServer02(Node):
          def __init__(self, name):
              super().__init__(name)
              self.get_logger().info("节点已启动:%s!" % name)
              self.add_ints_server = self.create_service(
                  AddTwoInts, "add_two_ints_srv", self.handle_add_two_ints
              )
              self.get_logger().info("初始化已完成")
      
          def handle_add_two_ints(self, request, response):
              self.get_logger().info(f"收到请求,计算{request.a} + {request.b}")
              response.sum = request.a + request.b
              return response
      
      
      def main(args=None):
          rclpy.init(args=args)  # 初始化rclpy
          node = ServiceServer02("service_server_02")  # 新建一个节点
          rclpy.spin(node)  # 保持节点运行,检测是否收到退出指令(Ctrl+C)
          rclpy.shutdown()  # 关闭rclpy
      
      小鱼小 1 条回复 最后回复 回复 引用 0
      • 1
        1785360876 @小鱼
        最后由 编辑

        @小鱼 问题已解决,非常感谢!
        经检查是由于install下对应python文件与src下文件不一致导致(install文件夹下保存着我此前由于拼写错误而误创建的service_sever_02.py,随后我删除了该文件并创建了正确的service_server_02.py并在setupp.py文件中手动进行了更改)。
        我在尝试解决问题的过程中曾试过只删除build文件夹后进行整改工作空间的build,但并未检查install文件夹,今后若遇到类似的问题是否能删除install与build文件夹,再重新build整个工作空间呢?

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

          当你使用ros2 service call命令调用一个服务,但终端显示“waiting for service to become available...”时,这通常意味着ROS 2客户端(即调用服务的节点)无法找到对应的服务。这可能是由几个原因造成的:

          1. 服务节点未正确启动:
            确保你的service_server_02节点已经成功启动,并且没有报错。你可以使用ros2 node list来查看当前运行的节点列表,确保service_server_02在其中。

          2. 命名空间问题:
            如果你的服务节点在特定的命名空间中启动,你需要在调用服务时指定这个命名空间。例如,如果服务节点在/my_namespace命名空间中,你需要这样调用服务:ros2 service call /my_namespace/my_service my_srv_type。

          3. 服务类型不匹配:
            确保你调用服务时使用的服务类型与service_server_02节点提供的服务类型完全一致。

          4. 服务尚未准备好:
            有时服务节点可能需要一些时间来初始化服务。你可以尝试在调用服务之前等待几秒钟,或者使用ROS 2的ros2 topic echo或ros2 service list等命令来监控服务的状态。

          5. 权限问题:
            确保你有足够的权限来调用服务。在某些情况下,权限问题可能会导致服务无法被找到。

          6. 网络问题:
            如果你的ROS 2网络配置不正确,或者你的节点在不同的机器上运行但没有正确配置网络,那么服务可能无法被发现。确保你的ROS 2网络配置正确,并且所有节点都可以相互通信。

          7. ROS 2版本或配置问题:
            确保你使用的ROS 2版本与service_server_02节点兼容,并且所有ROS 2环境变量(如ROS_DOMAIN_ID)都已正确设置。

          为了诊断问题,你可以尝试以下步骤:

          • 使用ros2 node list来查看service_server_02节点是否在运行。
          • 使用ros2 service list来查看可用的服务列表,确保你的服务在列表中。
          • 如果你的服务在列表中但无法使用,尝试指定命名空间来调用服务。
          • 检查你的服务类型是否正确,并且与service_server_02节点提供的服务类型匹配。
          • 检查你的ROS 2网络配置和权限设置。
          • 如果可能的话,尝试在相同的机器上运行客户端和服务节点,以排除网络问题。
          • 查看service_server_02节点的日志输出,看是否有任何错误或警告信息可以帮助诊断问题。

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

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

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

            @1785360876 https://fishros.org.cn/forum/topic/151/提问前必看-不符合要求的问题拒绝回答

            你要使用命令请求服务来确认服务是否正常,另外应该给出代码和相关日志

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

            1 1 条回复 最后回复 回复 引用 0
            • 1
              1785360876 @小鱼
              最后由 编辑

              @小鱼 抱歉,服务请求显示waiting for service to become available..
              03cc25b6-7aa9-419c-86ff-7bf4f99f05f1-image.png

              service_server_02.py的代码完全参照您的《动手学ros2》中代码(如下),本人刚入门,尚不清楚是否需要其他信息来协助找出问题
              import rclpy
              from rclpy.node import Node
              from example_interfaces.srv import AddTwoInts

              class ServiceServer02(Node):
              def init(self, name):
              super().init(name)
              self.get_logger().info("节点已启动:%s!" % name)
              self.add_ints_server = self.create_service(
              AddTwoInts, "add_two_ints_srv", self.handle_add_two_ints
              )
              self.get_logger().info("初始化已完成")

              def handle_add_two_ints(self, request, response):
                  self.get_logger().info(f"收到请求,计算{request.a} + {request.b}")
                  response.sum = request.a + request.b
                  return response
              

              def main(args=None):
              rclpy.init(args=args) # 初始化rclpy
              node = ServiceServer02("service_server_02") # 新建一个节点
              rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
              rclpy.shutdown() # 关闭rclpy

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

                @1785360876 请阅读提问前必看,并修改格式:1.不要截图 2.代码用代码块包裹 如果不知道怎么做,可以看编辑框右边的帮助:https://commonmark.org/help/

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

                1 1 条回复 最后回复 回复 引用 0
                • 1
                  1785360876 @小鱼
                  最后由 编辑

                  @小鱼
                  在终端中启节点

                  ~/d2lros2/chapt3/chapt3_ws$ ros2 run example_service_rclpy service_server_02 
                  [INFO] [1721376210.440943060] [service_server_02]: 节点已启动:service_server_02
                  

                  在另一终端请求服务始终显示“waiting for service to become available...”

                  og@GalaxyOg:~/d2lros2/chapt3/chapt3_ws$ ros2 service call /add_two_ints_srv example_interfaces/srv/AddTwoInts "{a: 5,b: 10}"
                  waiting for service to become available...
                  

                  已使用ros2 node list 和ros2 service list查看结果如下

                  og@GalaxyOg:~$ ros2 node list
                  /service_server_02
                  og@GalaxyOg:~$ ros2 service list
                  /add_two_ints_srv
                  /service_server_02/describe_parameters
                  /service_server_02/get_parameter_types
                  /service_server_02/get_parameters
                  /service_server_02/list_parameters
                  /service_server_02/set_parameters
                  /service_server_02/set_parameters_atomically
                  

                  service_server_02.py的内容如下

                  import rclpy
                  from rclpy.node import Node
                  from example_interfaces.srv import AddTwoInts
                  
                  
                  class ServiceServer02(Node):
                      def __init__(self, name):
                          super().__init__(name)
                          self.get_logger().info("节点已启动:%s!" % name)
                          self.add_ints_server = self.create_service(
                              AddTwoInts, "add_two_ints_srv", self.handle_add_two_ints
                          )
                          self.get_logger().info("初始化已完成")
                  
                      def handle_add_two_ints(self, request, response):
                          self.get_logger().info(f"收到请求,计算{request.a} + {request.b}")
                          response.sum = request.a + request.b
                          return response
                  
                  
                  def main(args=None):
                      rclpy.init(args=args)  # 初始化rclpy
                      node = ServiceServer02("service_server_02")  # 新建一个节点
                      rclpy.spin(node)  # 保持节点运行,检测是否收到退出指令(Ctrl+C)
                      rclpy.shutdown()  # 关闭rclpy
                  
                  小鱼小 1 条回复 最后回复 回复 引用 0
                  • 小鱼小
                    小鱼 技术大佬 @1785360876
                    最后由 编辑

                    @1785360876 看起来没问题:

                    尝试重启下daemon

                    ros2 daemon stop
                    ros2 daemon start
                    

                    然后再用:

                    ros2 run example_service_rclpy service_server_02
                    ``
                    试试

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

                    1 1 条回复 最后回复 回复 引用 0
                    • 1
                      1785360876 @小鱼
                      最后由 编辑

                      @小鱼

                      og@GalaxyOg:~/d2lros2/chapt3/chapt3_ws$ ros2 daemon stop
                      The daemon is not running
                      og@GalaxyOg:~/d2lros2/chapt3/chapt3_ws$ ros2 daemon start
                      The daemon has been started
                      

                      再次启动节点后命令行请求服务任然显示“waiting for service to become available...”

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

                        @1785360876 你运行自带的服务试试

                        ros2 run examples_rclpy_minimal_service service
                        

                        然后尝试请求

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

                        1 1 条回复 最后回复 回复 引用 0
                        • 1
                          1785360876 @小鱼
                          最后由 编辑

                          @小鱼
                          自带的服务在测试中正常运行,今日启动自己写的节点后发现服务中没有“/add_two_ints_srv”服务(前日测试中该服务在service list中),测试结果如下

                          og@GalaxyOg:~$ ros2 service list
                          /service_server_02/describe_parameters
                          /service_server_02/get_parameter_types
                          /service_server_02/get_parameters
                          /service_server_02/list_parameters
                          /service_server_02/set_parameters
                          /service_server_02/set_parameters_atomically
                          og@GalaxyOg:~$ ros2 node list
                          /service_server_02
                          

                          请问如何解决“/add_two_ints_srv”服务为正常启动的问题呢?
                          节点启动终端如下

                          og@GalaxyOg:~/d2lros2/chapt3/chapt3_ws$ ros2 run example_service_rclpy service_server_02 
                          [INFO] [1721546960.212194499] [service_server_02]: 节点已启动:service_server_02
                          
                          小鱼小 1 条回复 最后回复 回复 引用 0
                          • 小鱼小
                            小鱼 技术大佬 @1785360876
                            最后由 编辑

                            @1785360876 打开install目录下对应的功能包,找找service_server_02对应的py文件,确认运行的文件和src中的一致。

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

                            1 1 条回复 最后回复 回复 引用 0
                            • 1
                              1785360876 @小鱼
                              最后由 编辑

                              @小鱼 问题已解决,非常感谢!
                              经检查是由于install下对应python文件与src下文件不一致导致(install文件夹下保存着我此前由于拼写错误而误创建的service_sever_02.py,随后我删除了该文件并创建了正确的service_server_02.py并在setupp.py文件中手动进行了更改)。
                              我在尝试解决问题的过程中曾试过只删除build文件夹后进行整改工作空间的build,但并未检查install文件夹,今后若遇到类似的问题是否能删除install与build文件夹,再重新build整个工作空间呢?

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

                                @1785360876 最好可以删掉install和build重新构建,防止这个问题

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

                                1 条回复 最后回复 回复 引用 0
                                • 小鱼小 小鱼 将这个主题标记为已解决,在
                                • J Jason_Duan 在 中 引用了 这个主题
                                • 第一个帖子
                                  最后一个帖子
                                皖ICP备16016415号-7
                                Powered by NodeBB | 鱼香ROS