目录

最近用 AsyncSpinner 做了一个独立 callback queue 的 ROS 程序,其中使用了 dynamic_reconfigure 的的方法进行动态配置修改,但程序跑起来之后发现只有在刚刚跑起来的初始化 dynamic_reconfigure::Server 的时候进行了一次配置加载和更新,后面无论用 rqt_configure 设置都无法成功调用到程序的配置更新 callback。这段代码参考了 AsyncSpinner 中的一段例子代码:

ros::AsyncSpinner spinner(4); // Use 4 threads
spinner.start();
ros::waitForShutdown();

阅读 ROS 代码后发现了问题出在了使用 “ros::waitForShutdown()” 上面。”waitForShutdown()” 只是一个检查 ROS 是否正常的循环,并不作任何 spinner 处理。

void waitForShutdown()
{
  while (ok())
  {
    WallDuration(0.05).sleep();
  }
}

而 dynamic_reconfigure::Server 默认会创建一个 NodeHandle,默认情况下 NodeHandle 需要使用 spinner 进行消息循环的处理,显然 waitForShutdown() 并没有这么处理。

  Server(const ros::NodeHandle &nh = ros::NodeHandle("~")) :
    node_handle_(nh),
    mutex_(own_mutex_),
    own_mutex_warn_(true)
  {
    init();
  }

解决方法就是把 “ros::waitForShutdown()” 用 “ros::spin()” 替代就可以解决。