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

    服务通信超时问题

    已定时 已固定 已锁定 已移动
    移动机器人制作
    提问 服务通信
    2
    2
    386
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 1
      15509992895
      最后由 编辑

      我在完成服务通信时遇到了【请求超时问题】,求助。

      背景:
      我试图写一个服务通信,获取机器人的位置,并显示在自己做的UI上。

      问题描述:
      rclpy.spin_until_future_complete(self, future, timeout_sec=5)
      不断超时。
      af8ba92442391ea937b8215163b1838.png
      问题排查:

      1. 命令行请求服务没问题
        c82259d7dbfbcbbb0875377181ab97d.png
      2. 接口名称、定义也排查了

      具体代码:
      客户端:
      bd4e51a786047f656571e37d4242f37.png
      d3c3cecef7f0e78b2c976197c7029ce.png
      服务端:
      a9b0c3f4110fe83d8313d2e7e605786.png d3c3cecef7f0e78b2c976197c7029ce.png
      接口:
      d3c3cecef7f0e78b2c976197c7029ce.png

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

        遇到服务通信超时问题通常意味着客户端在指定的时间内没有从服务端接收到响应。虽然你提到命令行请求服务没有问题,这通常指向客户端代码或网络层面的问题。以下是一些排查和解决步骤,帮助你定位问题:

        1. 检查服务端状态

        确保服务端正在运行,并且正确监听客户端请求。你可以通过日志输出或服务端的调试信息来确认它是否收到了请求。

        2. 网络连接

        尽管你在本地测试,确认没有防火墙或网络设置阻止客户端和服务端之间的通信。

        3. 服务端处理时间

        即使命令行请求成功,服务端处理请求的时间可能因不同的调用方式或数据负载而异。检查服务端处理请求的代码,确保没有无限循环、长时间阻塞操作或资源争用问题。

        4. 客户端代码审查

        由于你提到代码中有 rclpy.spin_until_future_complete(self, future, timeout_sec=5) 超时,让我们专注于这部分代码:

        • future 对象:确保 future 对象正确创建,并且代表了对服务的调用。通常,这涉及到使用 call_async 方法或类似机制来启动异步服务调用。
        • 服务调用参数:确认传递给服务的参数与服务定义完全匹配。类型不匹配或缺失参数可能导致服务端拒绝请求或返回错误,而不是简单地超时。
        • 超时设置:虽然5秒通常足够,但如果服务端处理确实需要更长时间,考虑增加超时时间。

        5. 日志和调试

        增加客户端和服务端的日志输出,尤其是在服务请求处理的前后。这可以帮助你了解请求是否到达服务端,以及服务端是否尝试响应。

        6. 代码示例

        由于你没有提供具体的客户端和服务端代码,这里是一个简化的示例,展示如何使用 rclpy 进行服务调用:

        客户端示例

        import rclpy
        from rclpy.node import Node
        from example_interfaces.srv import AddTwoInts  # 假设服务名为 AddTwoInts
        
        class MyClient(Node):
            def __init__(self):
                super().__init__('my_client')
                self.cli = self.create_client(AddTwoInts, 'add_two_ints')
                while not self.cli.wait_for_service(timeout_sec=1.0):
                    self.get_logger().info('service not available, waiting again...')
                self.req = AddTwoInts.Request()
                self.req.a = 6
                self.req.b = 5
        
            def send_request(self):
                future = self.cli.call_async(self.req)
                rclpy.spin_until_future_complete(self, future, timeout_sec=5)
        
                if future.result() is not None:
                    result = future.result()
                    self.get_logger().info('Result: "%d + %d = %d"' % (self.req.a, self.req.b, result.sum))
                else:
                    self.get_logger().error('Request failed')
        
        def main(args=None):
            rclpy.init(args=args)
            client = MyClient()
            client.send_request()
            client.destroy_node()
            rclpy.shutdown()
        
        if __name__ == '__main__':
            main()
        

        服务端示例

        确保服务端正确注册并处理请求。

        7. 最后的检查

        • 确保客户端和服务端使用的是相同的 ROS 2 网络(即相同的 ROS 2 域 ID)。
        • 如果在容器中运行,确保网络配置允许容器间通信。

        通过上述步骤,你应该能够更接近问题的根源,并找到解决方案。如果问题仍然存在,可能需要更详细的代码审查或考虑其他系统级别的因素。


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

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

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