這裏我們介紹一個在gazebo中快速生成柵格地圖的方法。以前的生成一般需要通過slam進行建圖,這個過程比較麻煩,而且容易產生漂移。我們現在通過gazebo中的一些插件來實現這個過程,變得更加合理而且地圖非常標準化。
我們在做ros導航的時候經常會需要地圖,無論是2d的柵格地圖還是3d的點雲地圖,有沒有辦法直接生成gazebo中的這樣的標準版本的地圖呢?當然有,以下是本項目的實現的細節。
PGM Map Creator 項目
架構與目錄
src/、include/:C++ 核心掃描引擎,負責讀取世界文件、進行空間採樣與佔用推斷gui/:PyQt GUI 封裝,加載map_config.json並調用 CLI 接口完成生成scripts/:構建與輔助腳本,方便在 CI 或批處理場景複用world/room.world:默認示例場景,展示多物體、多層結構處理能力map_config.json:集中存放邊界框、分辨率、輸出名等參數
參數設計細節
--corners:以(x,y,z)對指定下右角與上左角,滿足upper_left.x > lower_right.x等約束,可確保掃描體積合法,避免倒置座標導致的空輸出--resolution:默認 0.01m,可以直接控制 PGM/Octomap 細粒度;實踐中可結合機器人 LiDAR 精度調優--multiplier:碰撞檢測距離倍數,用於將模型碰撞體適度放大,避免窄縫漏檢--threshold:2D 柵格灰度閾值,0→佔用、255→空閒,適合根據傳感器噪聲調整--skip-vertical-scan:僅進行平面採樣,大幅減少 3D 掃描耗時,適合只關心 2D 導航--filename:統一輸出前綴,生成.pgm/.png/.yaml/.pcd/.bt五種文件,便於歸檔
工作流示例
- 構建:
mkdir build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$(nproc),得到 CLI 可執行文件 - 參數配置:在
map_config.json中填寫 corners、分辨率、閾值等信息,也可直接啓動python3 gui/map_creator_gui.py進行可視化調參 - 生成:運行 GUI 或 CLI 命令;CLI 會遍歷掃描體積進行射線投射,逐層寫入佔據概率
- 驗證:
- 2D:
xdg-open map.pgm或eog map.png快速查看佔用情況 - 3D:
pcl_viewer map.pcd檢查點雲稠密度 - ROS:在
rviz中加載map.yaml,確認座標與機器人框架對齊
- 迭代:調小
--resolution獲得更高精度,或調整--multiplier避免過度膨脹帶來的閉塞
典型應用
- 室內服務機器人:以真實房間尺寸配置
room.world,快速生成導航地圖並在 Nav2 中復現 - 研究對比實驗:在不同閾值、分辨率組合下批量導出地圖,分析路徑規劃性能變化
- 教學/演示:GUI 提供滑塊與輸入框,降低初學者理解佔據柵格概念的門檻
- 仿真管線:通過
.bt與.pcd直接供 Octomap 或 3D SLAM 模塊消費,保持環境一致性
亮點總結
- 多格式同步輸出:一次掃描、五種結果,減少繁瑣的格式轉換
- 參數顯式可控:從座標框、閾值到碰撞倍數,全部在 CLI/GUI 中可追蹤
- 易集成:CMake 構建 + Python GUI,可嵌入現有 C++/ROS/仿真項目
- 面向自動化:腳本化接口配合
map_config.json,可在 CI 中批量更新地圖
用法
首先git對應的倉庫:
git clone https://github.com/chan-yuu/pgm_map_creator.git
然後通過build.sh進行編譯
./build.sh
最後運行即可
python3 gui/map_creator_gui.py
界面的相關的配置和説明在README當中有具體的説明。
注意,如果不需要3D的點雲地圖,可以勾選2d,更快的生成柵格地圖。
進度條沒有那麼準確,基本上80多就可以算是結束了,只要有對應的文件就可以了。
在map文件夾下可以找到:
選擇了2d之後就只有2d的柵格地圖,3d的pcd幾乎沒有高度值: