<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[求助python参数更改问题]]></title><description><![CDATA[<p dir="auto">在跟随bilibili鱼香ros学习4.4部分时，遇到了和老师情况不一致的问题，更改模型的代码被连续调用，导致两次识别都调用同一个模型，客户端警告显示参数未成功传达，下为日志内容：<br />
客户端：</p>
<pre><code>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
</code></pre>
<p dir="auto">服务端：</p>
<pre><code>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_-&gt;hog
[INFO] [1787124538.993789954] [face_detect]: model_-&gt;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]: 图像识别完成，已输出
</code></pre>
<p dir="auto">我的客户端代码为：</p>
<pre><code class="language-python">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()
</code></pre>
<p dir="auto">服务端代码为：</p>
<pre><code class="language-python">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}-&gt;{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()
</code></pre>
<p dir="auto">求助各位大佬，这是哪里出问题了</p>
]]></description><link>https://fishros.org.cn/forum/topic/4814/求助python参数更改问题</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 14:31:53 GMT</lastBuildDate><atom:link href="https://fishros.org.cn/forum/topic/4814.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Aug 2026 08:55:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 求助python参数更改问题 on Fri, 21 Aug 2026 01:48:19 GMT]]></title><description><![CDATA[<p dir="auto"><a class="mention plugin-mentions-user plugin-mentions-a" href="https://fishros.org.cn/forum/uid/24413">@战场吃保底的鱼鱼</a> 调换顺序之后输出还是没变<img src="https://fishros.org.cn/forum/assets/plugins/nodebb-plugin-emoji/emoji/android/1f622.png?v=4lf04vikhdr" class="not-responsive emoji emoji-android emoji--cry" style="height:23px;width:auto;vertical-align:middle" title=":cry:" alt="😢" /></p>
]]></description><link>https://fishros.org.cn/forum/post/19742</link><guid isPermaLink="true">https://fishros.org.cn/forum/post/19742</guid><dc:creator><![CDATA[木叶景]]></dc:creator><pubDate>Fri, 21 Aug 2026 01:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to 求助python参数更改问题 on Thu, 20 Aug 2026 07:50:05 GMT]]></title><description><![CDATA[<p dir="auto"><a class="mention plugin-mentions-user plugin-mentions-a" href="https://fishros.org.cn/forum/uid/35614">@木叶景</a> 在 <a href="/forum/post/19740">求助python参数更改问题</a> 中说：</p>
<blockquote>
<p dir="auto">param_value.string_value = model<br />
param_value.type = ParameterType.PARAMETER_STRING</p>
</blockquote>
<p dir="auto">感觉是这两句位置反了</p>
]]></description><link>https://fishros.org.cn/forum/post/19741</link><guid isPermaLink="true">https://fishros.org.cn/forum/post/19741</guid><dc:creator><![CDATA[战场吃保底的鱼鱼]]></dc:creator><pubDate>Thu, 20 Aug 2026 07:50:05 GMT</pubDate></item></channel></rss>