我是ROS新手并试图了解这个强大的工具。我对spin和rate.sleep函数感到困惑。任何人都可以帮助我区分这两个功能以及何时使用哪个?谢谢。
答案 0 :(得分:12)
ros::spin()
和ros::spinOnce()
可用于处理通信事件,例如到达的消息。如果您要订阅消息,服务或操作,则必须调用spin来处理事件。
虽然ros :: spinOnce()处理事件并立即返回,但是ros :: spin()会阻塞,直到ros调用关闭。因此,如果需要,ros :: spinOnce()可以为您提供更多控制。有关此问题的更多信息:Callbacks and Spinning。
另一方面,rate.sleep()仅仅是线程休眠,持续时间定义为频率。这是一个例子
ros::Rate rate(24.);
while(ros::ok())
{
rate.sleep();
}
此循环将每秒执行24次或更少,取决于您在循环内执行的操作。 ros::Rate
对象记录自上次执行rate.sleep()
以来的时间,并在正确的时间内睡眠达到24 Hz标记。请参阅ros::Rate::sleep()
API。
时域中的等效方式是ros::Duration::sleep()
ros::Duration duration(1./24.);
while(ros::ok())
{
duration.sleep();
}
您使用哪一个只是为了方便。