最近开始学习ORB-SLAM3,按照官方文档运行EuRoc的rosbag测试时,发现rosbag里的话题名(/cam0/image_raw和/cam1/image_raw)和ORB-SLAM3源码中订阅话题(/camera/left/image_raw和/camera/right/image_raw)不一样,出于不想改源码的懒惰,发现了一个ROS提供的工具topic_tools/throttle,可以运行该节点来发布一个符合需要话题名的新话题,并限制最大发布频率或最大带宽,主要是为了起到限制资源即节流(throttle)的作用,ROS文档见https://wiki.ros.org/topic_tools/throttle,topic_tools/throttle是可以针对任何消息类型工作的。
throttle有throttle message和throttle bytes两种模式,实际我要使用到的是前者。
(1)throttle message (rate)
其命令格式为
throttle messages <intopic> <msgs_per_sec> [outtopic]
作用:将<intopic>上的消息节流到指定的频率
参数说明:
intopic: 订阅的话题,即想做节流或改名的话题
msgs_per_sec: 每秒允许通过(let through)的最大消息数
outtopic: throttle节点发布的话题名,若缺省该参数,发布话题默认为intopic_throttle
例如,限制占用带宽的激光雷达话题(base_scan)到1Hz
rosrun topic_tools throttle messages base_scan 1.0
我需要使用到的是该模式,在使用中注意到这个msgs_per_sec参数表示的是每秒允许通过的最大消息数,所以只想给话题改个名并保证和原话题同频率的话,该参数需要设置的偏大一些,不然改名后话题的发布频率会下降很多。比如我本次使用中,rosbag中原话题/cam0/image_raw频率为20Hz,所以我在运行throttle节点时会将频率设为40或者50,这样更名后话题的发布频率也没有下降。
rosrun topic_tools throttle messages /cam0/image_raw 40 /camera/left/image_raw
(2)throttle bytes (bandwidth)
其命令格式为
rosrun topic_tools throttle bytes <intopic> <bytes_per_sec> <window> [outtopic]
作用:给<intopic>上的消息限制在某一个最大带宽(bytes_per_sec)
参数说明:
intopic: 订阅的话题,即想做节流或改名的话题
bytes_per_sec: 每秒允许通过(let through)的最大字节数(bytes)
window: 每秒采样窗口
outtopic: throttle节点发布的话题名,若缺省该参数,发布话题默认为intopic_throttle
例如,限制占用带宽的激光雷达话题(base_scan)到1Kbps
rosrun topic_tools throttle bytes base_scan 1024 1.0
在我对该模式实际测试中发现,发布后话题的频率不完全等于而是小于等于widow的倒数,当然不超过原频率。例如,我使用的rosbag中原话题/cam0/image_raw频率为20Hz,bytes_per_sec设为1024,window设为1,/cam0/image_raw_throttle的发布频率是略小于1的0.96多;window设为0.1,发布频率在7.5-7.6Hz的样子;window设为0.01,发布频率就是原频率20Hz了。此外,我没有太多确认带宽的参数的影响。