ros::spinonce()一般与loop_rate.sleep()同时出现,用来控制处理回调函数的频率,并且没有消息就收来时,就会程序堵塞,不会占用CPU资源。
ros::spin(),用于回调函数的处理,并且执行这段程序就会进入无限次循环(消息来一次,回调函数就会立即处理一次,没有阅读到消息的时候,spin循环将会堵塞,不会占用CPU资源),直到ctrl_c来临,或者其他终止信号来临。一般所有的程序都写在这段语句之前,因为其之后的程序,不会被执行。
两条语句与publish没有关系,只与回调函数有关系。
两者都是为回调函数的消息创建队列依次去执行。区别就是spin是个无限循环,只要队列里消息在,程序就会立即执行回调函数。
而spinonce是根据程序所设的频率,在while里依次调用spinonce,根据队列里消息的前后顺序,依次调用回调函数。
总结两个关键词(消息队列与轮转执行,回调函数)。