【问题标题】:Why are consecutive timestamps in rosbag equal once in a while?为什么rosbag中的连续时间戳偶尔相等?
【发布时间】:2022-12-12 05:10:22
【问题描述】:

我在 MSI GF66 上的 Ubuntu 20.04(内核版本 5.15.0-53-generic)上使用 ROS Noetic,在分析记录的 rosbag 时遇到了一个奇怪的问题。

我必须通过 Simulink 模型以 10 Hz 的速度向 Turtlebot 的 /cmd_vel 主题发布一些消息,该 Turtlebot 在 Gazebo 中移动并记录 /odom/cmd_vel 主题。在分析记录的包时,我发现了一个奇怪的现象:每隔一段时间,两个连续的时间戳完全相等,即使主题的两个对应消息的值不相等(它同时适用于/odom和@987654326 @).

我在 Matlab 中使用以下脚本从包中提取信息:

bagSelect = rosbag('BagPubSimulink.bag');

odomBag = select(bagSelect, 'Time', [bagSelect.StartTime bagSelect.EndTime], 'Topic', '/odom');

odomStructs = readMessages(odomBag, 'DataFormat','struct');

odomTime = odomBag.MessageList.Time;

然后,我在odomStructs 上循环以提取我需要的消息,比方说odomX

出现问题时,用两个瞬间kk + 1

odomTime(k : k + 1) = {149.674000000000; 149.674000000000}

odomX(k : k + 1) = {-0.790906331505904; -0.787962666465643}`

我注意到当考虑的主题具有较高的发布频率时,这个问题在记录包中更频繁地发生,例如如果我记录/clock话题,这个连续时间戳相等的问题被放大,可以持续超过两个连续时间戳。

你能帮我解决这个问题吗?

为了安装 ROS,我按照 https://emanual.robotis.com/docs/en/platform/turtlebot3/quick-start/ 上的说明进行操作,直到第 1.1.5 段。

实际上,我不得不从同一页面中链接的视频中添加一些代码行,因为它们没有写在那里。

如果有什么不清楚的地方以及我是否没有使用正确的措辞,我很抱歉,但我是 Ubuntu 和 ROS 的新手,我还有很多东西要学。

请告诉我是否必须提供更多详细信息才能制定解决方案。

编辑

问题不是因为重复的时间戳属于我记录的两个主题的两条消息。其实这是变量bagSelectMessageList

Time                Topic        MessageType            FileOffset

99.3160000000000    '/cmd_vel'  'geometry_msgs/Twist'   402403
99.3170000000000    '/odom'     'nav_msgs/Odometry'     402497
99.3270000000000    '/odom'     'nav_msgs/Odometry'     403261
99.3690000000000    '/odom'     'nav_msgs/Odometry'     404025
99.4150000000000    '/cmd_vel'  'geometry_msgs/Twist'   404789
99.4170000000000    '/odom'     'nav_msgs/Odometry'     404883
99.4610000000000    '/odom'     'nav_msgs/Odometry'     405647
99.4610000000000    '/odom'     'nav_msgs/Odometry'     406411
99.5050000000000    '/odom'     'nav_msgs/Odometry'     407175
99.5160000000000    '/cmd_vel'  'geometry_msgs/Twist'   407939
99.5270000000000    '/odom'     'nav_msgs/Odometry'     408033
99.5730000000000    '/odom'     'nav_msgs/Odometry'     408797
99.6160000000000    '/cmd_vel'  'geometry_msgs/Twist'   409561
99.6170000000000    '/odom'     'nav_msgs/Odometry'     409655
99.6650000000000    '/odom'     'nav_msgs/Odometry'     410419
99.6650000000000    '/odom'     'nav_msgs/Odometry'     411183
99.7120000000000    '/odom'     'nav_msgs/Odometry'     411947
99.7150000000000    '/cmd_vel'  'geometry_msgs/Twist'   412711

有趣的是,/odom 是这个包中唯一遇到时间戳重复问题的主题。因此,该问题似乎不影响我自己发布的主题。

事实上,我已经尝试记录 /clock 主题,只有 Turtlebot 保持静止在 Gazebo 世界中,而在 MessageList 中,我得到一堆相同的时间戳,指的是不同的时间瞬间,这意味着消息/clock 主题正确地彼此不同。

【问题讨论】:

    标签: matlab ros gazebo-simu


    【解决方案1】:

    我认为您在 odomTime 中阅读的内容不是主题 /odom 中消息的时间戳,当您使用 MessageList 时,MessageList 表包含包中每条消息的一行(在您的情况下是原始的/odom/cmd_vel 的原始文件,这就是你两次获得时间戳的原因。 更多信息请参考this tutorial

    【讨论】:

    • 您好,谢谢您的回答。不幸的是,它没有解决我的问题。事实上,如果我查看bagSelectMessageList(因此,在提取odomBag 之前),重复的时间戳实际上属于/odom 主题。有关更多信息,请参阅我的问题的编辑。
    • 你能不能通过这里的链接分享这个包,我会尝试调试它。
    • 我设法解决了我的问题。我必须提取与 /odom 主题相关联的包内的 header.stamp。这个问题仍然困扰着我,因为我没有在我以前使用的机器上体验过它(它的功能远没有那么强大),但至少我现在可以在不对时间向量进行插值的情况下分析一个包。感谢您的考虑。
    【解决方案2】:

    我通过执行以下操作解决了问题:

    for ii = 1 : length(odomStructs)
        sec = cast(odomStructs{ii}.Header.Stamp.Sec, 'double');
        nsec = cast(odomStructs{ii}.Header.Stamp.Nsec, 'double');
        odomTime(ii, 1) = sec + nsec*1e-9;
    end
    

    通过这种方式,我阅读了header.stamp,它没有受到同样问题的影响。

    不要介意循环的假设效率低下,我以这种方式实现它只是为了确保我没有采用错误的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 2013-03-11
      • 2022-12-20
      • 2013-07-19
      • 1970-01-01
      • 2017-07-07
      • 2017-06-25
      • 2010-10-09
      相关资源
      最近更新 更多