Skip to content

ROS 中的多机时间同步方法

在现在的互联网时代,时间同步变得越来越重要。一般来说,我们都希望我们的笔记本电脑上的时间与网络上的时间保持同步。这不仅可以确保我们的计算机上的信息记录是准确的,而且还可以保证我们在进行网络交易时的时间记录是准确的。难以想象,巨大的时差会导致多少损失。因此,我们需要找到一种方法,让我们的笔记本电脑与网络上的时间保持同步。

两种计时体系:地球自转和量子跃迁

  • 在上世纪 60 年代以前,人们使用的是世界时。

1 秒是地球自转周期的 1/86400,根据这样的秒定义出的时间就是世界时。由于零度经线经过英国的格林尼治天文台,因此世界时被定义为格林尼治天文台所在时区的时间,全世界的时间都以此为标准,各地使用时加上时区差即可。

  • 2 无可奈何的折中:让 1 分钟变成 61 秒

世界时的时间严格反映了地球的自转。在测绘、深空探测、航空、航海等领域,需要对太空或者地球进行观测,希望能知道地球什么时间在什么位置,这需要世界时。另外,用原子时还会有另外一个问题,由于地球自转变慢,三万年以后,原子时的 24 小时对应世界时的 30 小时,有的时候,午夜零点太阳就升起来,那这种情况到底该不该起床呢?所以,使用原子时也会给人的生活带来麻烦。

尽管如此,仍然有很多人需要用原子时。在电子、通信等行业,这些人根本不关心地球转到什么地方,他们只需要均匀、稳定的时间间隔,他们认为,原子时是最好的时间。

这两帮人就吵了起来,到底该怎么办呢?

需要世界时的人需要的是世界时的时刻,需要原子时的人需要的是原子时秒长的均匀性,于是,科学家想办法创造出一种兼有这两种时间优点的时间尺度——协调世界时 (UTC)。

问题重述

通常,ROS 客户端库将使用计算机的系统时钟作为时间源,也称为“挂钟”或“墙壁时间”(就像实验室墙上的时钟)。然而,当您运行模拟或回放记录的数据时,通常希望系统使用模拟时钟,以便您可以加速、减慢或逐步控制系统的感知时间。例如,如果您正在系统中回放传感器数据,您可能希望时间与传感器数据的时间戳相对应。

当然在一个共用一个系统时钟时,则无需考虑这个问题。但是在多机系统中,时间同步是一个非常重要的问题。每台机器都会有自己的系统时钟,如果各个机器的时间不同步,那么可能会导致很多问题,比如数据不一致、通信延迟等。因此,我们需要找到一种方法,让各个机器的时间保持同步。

在 ROS 中,我们常常会遇到如下图中的问题

Time out waiting for transform

Costmap2DROS transform timeout

方法一:使用 NTP

NTP(Network Time Protocol)是一种网络时间协议,用于在计算机之间同步时间。NTP 服务器通常由专门的硬件或软件提供,可以提供高精度的时钟同步。

在多台机器上使用 NTP 进行时间同步,可以按照以下步骤进行:

  1. 在每台机器上安装 NTP 客户端软件。
  2. 配置 NTP 客户端软件,使其连接到 NTP 服务器。
  3. 启动 NTP 客户端软件,开始同步时间。

NTP 客户端软件会定期与 NTP 服务器进行通信,以获取最新的时间信息,并将其应用到本地计算机上。这样,多台机器上的时间就可以保持一致。

具体的操作过程可以参考 ROS 多机通信时间同步

方法二:连接互联网进行时间同步

常见情况是,电脑刚开机进入 Windows 后,发现右下角的时间和日期都是错误的,还有比如说重装 Windows 后,发现电脑的时间直接倒回了几年前,这显然是不可接受的。所以联网同步时间是一个很常见的需求。

由于可以自动同步真实时间的 Windows 自带的 NTP 服务器都在美国,有时间经常无法访问。所以我们可以 选择一些国内可用的 NTP 服务器,比如:

ntp.ntsc.ac.cn

所以,触类旁通,对于处于一个局域网网络的多台终端设备,需要想办法让该局域网连接到公用网络(即互联网),这样首先在网络层上,各个设备的时间就有了理论上进行时间同步的可能性。在 Linux 系统中,连接到公网一段时间后,会自动同步到准确的 UTC 时间。

在基于 Linux 的 ROS 系统中,我们也可以使用终端命令来手动同步时间:

bash
sudo ntpdate ntp.ntsc.ac.cn

然后重启自己的 ROS 节点即可