参考这个教程:https://blog.csdn.net/yaked/article/details/50776224,其中的内容更为详细。以下记录我的学习心得
1.spin()和spinOnce()的区别
常见的用法如下:
spin():
ros::init(argc, argv, "my_node");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe(...);
...
ros::spin();
spinOnce():
ros::Rate r(10); // 10 hz
while (should_continue)
{
... do some work, publish some messages, etc. ...
ros::spinOnce();
r.sleep();
}
简单从名字出发理解,spin
就是自旋,即程序在此处循环,spinOnce
就是只处理一次。
对于程序中,可以看到spin
并不是在某一个循环中,可以简单理解为它就是一个循环。而spinOnce
一般位于while(node.ok())
之中,while的每一次循环都将执行一次spinOnce
。
2.spin()和spinOnce()的联系
无论是spin()
还是spinOnce()
都是用于处理回调函数,这里的回调函数是指注册在ros默认callbackQueue的回调函数。在spin()
中,将它看成一个循环,就是在不断在循环中处理所有注册的回调函数。而spinOnce()
则是每一次执行的时候处理一次全部回调函数。