1、在使用ros服务通讯时,发现服务端与客户端可以建立连接,但是客户端发送请求时,服务端无法响应进入回调函数。
原因:错误使用ros::spin()
ros::spin()和ros::spinonce()的区别:
spin()函数:spin()是一个阻塞调用,它会使客户端节点一直处于活跃状态,直到节点被强制终止(比如按下Ctrl+C)或ROS Master停止。spin()函数是一个无限循环,会持续处理消息回调和其他ROS事件,直到节点退出。
spinOnce()函数:spinOnce()是一个非阻塞调用,它只会处理当前已经到达的ROS消息和事件,并在处理完后立即返回。如果没有新的消息或事件到达,spinOnce()会立即返回,而不会阻塞节点的执行。
void callback()
{
}
int main(int argc,char* argc[])
{
while(1)
{
>>>>>>>>>>>>>
}
ros::spin();
}
这种写法由于死循环的存在,无法运行到ros::spin()函数位置,也就无法处理请求进入回调函数,因此要考虑使用spinOnce()函数
void callback()
{
}
int main(int argc,char* argc[])
{
while(1)
{
>>>>>>>>>>>>>
ros::spinOnce();
}
}
这种写法,当运行到spinOnce()时,会一次性处理完所有的消息回调函数
因此需要注意的时,使用spinOnce()需要确保循环频率足够高,以确保能及时处理到达的消息和事件。否则,如果循环频率过低,可能会导致消息处理不及时或丢失消息。