Wiki
添加地圖
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
1.添加地圖
這裏以添加 rmuc_2026 為例,説明如何把一個新場地接入咱們的仿真和導航工程。換成 rmuc_2027、rmul_2027 或自己的場地名,流程一樣,但模型尺寸、座標和出生點要重新確認。
先分清三種文件:Gazebo 的三維場地、Nav2 的二維柵格地圖、small_gicp 定位用的三維點雲。 它們分別由不同程序讀取,只添加其中一種,其他文件不會自動生成。
| 文件 | 誰讀取 | 具體作用 |
|---|---|---|
| STL/DAE + 模型 SDF + 世界 SDF | Gazebo | 搭建三維環境,決定機械人看到什麼、撞到什麼、雷達能掃到什麼 |
| PGM/PNG + 地圖 YAML | map_server、Nav2 | 提供二維靜態地圖,表示空閒、障礙和未知區域 |
| PCD | small_gicp_relocalization;Point-LIO 是否讀取取決於先驗開關 | 提供保存的三維環境點雲,用於定位或先驗地圖相關功能 |
當前常規導航的關係為:
三维场地 → Gazebo → 仿真雷达、IMU和机器人运动
二维图片 + 地图YAML → map_server → Nav2静态地图
实时点云 + 先验PCD → small_gicp → map与odom之间的定位变换
实时地形点云 → 代价地图 → 更新当前障碍
如果只是給實車添加已經建好的地圖,可以直接看後面的“實車添加地圖”,不需要製作 Gazebo 場地。
1.1.地圖放在哪些文件夾
下面路徑都相對於導航工作空間,也就是包含 src/、build/、install/ 的目錄。
src/
├── rmu_gazebo_simulator/rmu_gazebo_simulator/
│ ├── config/gz_world.yaml # 选择仿真场地、设置机器人出生点
│ └── resource/
│ ├── models/
│ │ └── rmuc_2026/
│ │ ├── model.config # 模型说明,指定入口model.sdf
│ │ ├── model.sdf # 模型的显示、碰撞、缩放和位姿
│ │ └── meshes/
│ │ └── rmuc_2026.stl # 三维场地网格
│ └── worlds/
│ └── rmuc_2026_world.sdf # 加载场地、物理、传感器和光照
└── pb2025_sentry_nav/pb2025_nav_bringup/
├── map/
│ ├── simulation/ # 仿真二维地图:图片 + YAML
│ ├── reality/ # 实车二维地图:图片 + YAML
│ └── staging/ # 临时保存、尚未归档的二维地图
└── pcd/
├── simulation/ # 仿真定位点云
├── reality/ # 实车定位点云
└── staging/ # 临时保存、尚未归档的点云
| 文件夾或文件 | 具體作用 |
|---|---|
models/<场地名>/ |
一套三維場地模型;目錄名對應 model://<场地名> |
meshes/ |
存放 STL、DAE 等真正的三維形狀文件 |
model.config |
告訴 Gazebo 模型叫什麼、從哪個 SDF 文件加載 |
model.sdf |
引用網格,定義外觀、碰撞、尺寸和位置;只有外觀沒有碰撞,機械人可能穿過場地 |
worlds/<场地名>_world.sdf |
把模型放進完整仿真世界,並配置物理和傳感器等系統 |
gz_world.yaml |
選擇加載哪個世界文件,以及機械人在哪裏出生、朝向哪裏 |
map/ 下的圖片 |
二維柵格地圖的圖像數據 |
map/ 下的 YAML |
指定圖片路徑、分辨率、原點和佔用判斷方式,和圖片配套使用 |
pcd/ 下的 PCD |
三維環境點雲,用於定位;不能拿 STL 改後綴代替 |
staging/ 只是臨時存放目錄,導航不會自動讀取裏面最新的文件。確認可用後,放到對應的 simulation/ 或 reality/。
1.2.仿真添加地圖
以下以已有新場地 STL、二維圖片及配套 YAML、定位 PCD 為前提。建圖和保存方法見環境配置與運行。
1.2.1.添加三維模型
在 resource/models/ 下新建 rmuc_2026/meshes/,把新場地 STL 放進去:
resource/models/rmuc_2026/meshes/rmuc_2026.stl
再從原有 rmuc_2025/ 複製 model.config 和 model.sdf 到 rmuc_2026/,按下面修改。
model.config 中把模型名稱改成:
<name>rmuc_2026</name>
model.sdf 中把模型名稱改成:
<model name="rmuc_2026">
然後把 <visual> 和 <collision> 中的網格路徑兩處都改成:
<uri>model://rmuc_2026/meshes/rmuc_2026.stl</uri>
同時確認這兩項:
| 配置 | 怎麼填 |
|---|---|
<scale>1 1 1</scale> |
模型尺寸已經以米表示時使用;毫米轉米通常改成 0.001 0.001 0.001,顯示和碰撞兩處一致 |
<pose>x y z roll pitch yaw</pose> |
根據導出模型的原點和方向設置;前三項單位米,後三項單位弧度,不要直接照搬舊場地的偏移 |
保留 <static>true</static>,讓場地固定不動。
1.2.2.添加世界文件
複製:
resource/worlds/rmuc_2025_world.sdf
命名為:
resource/worlds/rmuc_2026_world.sdf
保留原有插件、光照和外層結構,把文件末尾引用場地的部分改成:
<model name="rmuc_2026">
<include>
<uri>model://rmuc_2026</uri>
</include>
<pose>0 0 0 0 0 0</pose>
<static>true</static>
</model>
這裏的 pose 是場地模型在世界中的位置和姿態,也要根據實際模型調整。模型 SDF 和世界文件裏的變換會疊加,不要重複補償同一個偏移。
外層 <world name="default"> 保持原樣,當前工程的橋接和相關服務使用這個世界名。
1.2.3.設置場地和出生點
修改仿真包的 src/rmu_gazebo_simulator/rmu_gazebo_simulator/config/gz_world.yaml,在已有 robots: 下面增加新場地配置,並把頂部的 world 切換過去:
world: "rmuc_2026"
robots:
# 原有场地配置继续保留
rmuc_2026:
- name: "red_standard_robot1"
color: "red"
x_pose: "3.4"
y_pose: "9.5"
z_pose: "0.7"
yaw: "0.0"
x_pose、y_pose、z_pose 是機械人在 Gazebo 世界座標系中的出生位置,單位米;yaw 是朝向,單位弧度。上面的數值只是示例,要按實際地面高度和機械人模型原點調整。
文件裏只保留一個頂部 world 和一個 robots,新場地加入已有列表。 當前啓動文件會按名稱加載 rmuc_2026_world.sdf,再讀取 robots 下的 rmuc_2026 出生配置。
1.2.4.放入二維地圖和PCD
把準備好的文件放到:
src/pb2025_sentry_nav/pb2025_nav_bringup/
├── map/simulation/
│ ├── rmuc_2026.yaml
│ └── rmuc_2026.pgm
└── pcd/simulation/
└── rmuc_2026.pcd
地圖 YAML 例如:
image: rmuc_2026.pgm
mode: trinary
resolution: 0.05
origin: [-3.4, -9.5, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196
| 參數 | 含義 |
|---|---|
image |
圖片路徑;相對路徑以這份 YAML 所在目錄為基準 |
mode |
柵格解釋方式;trinary 表示佔用、空閒、未知三態 |
resolution |
每像素代表多少米;0.05 即 5 cm |
origin |
地圖原點在 map 系中的 [x, y, yaw],第三項是轉角,不是高度 |
negate |
本例 0 表示黑色傾向佔用、白色傾向空閒 |
occupied_thresh、free_thresh |
像素換算後的佔用判斷門檻 |
優先保留建圖工具生成的分辨率和原點,不能把出生點簡單取負數當作 origin。圖片與 PCD 要對應同一個場地,並具有正確的尺度和座標關係。
本例的 free_thresh: 0.196 用於保留當前三態保存方式寫出的未知灰色,具體見map_saver。已有地圖應檢查自己的圖片和元數據,不必直接照抄這組值。
1.2.5.編譯並啓動
在工作空間根目錄執行,已有依賴按前面的環境教程準備:
colcon build --symlink-install --packages-select rmu_gazebo_simulator pb2025_nav_bringup
source install/setup.bash
ros2 launch rmu_gazebo_simulator bringup_sim.launch.py
另開終端,進入同一工作空間,啓動導航:
source install/setup.bash
ros2 launch pb2025_nav_bringup rm_navigation_simulation_launch.py \
world:=rmuc_2026 \
use_sim_time:=True \
use_joy:=False \
slam:=False
gz_world.yaml 裏的 world 選擇仿真場地,導航命令裏的 world:=rmuc_2026 選擇同名二維地圖和 PCD,兩邊需要對應。 當前導航入口會讀取安裝包中的 map/simulation/rmuc_2026.yaml 和 pcd/simulation/rmuc_2026.pcd。
在 Gazebo 中確認場地和機械人位置正確,再在 RViz 中確認地圖、點雲與機械人位置對應。
1.3.實車添加地圖
實車只需把已經建好的地圖放到 reality/,不需要添加 Gazebo 模型和世界文件:
src/pb2025_sentry_nav/pb2025_nav_bringup/
├── map/reality/
│ ├── site_01.yaml
│ └── site_01.pgm
└── pcd/reality/
└── site_01.pcd
確認 YAML 中的 image 指向配套圖片,重新構建 pb2025_nav_bringup 並 source。
按前面的教程啓動硬件和傳感器節點後,運行:
source install/setup.bash
ros2 launch pb2025_nav_bringup rm_navigation_reality_launch.py \
use_sim_time:=False \
use_joy:=False \
use_robot_state_pub:=True \
slam:=False \
world:=site_01
這裏的 world:=site_01 只是選擇 map/reality/site_01.yaml 和 pcd/reality/site_01.pcd,不會啓動 Gazebo。