type
Post
status
Published
date
Feb 25, 2026
slug
summary
tags
具身智能
ROS
SLAM
category
项目开发
icon
password
💡
  • 在终端执行 sudo sysctl -w net.core.rmem_max=2147483647以优化DDS通信防止搜不到/map话题。
  • 禁止在 Launch 或终端设置 ROS_LOCALHOST_ONLY=1,否则会导致跨终端话题“隐身”。

一、地图显示


  • map_server和map_manager是 ROS 2 启动文件的核心片段,用于一键启动地图服务器和其生命周期管理器
  • map_server 负责加载地图文件并发布地图数据,是导航和 RViz2 可视化地图的基础;
    • map_server 属于生命周期节点。如果地图不显示,检查 lifecycle_managernode_names 列表是否包含了 'map_server',且 autostart 设为 True
  • lifecycle_manager_map 负责自动激活 map_server,避免手动操作,是 Nav2 节点管理的标准方式。

1. map_server 节点配置

  • 核心作用:加载并发布你的地图(比如建图后生成的 map.yaml 文件),让 RViz2、导航算法能获取地图数据(比如障碍物、坐标系、分辨率)。
  • 关键参数yaml_filename 是必须的,值 map_yaml_file 是你预先定义的地图 YAML 文件路径(比如 '/home/xxx/maps/map.yaml')。
  • 类比理解:这个节点就像 “地图播放器”,你告诉它地图文件在哪,它就会把地图数据广播给整个 ROS 2 系统。
 

2. map_manager 节点配置

  • 核心作用:ROS 2 中 map_server 属于 “生命周期节点”(不是启动就直接工作,需要手动激活),这个管理器会自动完成激活步骤,避免你手动敲命令激活 map_server
  • 关键参数
    • autostart: True:启动后自动激活 node_names 里的节点;
    • node_names: ['map_server']:指定要管理的节点是 map_server
  • 类比理解:这个节点就像 “地图播放器的遥控器”,自动帮你按下 “播放” 键,不用你手动操作。
 

3. 实际使用场景

你会在这些场景用到这段配置:
  1. 启动导航功能前,先加载静态地图;
  1. 配合 RViz2 可视化地图(比如你之前用 Publish Point 点选坐标时,需要先加载地图才能在地图上点击);
  1. 给机器人导航提供全局地图(比如让机器人知道 “哪里能走、哪里是墙”)。
 

二、常见问题分析


💡
请注意,建议单独使用map_server和map_manager节点显示地图,在nav中直接调用地图可能会出现无法正常显示的问题。
从日志来看,地图服务器已经成功启动并激活,但在 RVIZ2 中没有显示地图。这通常是由于以下几个原因造成的:

1.RVIZ2 中的 Map 显示没有正确配置。

  • 在 RVIZ2 的 Displays 面板中,确保添加了 “Map” 显示
  • 检查 Map 显示的 Topic 设置是否为 /map
  • 确认 Fixed Frame 设置为 map(或其他正确的地图坐标系)
 

2. 坐标系问题:TF 坐标系不正确或缺失。

  • 在 RVIZ2 中检查 TF 显示,确保存在 map → odom → base_link 等坐标系
  • 使用以下命令检查 TF 树:
 

3. 话题不匹配:地图服务器发布的话题与 RVIZ2 订阅的话题不匹配。

  • 检查地图服务器发布的话题:
  • 确保 RVIZ2 中的 Map 显示订阅的是正确的话题(通常是/map或者/包名/map)
 

4. 时间同步问题:RVIZ2 和地图服务器的时间不同步。

  • 在 RVIZ2 的全局选项中将 Fixed Frame 设置为 map
  • 尝试调整 RVIZ2 的 “Time” 设置
  • 请执行以下命令来诊断问题:
    • 检查地图话题是否有数据:
      • 查看地图服务器的详细信息:
        • 检查地图服务是否可用:
          • 尝试重新加载地图(如果支持):
           

          5.如果以上方法都不起作用,请尝试:

          • 完全关闭 RVIZ2
          • 删除 RVIZ2 的配置文件(通常位于 ~/.rviz2/)
          • 重新启动 RVIZ2 并手动添加 Map 显示,设置 Topic 为 /map
          • 验证地图数据
          • 最后,验证地图数据是否正确生成
            • 查看地图文件信息:ls -la map/
            • 检查 YAML 文件内容:cat map/fishbot_map.yaml
            • 尝试使用图像查看器查看 PGM 文件:eog map/fishbot_map.pgm
           

          三、示例分析


          nav_scheme3_launch.py有map但是nav2无效。(解决方案见nav2篇章)
          nav_d435i_launch.py导航初版,no map received。
          relocalization_launch.py重定位代码
          如下表所示,三者程序代码对比,主要问题在于地图节点的发布和TF树。
          维度
          nav_scheme3 (伪雷达导航版)
          nav_d435i (全集成报错版)
          relocalization (纯定位版)
          设计目标
          视觉+伪雷达:利用深度图模拟雷达进行避障导航。
          全自动化尝试:尝试用 Nav2 官方全家桶实现一键启动。
          精准重定位:只解决“我在哪”的问题,不解决“怎么去”。
          地图管理
          手动激活:手动配置 map_server 和生命周期管理,最稳定。
          托管启动:交给 bringup_launch.py 管理,极易因组件冲突卡死。
          手动激活:同 Scheme 3,确保地图在重定位时立即可见。
          避障能力
          :包含 depthimage_to_laserscan 转换节点。
          :依赖 Nav2 的 Costmap 插件处理原始深度图。
          :不包含任何避障或路径规划节点。
          坐标系 (TF)
          base_link -> camera_link
          无静态变换:直接将 camera_link 作为基座。
          base_link -> camera_link
          RTAB-Map 模式
          定位模式,但屏蔽了 RTAB 自带地图话题,减小干扰。
          定位模式,但参数配置可能与 Nav2 默认值冲突。
          深度定位:开启了 viz 界面,专门用于观察地图匹配。

          1. 为什么 nav_d435i_launch.py 会显示 "No Map"?

          • 生命周期僵局 (Lifecycle Deadlock):ROS 2 Nav2 使用生命周期管理器。在你的 D435i 脚本中,bringup_launch.py 会启动 AMCL。如果 AMCL 接收不到预期的传感器频率,它就不会转换到 "Active" 状态。而生命周期管理器会等待所有节点 Active 后才让 map_server 发图。结果就是一个节点卡住,全家桶停摆。
          • 解法建议:初学者建议参考 nav_scheme3relocalization,手动启动 map_server,这样即使导航算法报错,地图依然能显示,方便排查坐标问题。
           

          2. TF 树 (坐标变换) 的重要性

          • nav_scheme3relocalization 中,你定义了从机器人中心 (base_link) 到相机 (camera_link) 的物理位置偏移。
          • 笔记点:永远不要让 camera_link 直接充当 base_link(除非是手持相机)。导航算法需要知道传感器的安装位置(如高度、俯仰角),否则它生成的障碍物投影(伪雷达)位置会完全错误。

          3. 视觉导航中的“伪雷达”逻辑 (depthimage_to_laserscan)

          • 核心逻辑:将 3D 的深度图像切出一行或几行像素,计算距离,伪造成一个 2D 的激光扫描数据 (/scan)。
          • 优势:这种方式能让只支持 2D 雷达的标准导航算法(如标准的 Nav2 局部规划器)直接使用视觉数据进行避障。
           

          4. 重定位 (Relocalization) 与建图 (Mapping) 的区别

          • 重定位模式 (localization: true):RTAB-Map 不会向数据库写入新数据,而是将当前看到的特征点与 .db 数据库进行比对。
          • 成功关键:重定位脚本中的 database_path 必须准确指向你之前建图生成的 .db 文件。如果文件路径错或权限不足,定位将永远无法收敛。
           
           
          💡
          有关问题,欢迎您在底部评论区留言,一起交流~
          Nav2 导航:D435i+RTAB-Map参数标定
          Loading...