You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS pid功能包无法读取第二个setpoint值问题排查求助

问题排查方案

1. 控制器频率配置不匹配

你在launch文件中为y轴PID配置的min_loop_frequency参数为95Hz,该参数要求setpoint、state两个输入话题的更新速率都不得低于95Hz。但你当前的setpoint发布节点单次循环发布2条消息、循环速率仅为10Hz,实际发布速率只有20Hz,远低于最低阈值,控制器会判定输入更新不达标,拒绝执行计算逻辑,不会初始化时间戳变量,因此触发prev_time is 0报错。

  • 修复方案:
    • 调低launch文件中min_loop_frequency参数到10Hz以下,匹配现有发布速率
    • 或将setpoint发布节点的循环速率调高到100Hz以上,同时确认/pid_y/state话题的更新速率也满足频率要求
<!-- 修改示例:调整PID频率阈值 -->
<param name="min_loop_frequency" value="5.0" />

2. 初始发布消息丢失

ROS的Publisher对象创建后,需要几十到几百毫秒的时间和订阅者完成连接握手,你在创建Publisher后立刻发布的前几条消息会直接丢弃,导致PID控制器从未收到第一条setpoint消息,始终停留在Waiting first setpoint value状态。

  • 修复方案:创建Publisher后新增1~2秒等待延迟,确保订阅连接建立完成后再开始发布消息,代码修改示例:
ros::Publisher pub = nh.advertise<std_msgs::Float64>("/pid_y/setpoint_y", 1000);  
// 新增延迟代码
ros::Duration(2.0).sleep();
ros::Rate loop_rate(10);

3. 时钟同步异常

如果当前运行的是Gazebo等仿真环境,未开启全局仿真时钟参数会导致PID控制器和传感器节点的时间戳不匹配,控制器无法计算两次消息的时间差,也会触发prev_time is 0报错。

  • 修复方案:在launch文件开头加入全局参数配置:
<param name="/use_sim_time" value="true" />

4. 话题连通性验证

运行以下命令确认话题链路正常:

  • 执行rostopic echo /pid_y/setpoint_y确认setpoint消息正常发布
  • 执行rostopic info /pid_y/setpoint_y确认PID控制器节点已成功订阅该话题
  • 执行rostopic hz /pid_y/setpoint_y、rostopic hz /pid_y/state确认两个输入话题的更新速率符合PID配置要求

内容的提问来源于stack exchange,提问作者Francina Carron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:27:02