跳到正文

Wiki

添加地圖

約 6 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

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。