1. 程式人生 > >ROS 中對 ros::spin() 和ros::spinOnce() 的認識

ROS 中對 ros::spin() 和ros::spinOnce() 的認識

pre 節點 我想 lB pan spa clas all llb

ros::spin()

這句話的意思是循環且監聽反饋函數(callback)。循環就是指程序運行到這裏,就會一直在這裏循環了。監聽反饋函數的意思是,如果這個節點有callback函數,那寫一句ros::spin()在這裏,就可以在有對應消息到來的時候,運行callback函數裏面的內容。
就目前而言,以我愚見,我覺得寫這句話適用於寫在程序的末尾(因為寫在這句話後面的代碼不會被執行),適用於訂閱節點,且訂閱速度沒有限制的情況。

ros::spinOnce()

這句話的意思是監聽反饋函數(callback)。只能監聽反饋,不能循環。所以當你需要監聽一下的時候,就調用一下這個函數。
這個函數比較靈活,尤其是我想控制接收速度的時候。配合ros::ok()效果極佳。
例如

ros::Rate loop_rate(10);
while(ros::ok())
{
    ros::spinOnce();
    loop_rate.sleep();
}

可以控制10Hz速度,運行callback函數,非常方便。
如果只有

while(ros::ok())
{
    ros::spinOnce();
}

這就等於ros::spin()。

註意

這兩個函數只和接收回調函數(callback)有關,和發布並沒有關系。如果想循環發布,只能循環寫publish()。見參考文獻[1]的發布節點示例。
我這次出問題就是和發布弄混了。我以為寫了spin()可以循環發布的,後來發現並不是。

轉自:https://blog.csdn.net/yessharing/article/details/65520527

ROS 中對 ros::spin() 和ros::spinOnce() 的認識