<?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[4.5.3修改其他节点参数，[INFO] [1763206927.409951296] [turtle_controller]: 参数更新失败，原因：parameter &#x27;k&#x27; cannot be set because it was not declared]]></title><description><![CDATA[<p dir="auto">//patrol_client.cpp<br />
#include "rclcpp/rclcpp.hpp"<br />
#include "chapt4_interfaces/srv/patrol.hpp"<br />
#include &lt;chrono&gt;<br />
#include &lt;ctime&gt;<br />
#include "rcl_interfaces/msg/parameter.hpp"<br />
#include "rcl_interfaces/msg/parameter_value.hpp"<br />
#include "rcl_interfaces/msg/parameter_type.hpp"<br />
#include "rcl_interfaces/srv/set_parameters.hpp"<br />
using SetP = rcl_interfaces::srv::SetParameters;<br />
using namespace std::chrono_literals;//可以使用10s，100ms表示时间<br />
using Patrol = chapt4_interfaces::srv::Patrol;</p>
<p dir="auto">class PatrolClientNode: public rclcpp::Node //定义类，继承自rclcpp::Node<br />
{<br />
public:<br />
PatrolClientNode():Node("turtle_controller")<br />
{<br />
srand(time(NULL));//初始化随机数种子</p>
<pre><code>    patrol_client_ = this-&gt;create_client&lt;Patrol&gt;("patrol");
    //创建客户端
    timer_ = this-&gt;create_wall_timer(10s,[&amp;]()-&gt;void{
    //1检测服务端是否上线
    while (!this-&gt;patrol_client_-&gt;wait_for_service(1s))
    {
        if(!rclcpp::ok()){
            RCLCPP_ERROR(this-&gt;get_logger(),"等待服务上线过程中，rclcpp挂了，我退下了");
            return;
        }
        RCLCPP_ERROR(this-&gt;get_logger(),"等待服务上线中");
    }
    //2构造请求的对象
    auto request = std::make_shared&lt;Patrol::Request&gt;();
    request-&gt;target_x = rand() % 12;
    request-&gt;target_y = rand() % 12;//取余防止超过12
    RCLCPP_INFO(this-&gt;get_logger(),"准备好目标点%f,%f",
    request-&gt;target_x,request-&gt;target_y);
    //3发送请求,调动函数，异步发送请求
    this-&gt;patrol_client_-&gt;async_send_request(request,[&amp;]
    (rclcpp::Client&lt;Patrol&gt;::SharedFuture result_future)-&gt; void{
        auto response = result_future.get();
        if(response-&gt;result==Patrol::Response::SUCCESS){
            RCLCPP_INFO(this-&gt;get_logger(),"请求巡逻目标点成功");
        }
        if(response-&gt;result==Patrol::Response::FAIL){
            RCLCPP_INFO(this-&gt;get_logger(),"请求巡逻目标点失败"); 
        }
        });    
    });
    
}

//创建客户端发送请求，返回结果
SetP::Response::SharedPtr call_set_parameter(const rcl_interfaces::msg::Parameter &amp;param)
{
    auto param_client_ = this-&gt;create_client&lt;SetP&gt;("/turtle_controller/set_parameters");
    //更改客户端名（智能指针），服务类型名，服务名称
    //创建客户端
    //1检测服务端是否上线
    while (!this-&gt;patrol_client_-&gt;wait_for_service(1s))
    {
        if(!rclcpp::ok()){
            RCLCPP_ERROR(this-&gt;get_logger(),"等待服务上线过程中，rclcpp挂了，我退下了");
            return nullptr;
        }
        RCLCPP_ERROR(this-&gt;get_logger(),"等待服务上线中");
    }
    //2构造请求的对象
    auto request = std::make_shared&lt;SetP::Request&gt;();
    request-&gt;parameters.push_back(param);
    //3发送请求,调动函数，异步发送请求
    auto future = param_client_-&gt;async_send_request(request);
    rclcpp::spin_until_future_complete(this-&gt;get_node_base_interface(),future);
    auto response = future.get();
    return response;
}

//更新参数
void update_server_param_k(double k)
{
    //1创建参数对象
    auto param = rcl_interfaces::msg::Parameter();
    param.name = "k";
    //2创建参数值
    auto param_value  = rcl_interfaces::msg::ParameterValue();
    param_value.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
    param_value.double_value = k;
    param.value = param_value;
    //请求更新参数并处理
    auto response = this-&gt;call_set_parameter(param);
    if(response==NULL){
        RCLCPP_INFO(this-&gt;get_logger(),"参数更新失败");
        return;
        
    }
    for (auto result:response-&gt;results)
    //返回值是result[]数组，遍历数组
    {
        if (result.successful==false)
        {
            RCLCPP_INFO(this-&gt;get_logger(),"参数更新失败，原因：%s",result.reason.c_str());
        }else{
            RCLCPP_INFO(this-&gt;get_logger(),"参数更新成功");
        }
        
    }
    
}
</code></pre>
<p dir="auto">private://私有成员变量 声明定时器和客户端<br />
rclcpp::TimerBase::SharedPtr timer_;<br />
rclcpp::Client&lt;Patrol&gt;::SharedPtr patrol_client_;<br />
};</p>
<p dir="auto">int main(int argc,char* argv[])//俩命令行参数<br />
{<br />
rclcpp::init(argc,argv);<br />
auto node = std::make_shared&lt;PatrolClientNode&gt;();//创建节点turtle-circle，创建TCN类的共享指针<br />
node-&gt;update_server_param_k(4.0);<br />
rclcpp::spin(node);//启动节点循环<br />
rclcpp::shutdown();//关闭环境<br />
return 0;<br />
}<br />
//turtle_control.cpp<br />
#include "rclcpp/rclcpp.hpp"<br />
#include "geometry_msgs/msg/twist.hpp"<br />
#include "turtlesim/msg/pose.hpp"<br />
#include "chapt4_interfaces/srv/patrol.hpp"<br />
#include "rcl_interfaces/msg/set_parameters_result.hpp"<br />
#include "rclcpp/parameter_client.hpp"<br />
#include "rclcpp/parameter.hpp"</p>
<p dir="auto">using Patrol = chapt4_interfaces::srv::Patrol;<br />
using SetParametersResult = rcl_interfaces::msg::SetParametersResult;</p>
<p dir="auto">class TurtleController: public rclcpp::Node //定义类，继承自rclcpp::Node<br />
{<br />
private:<br />
OnSetParametersCallbackHandle::SharedPtr parameter_callback_handle_;<br />
rclcpp::Service&lt;Patrol&gt;::SharedPtr patrol_server_;<br />
rclcpp::Publisher&lt;geometry_msgs::msg::Twist&gt;::SharedPtr publisher_; //发布者的智能指针<br />
rclcpp::Subscription<a target="_blank" rel="noopener noreferrer nofollow ugc">turtlesim::msg::Pose</a>::SharedPtr subscriber_; //订阅者的智能共享指针<br />
double target_x_{1.0};<br />
double target_y_{1.0};<br />
double k_{1.0};//比例系数<br />
double max_speed_{3.0};</p>
<p dir="auto">public:<br />
TurtleController() : Node("turtle_controller")<br />
{<br />
this-&gt;declare_parameter("k",1.0);<br />
this-&gt;declare_parameter("max_speed",1.0);<br />
this-&gt;get_parameter("k",k_);<br />
this-&gt;get_parameter("max_speed",max_speed_);<br />
this-&gt;set_parameter(rclcpp::Parameter("k",2.0));</p>
<pre><code>    parameter_callback_handle_ = this-&gt;add_on_set_parameters_callback([&amp;](const 
    std::vector&lt;rclcpp::Parameter&gt; &amp; parameters)-&gt;
        rcl_interfaces::msg::SetParametersResult{
        rcl_interfaces::msg::SetParametersResult result;
        result.successful = true;
        for (const auto &amp; parameter : parameters) {
            RCLCPP_INFO(this-&gt;get_logger(),"更新参数的值%s=%f",parameter.get_name().
            c_str(),parameter.as_double());
            if(parameter.get_name()=="k")
            {
                k_ = parameter.as_double();
            }
            if(parameter.get_name()=="max_speed")
            {
                max_speed_ = parameter.as_double();
            }
        }
        return result;
        });
    patrol_server_ = this-&gt;create_service&lt;Patrol&gt;("patrol",[&amp;](const 
    Patrol::Request::SharedPtr request,Patrol::Response::SharedPtr response) -&gt; void{
        if(
            (0 &lt; request-&gt;target_x &amp;&amp; request-&gt;target_x &lt; 12.0f)&amp;&amp;
            (0 &lt; request-&gt;target_y &amp;&amp; request-&gt;target_y &lt; 12.0f)
        ){
            this-&gt;target_x_ = request-&gt;target_x;
            this-&gt;target_y_ = request-&gt;target_y;
            response-&gt;result = Patrol::Response::SUCCESS;
        }else{
            response-&gt;result = Patrol::Response::FAIL;
        }
        //额外调用添加的回调函数，做到第一时间更新参数
    });
    publisher_ = this-&gt;create_publisher&lt;geometry_msgs::msg::Twist&gt;(
        "/turtle1/cmd_vel", 10);
    subscriber_ = this-&gt;create_subscription&lt;turtlesim::msg::Pose&gt;(
        "/turtle1/pose", 10,
        std::bind(&amp;TurtleController::on_pose_received_, this, std::placeholders::_1)); 
    
}
</code></pre>
<p dir="auto">private:<br />
void on_pose_received_(const turtlesim::msg::Pose::SharedPtr pose){<br />
<a href="//1.xn--nqqx6ex7aeyyh82b6mf" target="_blank" rel="noopener noreferrer nofollow ugc">//1.获取当前位置</a><br />
auto current_x = pose-&gt;x;<br />
auto current_y = pose-&gt;y;<br />
RCLCPP_INFO(get_logger(),"当前:x=%f,y=%f",current_x,current_y);</p>
<pre><code>    //2.计算当前海龟位置跟目标位置之间的距离差和角度差
    auto distance = std::sqrt(
        (target_x_-current_x)*(target_x_-current_x)+
        (target_y_-current_y)*(target_y_-current_y)      
    );
    auto angle = std::atan2( (target_y_-current_y), (target_x_-current_x)) - pose-&gt;theta;

    //3.控制策略
    auto msg = geometry_msgs::msg::Twist();
    if(distance&gt;0.1){
        if(fabs(angle)&gt;0.2){
            msg.angular.z = fabs(angle);
        }else{
            msg.linear.x = k_*distance;
        }
    }

    //4.限制线速度最大值
    if(msg.linear.x &gt; max_speed_){
        msg.linear.x = max_speed_;
    }
    publisher_-&gt;publish(msg);
}
</code></pre>
<p dir="auto">};</p>
<p dir="auto">int main(int argc,char* argv[])//俩命令行参数<br />
{<br />
rclcpp::init(argc,argv);<br />
auto node = std::make_shared&lt;TurtleController&gt;();//创建节点turtle-circle，创建TCN类的共享指针<br />
rclcpp::spin(node);//启动节点循环<br />
rclcpp::shutdown();//关闭环境<br />
return 0;<br />
}</p>
]]></description><link>https://fishros.org.cn/forum/topic/4639/4-5-3修改其他节点参数-info-1763206927-409951296-turtle_controller-参数更新失败-原因-parameter-k-cannot-be-set-because-it-was-not-declared</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 21:00:50 GMT</lastBuildDate><atom:link href="https://fishros.org.cn/forum/topic/4639.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Nov 2025 11:52:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 4.5.3修改其他节点参数，[INFO] [1763206927.409951296] [turtle_controller]: 参数更新失败，原因：parameter &#x27;k&#x27; cannot be set because it was not declared on Sat, 29 Nov 2025 02:19:37 GMT]]></title><description><![CDATA[<p dir="auto"><a class="mention plugin-mentions-user plugin-mentions-a" href="https://fishros.org.cn/forum/uid/26985">@ddl</a> 在 <a href="/forum/post/19267">4.5.3修改其他节点参数，[INFO] [1763206927.409951296] [turtle_controller]: 参数更新失败，原因：parameter 'k' cannot be set because it was not declared</a> 中说：</p>
<blockquote>
<p dir="auto">PatrolClientNode():Node("turtle_controller")</p>
</blockquote>
<p dir="auto">客户端节点命名重复，导致的参数未声明</p>
]]></description><link>https://fishros.org.cn/forum/post/19304</link><guid isPermaLink="true">https://fishros.org.cn/forum/post/19304</guid><dc:creator><![CDATA[星心]]></dc:creator><pubDate>Sat, 29 Nov 2025 02:19:37 GMT</pubDate></item><item><title><![CDATA[Reply to 4.5.3修改其他节点参数，[INFO] [1763206927.409951296] [turtle_controller]: 参数更新失败，原因：parameter &#x27;k&#x27; cannot be set because it was not declared on Sat, 22 Nov 2025 10:20:07 GMT]]></title><description><![CDATA[<p dir="auto"><a class="mention plugin-mentions-user plugin-mentions-a" href="https://fishros.org.cn/forum/uid/27984">@49736207</a> 没有解决</p>
]]></description><link>https://fishros.org.cn/forum/post/19288</link><guid isPermaLink="true">https://fishros.org.cn/forum/post/19288</guid><dc:creator><![CDATA[ddl]]></dc:creator><pubDate>Sat, 22 Nov 2025 10:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to 4.5.3修改其他节点参数，[INFO] [1763206927.409951296] [turtle_controller]: 参数更新失败，原因：parameter &#x27;k&#x27; cannot be set because it was not declared on Wed, 19 Nov 2025 09:02:02 GMT]]></title><description><![CDATA[<p dir="auto">请问这个问题解决了吗？</p>
]]></description><link>https://fishros.org.cn/forum/post/19280</link><guid isPermaLink="true">https://fishros.org.cn/forum/post/19280</guid><dc:creator><![CDATA[49736207]]></dc:creator><pubDate>Wed, 19 Nov 2025 09:02:02 GMT</pubDate></item></channel></rss>