最近在搞一个用于机器人移动的action server,使用c++编写,主要就是给下位机发送目的点坐标并在一个循环中判断机器人是否到达目标点。在这个过程中需要不断监听里程计消息。众所周知ros中监听消息的机制是使用回调函数,而回调函数是在ros::spin中调用的,这就带来一个问题:action server本身是消息通信机制的一个封装,而当用户定义的action server回调函数在ros::spin中被调用时,里程计消息的subscriber所对应的callback就无法被调用,也就是说,在action server接收到一个goal时,里程计信息无法被更新。
但实际测试发现一切正常,我上面提到的问题并没有出现。(竟然可以运行,为什么呢.jpg)
于是查阅action server的代码,发现下面这段,在SimpleActionServer的构造函数中:
SimpleActionServer在内部单开了一个线程用于接收goal并调用回调函数。