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_manager的node_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. 实际使用场景
你会在这些场景用到这段配置:
- 启动导航功能前,先加载静态地图;
- 配合 RViz2 可视化地图(比如你之前用 Publish Point 点选坐标时,需要先加载地图才能在地图上点击);
- 给机器人导航提供全局地图(比如让机器人知道 “哪里能走、哪里是墙”)。
二、常见问题分析
请注意,建议单独使用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_scheme3或relocalization,手动启动map_server,这样即使导航算法报错,地图依然能显示,方便排查坐标问题。
2. TF 树 (坐标变换) 的重要性
- 在
nav_scheme3和relocalization中,你定义了从机器人中心 (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文件。如果文件路径错或权限不足,定位将永远无法收敛。
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://tangly1024.com/article/312c7b13-c6a7-8010-955e-da0d147c71fe
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts







