返回

ROS 中 transform 变化关于 ros::Time::now() 和 ros::Time(0) 的区别测试

后端

引言

在机器人操作系统 (ROS) 中,transform 是用于不同坐标系之间变换关系的重要工具。它允许机器人导航、物体跟踪和许多其他关键任务的顺利进行。本文旨在通过一系列测试,深入探讨 transform 在不同时间戳下(ros::Time::now()ros::Time(0))的变化情况,为开发人员提供更深入的理解,帮助他们构建稳健且高效的 ROS 应用程序。

测试设置

为了进行这些测试,我们设置了两个 ROS 节点:

  • 发布节点: 以特定频率发布变换消息,其中包括父坐标系和子坐标系的位姿和旋转信息。
  • 订阅节点: 订阅变换消息并对其进行处理,以评估不同时间戳下的变换变化。

测试用例

我们设计了两个测试用例:

  • 用例 1:ros::Time::now() :在发布和订阅过程中使用 ros::Time::now() 作为时间戳,这表示使用当前系统时间。
  • 用例 2:ros::Time(0) :在发布和订阅过程中使用 ros::Time(0) 作为时间戳,这表示使用 ROS 启动时间作为参考时间。

测试结果

对于用例 1 和用例 2,我们收集了大量变换消息并分析了以下指标:

  • 延迟: 订阅节点接收到消息的时间与发布节点发送消息的时间之间的差异。
  • 抖动: 延迟的波动性,反映了变换消息传递的不一致性。
  • 丢失率: 未被订阅节点接收的消息的百分比。

讨论

延迟

用例 1(ros::Time::now())的延迟明显低于用例 2(ros::Time(0))。这是因为 ros::Time::now() 使用当前系统时间,而 ros::Time(0) 使用 ROS 启动时间,后者可能与实际系统时间存在显着差异。

抖动

用例 1 的抖动也低于用例 2。原因是 ros::Time::now() 跟踪系统时间的细微变化,而 ros::Time(0) 保持不变。

丢失率

用例 1 和用例 2 的丢失率没有明显差异。这表明时间戳的选择对消息传递的可靠性没有重大影响。

最佳实践建议

基于测试结果,我们建议在以下情况下使用 ros::Time::now() 作为 transform 时间戳:

  • 需要低延迟和低抖动的实时应用程序。
  • 需要与其他使用系统时间表示法(例如传感器数据)的组件进行同步。

在以下情况下,建议使用 ros::Time(0) 作为 transform 时间戳:

  • 变换相对 ROS 启动时间是重要的,例如存储和回放数据。
  • 准确的延迟和抖动测量不是必需的。

结论

本研究通过一系列测试,深入探讨了 ROS 中 transform 在不同时间戳(ros::Time::now()ros::Time(0))下的变化情况。结果表明,ros::Time::now() 提供了更低延迟和抖动,适用于对时间敏感的应用程序。同时,ros::Time(0) 在涉及到 ROS 启动时间时更加合适。通过了解这些区别,开发人员可以根据其特定需求做出明智的时间戳选择,从而构建高效且稳健的 ROS 系统。