鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    RVIZ2中不显示地图

    已定时 已固定 已锁定 已移动
    动手学ROS2
    ros2 rviz2不显示地图 建图
    2
    3
    680
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 1
      某不知名的热心南京大学牲
      最后由 编辑

      我在跟着文档学习ros2时,学到slam建图时遇到了问题,具体是在文档这个地方
      f2fe5efb-93aa-4741-86ab-65ac3fa785c1-图片.png
      我在运行完

      source install/setup.bash
      ros2 launch fishbot_description gazebo.launch.py
      source install/setup.bash
      ros2 launch fishbot_cartographer cartographer.launch.py
      

      后,出现的rviz2是这样的
      2a9b4dd6-ec45-4d59-9ddd-69a9cfa908ea-图片.png
      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.py

      import 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
      

      然后是cartographer.launch.py

      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
      

      不知道如何解决

      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        你遇到的问题可能是由几个不同的因素导致的。首先,让我们确保你已经正确配置了所有的节点和RViz2,以便它们能够正确地共享地图数据。以下是一些建议的解决步骤:

        1. 确保TF转换正确:
          确保cartographer_node和cartographer_occupancy_grid_node正在发布关于map的TF转换。在RViz2中,你需要在TF面板中看到从odom(或其他)到map的转换。

        2. 检查RViz2配置:
          打开RViz2时,确保你加载了正确的配置文件(在你的例子中是cartographer.rviz)。这个配置文件应该包括OccupancyGrid显示插件,该插件设置为订阅cartographer_occupancy_grid_node发布的/map话题。

        3. 检查话题名称:
          确保cartographer_occupancy_grid_node发布的话题名称(例如/map)与RViz2中配置的相同。如果话题名称不匹配,RViz2将不会显示地图。

        4. 调整发布频率:
          虽然你已经尝试按照GPT的建议减少消息频率,但在这种情况下,这可能不是问题的根源,因为cartographer_occupancy_grid_node通常不会以非常高的频率发布地图数据。然而,如果其他节点(如传感器数据)的发布频率过高,可能会导致TF消息队列填满。

        5. 检查CPU和内存使用情况:
          使用top或htop等工具检查CPU和内存使用情况。如果资源利用率很高,可能需要优化代码或增加硬件资源。

        6. 检查日志和错误消息:
          查看RViz2和cartographer_node的日志输出,看是否有任何明显的错误或警告消息。这些消息可能会提供关于问题的更多信息。

        7. 使用静态TF发布者:
          如果TF转换不正确,你可以考虑使用静态TF发布者来手动定义从odom到map的转换(尽管这通常不是必要的,因为cartographer_node应该能够处理这些转换)。

        8. 尝试简化设置:
          如果可能的话,尝试在更简单的环境中运行你的设置(例如,没有Gazebo,只使用cartographer_node和RViz2)。这可以帮助你确定问题是否与Gazebo或其他组件相关。

        9. 检查ROS 2版本和依赖项:
          确保你正在使用的ROS 2版本与cartographer_ros包兼容,并且你已经安装了所有必要的依赖项。

        10. 搜索类似问题:
          查看是否有其他人遇到了类似的问题,并找到了解决方案。你可以尝试在ROS社区论坛、GitHub仓库或Stack Overflow上搜索相关问题。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        1 条回复 最后回复 回复 引用 0
        • 1
          某不知名的热心南京大学牲
          最后由 编辑

          解决了,原因是我已经用APT安装了,结果我又使用了源码安装
          9fee71f4-f755-48ff-b384-dddab6a647e3-图片.png
          60aa17f8-4efe-4d02-bd04-5521498c6c77-图片.png

          1 条回复 最后回复 回复 引用 0
          • 第一个帖子
            最后一个帖子
          皖ICP备16016415号-7
          Powered by NodeBB | 鱼香ROS