使用 ros::waitForShutdown() 导致 dynamic_reconfigure::Server 无法正常获取配置更新的问题
目录
最近用 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()” 替代就可以解决。