学习ROS topic_tools/throttle并发布指定名字的话题

本文介绍了如何使用ROS的topic_tools/throttle工具,解决ORB-SLAM3中不同主题命名问题,实现消息频率节流,重点讲解了throttlemessage模式的用法及其参数设置策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近开始学习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了。此外,我没有太多确认带宽的参数的影响。

src/exploration/mbplanner_ros/mbplanner/launch/mbplanner_m100_sim.launch文件内容如下 <launch> <!-- All settings --> <arg name="robot_name" default="m100"/> <arg name="gazebo_gui_en" default="false"/> <arg name="use_sim_time" default="true"/> <arg name="rviz_en" default="true" /> <arg name="launch_prefix" default=""/> <!-- gdb -ex run //args | xterm -e gdb -args--> <param name="use_sim_time" value="$(arg use_sim_time)"/> <!-- Config files --> <arg name="mbplanner_config_file" default="$(find mbplanner)/config/mbplanner_config.yaml"/> <arg name="global_planner_config_file" default="$(find global_planner)/config/global_planner_config.yaml"/> <arg name="voxblox_config_file" default="$(find mbplanner)/config/voxblox_sim_config.yaml"/> <arg name="octomap_config_file" default="$(find mbplanner)/config/octomap_sim_config.yaml"/> <arg name="map_config_file" default="$(arg voxblox_config_file)"/> <arg name="world_file" default="$(find planner_gazebo_sim)/worlds/pittsburgh_mine.world"/> <arg name="pci_file" default="$(find mbplanner)/config/planner_control_interface_sim_config.yaml"/> <node pkg="tf" type="static_transform_publisher" name="tf_53" args="0 0 0 0 0 0 world navigation 1" /> <node pkg="tf" type="static_transform_publisher" name="tf_1" args="0.0 0 0.12 0 -1.2 -0.0 $(arg robot_name)/vi_sensor/base_link fcu 1" /> <node pkg="tf" type="static_transform_publisher" name="tf_2" args="0.015 0.055 0.0065 -1.57 0.0 -1.57 $(arg robot_name)/vi_sensor/base_link $(arg robot_name)/vi_sensor/camera_depth_optical_center_link 1" /> <node pkg="tf" type="static_transform_publisher" name="tf_3" args="0.015 0.055 0.0065 -1.57 0.0 -1.57 $(arg robot_name)/vi_sensor/base_link $(arg robot_name)/vi_sensor/camera_left_link 1" /> <node pkg="tf" type="static_transform_publisher" name="tf_4" args="0.015 -0.055 0.0065 -1.57 0.0 -1.57 $(arg robot_name)/vi_sensor/base_link $(arg robot_name)/vi_sensor/camera_right_link 1" /> <node pkg="tf" type="static_transform_publisher" name="tf_5" args="0 0 0.05 0.0 0.0 0.0 $(arg robot_name)/base_link $(arg robot_name)/$(arg robot_name)/velodyne 1" /> <node pkg="tf" type="static_transform_publisher" name="tf_6" args="0.0 0 0.12 0.0 -1.2 -0.0 $(arg robot_name)/base_link $(arg robot_name)/vi_sensor/base_link 1" /> <!-- ROS Gazebo --> <env name="GAZEBO_MODEL_PATH" value="${GAZEBO_MODEL_PATH}:$(find planner_gazebo_sim)/models"/> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(arg world_file)" /> <arg name="gui" value="$(arg gazebo_gui_en)" /> <arg name="use_sim_time" value="$(arg use_sim_time)"/> <arg name="paused" value="false" /> <arg name="verbose" value="false"/> </include> <group ns="$(arg robot_name)"> <node name="img_throttler" type="throttle" pkg="topic_tools" args="messages vi_sensor/camera_depth/depth/points 5 vi_sensor/camera_depth/depth/points_throttled" /> <node name="odo_throttler" type="throttle" pkg="topic_tools" args="messages ground_truth/odometry 100 ground_truth/odometry_throttled" /> <!-- MAV launch --> <include file="$(find rotors_gazebo)/launch/spawn_mav.launch"> <arg name="mav_name" value="$(arg robot_name)" /> <arg name="model" value="$(find rotors_description)/urdf/m100.gazebo" /> <arg name="enable_ground_truth" value="true" /> <arg name="x" value="0.0"/> <arg name="y" value="0.0"/> <arg name="z" value="1.5"/> </include> <!-- Position controller --> <node name="lee_position_controller_node" pkg="rotors_control" type="lee_position_controller_node" output="screen"> <rosparam command="load" file="$(find rotors_gazebo)/resource/lee_controller_$(arg robot_name).yaml" /> <rosparam command="load" file="$(find rotors_gazebo)/resource/$(arg robot_name).yaml" /> <remap from="odometry" to="odometry_sensor1/odometry" /> </node> </group> <arg name="odometry_topic" default="$(arg robot_name)/ground_truth/odometry_throttled"/> <node name="pose_throttler" type="throttle" pkg="topic_tools" args="messages $(arg robot_name)/ground_truth/pose_with_covariance 10 /msf_core/pose" /> <!-- Motion Primitive based planning --> <node pkg="mbplanner" type="mbplanner_node" name="mbplanner_node" output="screen"> <remap from="odometry" to="$(arg odometry_topic)" /> <remap from="pointcloud" to="/velodyne_points" /> <rosparam command="load" file="$(arg mbplanner_config_file)" /> <rosparam command="load" file="$(arg map_config_file)" /> </node> <!-- Global Planner --> <node pkg="global_planner" type="global_planner_node" name="global_planner_node" output="screen" launch-prefix="$(arg launch_prefix)"> <remap from="odometry" to="$(arg odometry_topic)" /> <!-- For Voxblox: --> <!-- Use tsdf map topics if tsdf is being used and commnet the esdf topic--> <remap from="global_planner_node/tsdf_map_in" to="mbplanner_node/tsdf_map_out"/> <!-- <remap from="global_planner_node/esdf_map_in" to="mbplanner_node/esdf_map_out"/> --> <!-- --> <!-- For Octomap: --> <remap from="input_octomap" to="mbplanner_node/octomap_binary"/> <!-- --> <rosparam command="load" file="$(arg global_planner_config_file)" /> <rosparam command="load" file="$(arg map_config_file)" /> </node> <node pkg="pci_mav" type="pci_mav_ros_node" name="pci_mav_ros_node" output="screen"> <remap from="command/trajectory" to="$(arg robot_name)/command/trajectory" /> <remap from="planner_server" to="mbplanner" /> <remap from="planner_homing_server" to="global_planner/homing" /> <remap from="mbplanner/global" to="global_planner/global" /> <remap from="odometry" to="$(arg odometry_topic)"/> <rosparam command="load" file="$(arg pci_file)" /> </node> <!-- <include file="$(find aerial_control_ui)/launch/m100_ui.launch"/> --> <group if="$(arg rviz_en)"> <node launch-prefix="nice" pkg="rviz" type="rviz" name="rviz" args="-d $(find mbplanner)/config/rviz/$(arg robot_name)_sim_mbplanner.rviz" /> </group> </launch>,帮我查看是否有目标位置相关的设置
07-12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值