目录
写在前面
我们不是来蹭“时间管理大师”热度的,而是实实在在讨论ROS2获取时间戳的技术。
既然要讨论“时间管理”,一向想好学的我们,肯定得去网上查查大家和专家是怎么理解,怎么定义的。反正,不管生活、工作还是学习,都用得上。
时间管理是指通过事先规划和运用一定的技巧、方法与工具实现对时间的灵活以及有效运用,从而实现个人或组织的既定目标的过程。
说得有点复杂,我们通俗地讲,时间管理是基本技能,干啥都需要。
对于ROS2环境里的软件编程而言,时间管理无外乎两类,定频与计时。
定频,以固定周期持续运转;计时,更加灵活,与回调函数配合使用。
(扩展知识:回调函数与spin_once或spin配合使用,参见下文)
一文搞懂ROS2的spin_some, spin和ROS的spinOncehttps://blog.youkuaiyun.com/slampai/article/details/127992755
一、C++(使用rclcpp)
1. 计时与时间戳
1.1 C++原生
C++ 标准库中有三种时钟,且都在chrono包中。他们分别是system_clock、steady_clock和high_resolution_clock
。
三者用法相似,我们已system_clock为例说明,其他两种在system_clock对应位置替换即可。
#include <chrono>
#include <iostream>
#include <time>
std::chrono::steady_clock::time_point start= std::chrono::system_clock::now();
// do something...
std::chrono::steady_clock::time_point end = std::chrono::system_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Time span(s): " << diff.count() << " s\n";
std::cout << "Time span(ns): "
<< std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()
<< "us.\n";
再来说说三者的区别。
system_clock
是系统时钟。可修改的,也可同步网络时间。可以认为有很大的相对性和主观性。steady_clock
是单调时钟。其时间点单向递增,类似秒表,通常精度能达到纳秒级别,适合计时。
对于high_resotion_clock,简单的说,不推荐使用,因为不适合移植和稳定编译。
high_resolution_clock
在不同标准库之间有不同的实现。通常它只是system_clock和steay_clock的别名,取决于库或配置。例如对于gcc
的libstdc++
它是system_clock
,对于MSVC,
它是steady_clock
,而对于clang
的libc++
,它取决于配置。所以推荐直接使用对应的时钟,而不是high_resolution_clock
。简单地说,不推荐使用high_resotion_clock。
1.2 ROS2的三种时钟和两种时间戳
与C++类似,ROS2
中定义了三种时钟。
默认是使用RCL_SYSTEM_TIME,即系统时间,对应
C++的
system_clock
。
typedef enum rcl_clock_type_t
{
/// Clock uninitialized
RCL_CLOCK_UNINITIALIZED = 0,
/// Use ROS time
RCL_ROS_TIME,
/// Use system time
RCL_SYSTEM_TIME,
/// Use a steady clock time
RCL_STEADY_TIME
} rcl_clock_type_t;
ROS2
中存在两种时间戳,一种是实际的物理系统时间,另一种是仿真时间,对应着在线与仿真。两种时间通过参数可以use_sim_time
设置,可以写在<