matlab 为什么Rosbag中的连续时间戳偶尔会相等?

vxbzzdmp  于 2022-12-13  发布在  Matlab
关注(0)|答案(2)|浏览(205)

我在一个MSI GF 66上使用Ubuntu 20.04(内核版本5.15.0-53-generic)上的ROS Noetic,在分析一个记录的rosbag时遇到了一个奇怪的问题。
我必须通过Simulink模型以10 Hz的频率发布一些消息给Turtlebot的/cmd_vel主题,Turtlebot在Gazebo中移动并记录/odom/cmd_vel主题。在分析记录的袋子时,我注意到一些奇怪的事情:偶尔,两个连续的时间戳完全相等,即使该主题的两个相应消息的值不相等(对于x1M3 N1 x和x1M4 N1 x都成立)。
我在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是这个包中唯一存在时间戳重复问题的主题,因此,这个问题似乎并不影响我自己发布的主题。
事实上,我试过只在Turtlebot停留在Gazebo世界的情况下记录/clock主题,在MessageList中,我得到了一堆相等的时间戳,指的是不同的时刻,这意味着/clock主题的消息是正确的,彼此不同。

5q4ezhmt

5q4ezhmt1#

我认为您在odomTime中阅读的不是主题/odom中消息的时间戳,当您使用MessageList时,MessageList表中包含包中每条消息的一行(在您的示例中,/odom为原始数据,/cmd_vel为原始数据,这是因为您将获得两次时间戳。请参阅this tutorial了解更多信息

5n0oy7gb

5n0oy7gb2#

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

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,它没有受到同样问题的影响。
不要介意假设的循环效率低下:我以这种方式实现它只是为了确保我没有取错元素。

相关问题