我在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
。
问题发生时取k
和k + 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都是新手,我有很多东西要学。
如果我需要提供更多的细节来解决问题,请告诉我。
编辑
这个问题不是由于重复的时间戳属于我记录的两个主题的两个消息。实际上,这是变量bagSelect
的MessageList
:
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
,它不受相同问题的影响。
不要介意假设的循环效率低下:我这样实现只是为了确保我没有取错元素。