参考:http://wiki.ros.org/roscpp/Overview/Time
ROS 具有内置的 time
和duration
基元类型,roslib 分别提供 ros::Time 和 ros::Duration 类。 时间是一个特定的时刻(例如“今天下午 5 点”),而Duration
是一段时间(例如“5 小时”)。 Duration
可以为负。
时间和持续时间具有相同的表示形式:
int32 sec
int32 nsec
time
不能为负值,而duration
可以同时包含正值和负值(用负sec
表示; nsec
始终为非负值)。 请注意,负durations
会解释 sec 和 nsec,因此 float_time = sec + nsec * 10e-9
,因此例如 sec = -1、nsec = 5e8
的持续时间实例表示durations
为 -0.5 秒而不是 -1.5 秒。
ROS 能够为节点设置模拟时钟。 您应该使用 roscpp 的时间例程来访问当前时间,而不是使用平台时间例程,这将与模拟时钟时间以及挂钟时间无缝配合。
ros::Time begin = ros::Time::now();
当使用模拟时钟时间时,now() 返回时间 0,直到在 /clock 上收到第一条消息为止,因此 0 本质上意味着客户端尚不知道时钟时间。 因此,应以不同方式对待 0 值,例如循环 now() 直到返回非零值。
您还可以将时间或持续时间创建为特定值,可以是浮点秒:
ros::Time a_little_after_the_beginning(0.001);
ros::Duration five_seconds(5.0);
Time 和 Duration 对象也可以转换为浮点秒:
double secs =ros::Time::now().toSec();
ros::Duration d(0.5);
secs = d.toSec();
与其他基元类型一样,您可以对时间和持续时间执行算术运算。 人们最初常常对这些实例的算术是什么样的感到困惑,因此最好运行一些示例:
1 hour + 1 hour = 2 hours (duration + duration = duration)
2 hours - 1 hour = 1 hour (duration - duration = duration)
Today + 1 day = tomorrow (time + duration = time)
Today - tomorrow = -1 day (time - time = duration)
Today + tomorrow = error (time + time is undefined)
Time 和 Duration 实例的算术与上面的示例类似:
ros::Duration two_hours = ros::Duration(60*60) + ros::Duration(60*60);
ros::Duration one_hour = ros::Duration(2*60*60) - ros::Duration(60*60);
ros::Time tomorrow = ros::Time::now() + ros::Duration(24*60*60);
ros::Duration negative_one_day = ros::Time::now() - tomorrow;
睡眠持续时间指定的时间量:
ros::Duration(0.5).sleep(); // sleep for half a second
roslib 提供了一个 ros::Rate 便利类,它尽最大努力维持循环的特定速率。 例如:
ros::Rate r(10); // 10 hz
while (ros::ok())
{
... do some work ...
r.sleep();
}
在上面的示例中,Rate 实例将通过考虑循环期间完成的工作所使用的时间来尝试将循环保持在 10hz。
注意:一般建议使用Timers而不是Rate。 有关详细信息,请参阅计时器教程。
对于即使在模拟中运行也希望访问实际挂钟时间的情况,roslib 提供了所有时间结构的 Wall 版本,即 ros::WallTime、ros::WallDuration 和 ros::WallRate,它们具有相同的接口 分别为 ros::Time、ros::Duration 和 ros::Rate。