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

    求助python参数更改问题

    已定时 已固定 已锁定 已移动
    ROS2机器人开发:从入门到实践
    参数通信 python 人脸检测
    2
    3
    172
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 木
      木叶景
      最后由 编辑

      在跟随bilibili鱼香ros学习4.4部分时,遇到了和老师情况不一致的问题,更改模型的代码被连续调用,导致两次识别都调用同一个模型,客户端警告显示参数未成功传达,下为日志内容:
      客户端:

      dayuan-yang@PC:~/ros2_study/chap4/chap4_ws$ ros2 run demo_python_service face_detect_client_node 
      [INFO] [1787124538.958904638] [face_detect]: 程序初始化中...
      [WARN] [1787124538.990364957] [face_detect]: Failed to set parameter: ('Invalid access to undeclared parameter(s)', [])
      [INFO] [1787124538.991026765] [face_detect]: 设置参数结果:True
      [WARN] [1787124538.993885051] [face_detect]: Failed to set parameter: ('Invalid access to undeclared parameter(s)', [])
      [INFO] [1787124538.994529910] [face_detect]: 设置参数结果:False('Invalid access to undeclared parameter(s)', [])
      [INFO] [1787124561.033881156] [face_detect]: 接受到响应,共有4张人脸,耗时22.025774002075195s
      [INFO] [1787124583.209261306] [face_detect]: 接受到响应,共有4张人脸,耗时22.173126220703125s
      

      服务端:

      dayuan-yang@PC:~/ros2_study/chap4/chap4_ws$ ros2 run demo_python_service face_detect_node 
      [INFO] [1787124525.172487136] [face_detect]: 程序初始化中...
      [INFO] [1787124538.990148770] [face_detect]: model_->hog
      [INFO] [1787124538.993789954] [face_detect]: model_->cnn
      [INFO] [1787124539.006120170] [face_detect]: 程序初始化完成!
      [INFO] [1787124539.006555388] [face_detect]: 图像加载完成,开始识别...
      [INFO] [1787124561.032812079] [face_detect]: 图像识别完成,已输出
      [INFO] [1787124561.034411347] [face_detect]: 程序初始化完成!
      [INFO] [1787124561.034775206] [face_detect]: 图像加载完成,开始识别...
      [INFO] [1787124583.208339303] [face_detect]: 图像识别完成,已输出
      

      我的客户端代码为:

      from rclpy.node import Node
      from cv_bridge import CvBridge
      from rcl_interfaces.srv import SetParameters
      from chap4_interfaces.srv import FaceDetector
      from ament_index_python.packages import get_package_share_directory
      from rcl_interfaces.msg import Parameter, ParameterValue, ParameterType
      import os
      import cv2
      import time
      import rclpy
      import face_recognition
      
      class FaceDetectClientNode(Node):
          def __init__(self, node_name):
              super().__init__(node_name)
              self.get_logger().info("程序初始化中...")
              self.bridge = CvBridge()
              self.default_image_path = os.path.join(get_package_share_directory('demo_python_service'), 'resource/test1.jpg')
              self.client_ = self.create_client(FaceDetector, "face_detect")
              self.image = cv2.imread(self.default_image_path)
      
          def call_set_parameters(self, parameters):
              """
              调用服务,更改参数
              """
              update_param = self.create_client(SetParameters, "/face_detect/set_parameters")
              while update_param.wait_for_service(timeout_sec=1.0) is False:
                  self.get_logger().info("等待参数更新服务端上线...")
              request = SetParameters.Request()
              request.parameters = parameters
              future = update_param.call_async(request)
              rclpy.spin_until_future_complete(self, future)
              response = future.result()
              return response
      
          def update_detect_model(self, model = "hog"):
              """
              根据传入的model,构建Parameters,然后调用call_set_parameters更新服务端参数
              """
              param = Parameter()
              param.name = "model_"
              param_value = ParameterValue()
              param_value.string_value = model
              param_value.type = ParameterType.PARAMETER_STRING
              param.value = param_value
              response = self.call_set_parameters([param])
              for result in response.results:
                  self.get_logger().info(f"设置参数结果:{result.successful}{result.reason}")
      
          def send_request(self):
              while self.client_.wait_for_service(timeout_sec=1.0) is False:
                  self.get_logger().info("等待服务端上线...")
              request = FaceDetector.Request()
              request.image = self.bridge.cv2_to_imgmsg(self.image)
              future = self.client_.call_async(request)
              # while not future.done():
              #     time.sleep(1.0)
              # rclpy.spin_until_future_complete(self, future)
              # response = future.result()
              # self.get_logger().info(f"接受到响应,共有{response.number}张人脸,耗时{response.use_time}s")
              def result_callback(result_future):
                  response = result_future.result()
                  self.get_logger().info(f"接受到响应,共有{response.number}张人脸,耗时{response.use_time}s")
                  # self.show_response(response)
      
              future.add_done_callback(result_callback)
      
          def show_response(self, response):
              for i in range(response.number):
                  top = response.top[i]
                  right = response.right[i]
                  bottom = response.bottom[i]
                  left = response.left[i]
      
                  cv2.rectangle(self.image, (left, top), (right, bottom), (255, 0, 0), 4)
      
              cv2.imshow("face_detect_result", self.image)
      
      def main():
          rclpy.init()
          node = FaceDetectClientNode("face_detect")
          node.update_detect_model("hog")
          node.send_request()
          node.update_detect_model("cnn")
          node.send_request()
          rclpy.spin(node)
          rclpy.shutdown()
      

      服务端代码为:

      from rclpy.node import Node
      from cv_bridge import CvBridge
      from chap4_interfaces.srv import FaceDetector
      from rcl_interfaces.msg import SetParametersResult
      from ament_index_python.packages import get_package_share_directory
      import os
      import cv2
      import time
      import rclpy
      import face_recognition
      
      class FaceDetectNode(Node):
          def __init__(self, node_name):
              super().__init__(node_name)
              self.get_logger().info("程序初始化中...")
              self.service_ = self.create_service(FaceDetector, "face_detect", self.callback_face_detect)
              self.bridge = CvBridge()
              self.default_image_path = os.path.join(get_package_share_directory('demo_python_service'), 'resource/default.jpg')
              self.declare_parameter("number_of_times_to_upsample_", 1)
              self.declare_parameter("model_", "hog")
              self.number_of_times_to_upsample_ = self.get_parameter("number_of_times_to_upsample_").value
              self.model_ = self.get_parameter("model_").value
              self.add_on_set_parameters_callback(self.parameters_callback)
      
          def parameters_callback(self, parameters):
              for parameter in parameters:
                  self.get_logger().info(f"{parameter.name}->{parameter.value}")
                  if parameter.name == "number_of_times_to_upsample_":
                      self.number_of_times_to_upsample_ = parameter.value
                  if parameter.name == "model_":
                      self.model_ = parameter.value
              return SetParametersResult(successful=True)
      
          def callback_face_detect(self, request, response):
              self.get_logger().info("程序初始化完成!")
              if request.image.data:
                  cv_image = self.bridge.imgmsg_to_cv2(request.image)
              else:
                  cv_image = cv2.imread(self.default_image_path)
                  self.get_logger().warn("图像为空,加载默认图像")
      
              self.get_logger().info("图像加载完成,开始识别...")
              start_time = time.time()
              face_location = face_recognition.face_locations(cv_image, number_of_times_to_upsample=self.number_of_times_to_upsample_, model=self.model_)
              response.use_time = time.time() - start_time
              response.number = len(face_location)
              for top, right, bottom, left in face_location:
                  cv2.rectangle(cv_image, (left, top), (right, bottom), (255, 0, 0), 4)
                  response.top.append(top)
                  response.right.append(right)
                  response.bottom.append(bottom)
                  response.left.append(left)
      
              self.get_logger().info("图像识别完成,已输出")
              return response
      
      def main():
          rclpy.init()
          node = FaceDetectNode("face_detect")
          rclpy.spin(node)
          rclpy.shutdown()
      

      求助各位大佬,这是哪里出问题了

      战场吃保底的鱼鱼战 1 条回复 最后回复 回复 引用 0
      • 战场吃保底的鱼鱼战
        战场吃保底的鱼鱼 @木叶景
        最后由 编辑

        @木叶景 在 求助python参数更改问题 中说:

        param_value.string_value = model
        param_value.type = ParameterType.PARAMETER_STRING

        感觉是这两句位置反了

        木 1 条回复 最后回复 回复 引用 0
        • 木
          木叶景 @战场吃保底的鱼鱼
          最后由 编辑

          @战场吃保底的鱼鱼 调换顺序之后输出还是没变😢

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