求助python参数更改问题
-
在跟随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()求助各位大佬,这是哪里出问题了
-
@木叶景 在 求助python参数更改问题 中说:
param_value.string_value = model
param_value.type = ParameterType.PARAMETER_STRING感觉是这两句位置反了
-
@战场吃保底的鱼鱼 调换顺序之后输出还是没变
