玩转ROS2-一文学会ROS2的定频和计时功能(Rate和Timer)

本文深入探讨ROS2中时间管理的各个方面,包括C++和Python环境下计时器(Timer)、速率(Rate)的使用,以及如何在不同场景下选择WallRate和Rate。详细讲解了C++中的三种时钟和时间戳,以及Python中的时间模块,帮助读者掌握在ROS2中实现定频和计时功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

写在前面

一、C++(使用rclcpp)

1. 计时与时间戳

1.1 C++原生

1.2 ROS2的三种时钟和两种时间戳

​1.3 ROS2自带的时间获取方式

2. 使用timer

3. 使用rate——WallRate和Rate选哪个?

4. 使用thread

二、python(使用rclpy)

1. python的time模块

2. 使用timer

3. 使用rate

4. 使用thread

后面的话


写在前面

我们不是来蹭“时间管理大师”热度的,而是实实在在讨论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的别名,取决于库或配置。例如对于gcclibstdc++ 它是system_clock ,对于MSVC,它是 steady_clock ,而对于clanglibc++,它取决于配置。所以推荐直接使用对应的时钟,而不是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设置,可以写在<

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值