ros2——Time

参考:http://wiki.ros.org/roscpp/Overview/Time

Time and Duration

ROS 具有内置的 timeduration基元类型,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 的时间例程来访问当前时间,而不是使用平台时间例程,这将与模拟时钟时间以及挂钟时间无缝配合。

Getting the Current Time

ros::Time begin = ros::Time::now();

Time zero

当使用模拟时钟时间时,now() 返回时间 0,直到在 /clock 上收到第一条消息为止,因此 0 本质上意味着客户端尚不知道时钟时间。 因此,应以不同方式对待 0 值,例如循环 now() 直到返回非零值。

Creating Time and Duration Instances

您还可以将时间或持续时间创建为特定值,可以是浮点秒:

ros::Time a_little_after_the_beginning(0.001);
ros::Duration five_seconds(5.0);

Converting Time and Duration Instances

Time 和 Duration 对象也可以转换为浮点秒:

double secs =ros::Time::now().toSec();

ros::Duration d(0.5);
secs = d.toSec();

Time and Duration Arithmetic

与其他基元类型一样,您可以对时间和持续时间执行算术运算。 人们最初常常对这些实例的算术是什么样的感到困惑,因此最好运行一些示例:

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;

Sleeping and Rates

睡眠持续时间指定的时间量:

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。 有关详细信息,请参阅计时器教程。

Wall Time

对于即使在模拟中运行也希望访问实际挂钟时间的情况,roslib 提供了所有时间结构的 Wall 版本,即 ros::WallTime、ros::WallDuration 和 ros::WallRate,它们具有相同的接口 分别为 ros::Time、ros::Duration 和 ros::Rate。

你可能感兴趣的:(ROS——一文读懂,ROS2)