小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
RVIZ2中不显示地图
-
我在跟着文档学习ros2时,学到slam建图时遇到了问题,具体是在文档这个地方
我在运行完source install/setup.bash ros2 launch fishbot_description gazebo.launch.py source install/setup.bash ros2 launch fishbot_cartographer cartographer.launch.py
后,出现的rviz2是这样的
Global Options的Fixed里没有map,此时开启RVIZ2的终端里显示[rviz2-3] [INFO] [1719285269.913579976] [rviz2]: Message Filter dropping message: frame 'laser_link' at time 5501.326 for reason 'discarding message because the queue is full' [rviz2-3] [INFO] [1719285270.023182985] [rviz2]: Message Filter dropping message: frame 'laser_link' at time 5501.426 for reason 'discarding message because the queue is full' [rviz2-3] [INFO] [1719285270.117405744] [rviz2]: Message Filter dropping message: frame 'laser_link' at time 5501.526 for reason 'discarding message because the queue is full' [rviz2-3] [INFO] [1719285270.252131717] [rviz2]: Message Filter dropping message: frame 'laser_link' at time 5501.626 for reason 'discarding message because the queue is full' [rviz2-3] [INFO] [1719285270.303907952] [rviz2]: Message Filter dropping message: frame 'laser_link' at time 5501.726 for reason 'discarding message because the queue is full' [rviz2-3] [INFO] [1719285270.428861254] [rviz2]: Message Filter dropping message: frame 'laser_link' at time 5501.826 for reason 'discarding message because the queue is full' ^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT) [rviz2-3] [INFO] [1719285270.902161410] [rclcpp]: signal_handler(signum=2)
问了GPT后,他是这样回答的:
这条信息提示你的RViz2在处理传感器数据时遇到了一些问题,导致一些消息被丢弃。具体原因是 'discarding message because the queue is full',这意味着消息队列已满。这种情况通常由以下几个原因引起: 高频率的消息更新:如果传感器(例如激光雷达)发送的消息更新频率太高,而RViz2处理这些消息的速度跟不上,就会出现队列溢出的情况。 资源限制:系统的CPU或内存资源不足也可能导致处理速度跟不上消息的接收速度。 消息处理效率:消息过滤和处理机制可能不够高效,需要优化。 为了解决这个问题,你可以尝试以下几种方法: 降低传感器的数据发布频率:如果可能,减少激光雷达或其他传感器的数据发布频率,以减轻RViz2的处理负担。 优化RViz2的配置:检查并调整RViz2中相关组件的缓冲区大小或其他相关设置,以适应更高的数据流。 增加系统资源:如果资源允许,增加处理这些数据的计算机的CPU或内存资源可能有助于解决问题。 使用消息过滤:在某些情况下,可以在消息传递链路中使用过滤节点(如message_filters)来减少传达到RViz2的消息数量,尤其是那些不必要的消息。 检查系统性能:使用系统监控工具(如 top, htop)检查在运行RViz2时的CPU和内存使用情况,看是否有性能瓶颈。 查看并调整RViz2日志级别:如果日志级别设置得太低,可能会记录大量不必要的信息,增加系统负担。调整日志级别,只记录重要的信息。 实施上述改动后,再观察系统的表现,看是否能够改善消息丢弃的问题。如果问题仍然存在,可能需要更深入地检查消息处理流程或进行代码优化。
我运行的代码都是没有更改过的
gazebo.launch.pyimport os from launch import LaunchDescription from launch.actions import ExecuteProcess from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare def generate_launch_description(): robot_name_in_model = 'fishbot' package_name = 'fishbot_description' urdf_name = "fishbot_gazebo.urdf" ld = LaunchDescription() pkg_share = FindPackageShare(package=package_name).find(package_name) urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}') gazebo_world_path = os.path.join(pkg_share, 'world/fishbot.world') # Start Gazebo server # start_gazebo_cmd = ExecuteProcess( # cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so', gazebo_world_path], # output='screen') start_gazebo_cmd = ExecuteProcess( cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so', gazebo_world_path], output='screen') # Launch the robot spawn_entity_cmd = Node( package='gazebo_ros', executable='spawn_entity.py', arguments=['-entity', robot_name_in_model, '-file', urdf_model_path ], output='screen') # Start Robot State publisher start_robot_state_publisher_cmd = Node( package='robot_state_publisher', executable='robot_state_publisher', arguments=[urdf_model_path] ) # Launch RViz start_rviz_cmd = Node( package='rviz2', executable='rviz2', name='rviz2', output='screen', # arguments=['-d', default_rviz_config_path] ) ld.add_action(start_gazebo_cmd) ld.add_action(spawn_entity_cmd) ld.add_action(start_robot_state_publisher_cmd) # ld.add_action(start_rviz_cmd) return ld
import os from launch import LaunchDescription from launch.substitutions import LaunchConfiguration from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare def generate_launch_description(): # 定位到功能包的地址 pkg_share = FindPackageShare(package='fishbot_cartographer').find('fishbot_cartographer') #=====================运行节点需要的配置======================================================================= # 是否使用仿真时间,我们用gazebo,这里设置成true use_sim_time = LaunchConfiguration('use_sim_time', default='true') # 地图的分辨率 resolution = LaunchConfiguration('resolution', default='0.05') # 地图的发布周期 publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0') # 配置文件夹路径 configuration_directory = LaunchConfiguration('configuration_directory',default= os.path.join(pkg_share, 'config') ) # 配置文件 configuration_basename = LaunchConfiguration('configuration_basename', default='fishbot_2d.lua') rviz_config_dir = os.path.join(pkg_share, 'config')+"/cartographer.rviz" print(f"rviz config in {rviz_config_dir}") #=====================声明三个节点,cartographer/occupancy_grid_node/rviz_node================================= cartographer_node = Node( package='cartographer_ros', executable='cartographer_node', name='cartographer_node', output='screen', parameters=[{'use_sim_time': use_sim_time}], arguments=['-configuration_directory', configuration_directory, '-configuration_basename', configuration_basename]) cartographer_occupancy_grid_node = Node( package='cartographer_ros', executable='cartographer_occupancy_grid_node', name='cartographer_occupancy_grid_node', output='screen', parameters=[{'use_sim_time': use_sim_time}], arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]) rviz_node = Node( package='rviz2', executable='rviz2', name='rviz2', arguments=['-d', rviz_config_dir], parameters=[{'use_sim_time': use_sim_time}], output='screen') #===============================================定义启动文件======================================================== ld = LaunchDescription() ld.add_action(cartographer_node) ld.add_action(cartographer_occupancy_grid_node) ld.add_action(rviz_node) return ld
不知道如何解决
-
你遇到的问题可能是由几个不同的因素导致的。首先,让我们确保你已经正确配置了所有的节点和RViz2,以便它们能够正确地共享地图数据。以下是一些建议的解决步骤:
-
确保TF转换正确:
确保cartographer_node
和cartographer_occupancy_grid_node
正在发布关于map
的TF转换。在RViz2中,你需要在TF面板中看到从odom
(或其他)到map
的转换。 -
检查RViz2配置:
打开RViz2时,确保你加载了正确的配置文件(在你的例子中是cartographer.rviz
)。这个配置文件应该包括OccupancyGrid
显示插件,该插件设置为订阅cartographer_occupancy_grid_node
发布的/map
话题。 -
检查话题名称:
确保cartographer_occupancy_grid_node
发布的话题名称(例如/map
)与RViz2中配置的相同。如果话题名称不匹配,RViz2将不会显示地图。 -
调整发布频率:
虽然你已经尝试按照GPT的建议减少消息频率,但在这种情况下,这可能不是问题的根源,因为cartographer_occupancy_grid_node
通常不会以非常高的频率发布地图数据。然而,如果其他节点(如传感器数据)的发布频率过高,可能会导致TF消息队列填满。 -
检查CPU和内存使用情况:
使用top
或htop
等工具检查CPU和内存使用情况。如果资源利用率很高,可能需要优化代码或增加硬件资源。 -
检查日志和错误消息:
查看RViz2和cartographer_node
的日志输出,看是否有任何明显的错误或警告消息。这些消息可能会提供关于问题的更多信息。 -
使用静态TF发布者:
如果TF转换不正确,你可以考虑使用静态TF发布者来手动定义从odom
到map
的转换(尽管这通常不是必要的,因为cartographer_node
应该能够处理这些转换)。 -
尝试简化设置:
如果可能的话,尝试在更简单的环境中运行你的设置(例如,没有Gazebo,只使用cartographer_node
和RViz2)。这可以帮助你确定问题是否与Gazebo或其他组件相关。 -
检查ROS 2版本和依赖项:
确保你正在使用的ROS 2版本与cartographer_ros
包兼容,并且你已经安装了所有必要的依赖项。 -
搜索类似问题:
查看是否有其他人遇到了类似的问题,并找到了解决方案。你可以尝试在ROS社区论坛、GitHub仓库或Stack Overflow上搜索相关问题。
以上为生成回答,仅供参考~
-
-
解决了,原因是我已经用APT安装了,结果我又使用了源码安装