为什么rosbag中的连续时间戳每隔一段时间相等一次?



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

我必须通过Simulink模型以10 Hz的频率发布一些消息到在Gazebo中移动的Turtlebot的/cmd_vel主题并记录/odom/cmd_vel主题。在分析记录的包时,我注意到一些奇怪的事情:每隔一段时间,两个连续的时间戳是完全相等的,即使主题的两个对应消息的值不相等(它对/odom/cmd_vel都是相等的)。

我在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主题,只有乌龟在凉亭世界里呆着,在MessageList里面,我得到了一堆相等的时间戳,指的是不同的时间瞬间,这意味着/clock主题的消息是正确不同的。

我认为您在odomTime中阅读的不是主题/odom中的消息的时间戳,当您使用MessageList时,MessageList表包含包中每个消息的一行(在您的情况下是/odom的原始数据和/cmd_vel的原始数据,这就是为什么您获得两次时间戳。更多信息请参考本教程

我通过以下方法解决了这个问题:

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,它不受相同问题的影响。

不要介意假设的循环效率低下:我这样实现只是为了确保我没有取错元素。

最新更新