ROS自定义地图(CAD、手绘等)
0x00 概述
在前面的文章中,我們介紹如何自動導航時,都是基于使用gmapping或者hector_mapping創建的地圖。當然使用其他的建圖方法創建的地圖也可以,但是目前為止,無論使用哪種建圖方法。通過激光雷達或深度攝像頭建立的地圖仍然是存在誤差的。下面我們可以來回顧一下看看使用gmapping建立的地圖,如下圖所示,可以看到右側的地圖就是掃描建立的地圖,與左側的地圖基本上相同。現在可以思考一下,我們有沒有可能不用激光雷達來掃描建圖(這個slam過程真的是挺麻煩的),因為現在基本上在設計施工時都是有設計圖紙的,如果我們將這些設計圖紙拿來,修改一下直接就當作導航地圖來用。這樣不是就省去建地圖的步驟了嘛,而且地圖的與實際環境100%匹配(除非施工建造時沒有按照圖紙來做):
0x01 創建自定義地圖
在前面一篇文章10.在STDR中加載其他地圖中,介紹了如何在stdr中加載自定義的地圖。這張地圖是從網上下載的一個兩居室戶型圖,后來經過簡單修改我們就可以在stdr中加載了。現在我們可以更進一步,可以將這張地圖使用map_server加載。這樣我們就可以把地圖在rviz中直接加載,就可以在這張地圖上進行自動導航了。下面先來看看我們上次創建的這個戶型圖,如下圖所示:
現在我們已經可以在stdr中加載這張地圖了,現在我們要將這張地圖使用map_server加載。那具體如何操作呢?我們可以先來看看使用gmapping建好的地圖是使用什么格式來存儲的。我們可以按照它的格式來修改一下這張地圖不就可以了嘛,說干咱就開始動手操作:
(1)查看gmapping創建的地圖
可以看出gmapping完成后,保存的地圖格式為pgm,另外有一個配套的yaml文件。現在來簡單介紹下這個pgm格式的圖片,可能大多數人不了解這種格式。PGM 是便攜式灰度圖像格式(portable graymap file format),在黑白超聲圖像系統中經常使用PGM格式的圖像,文件的后綴名為".pgm"。PGM格式圖像格式分為兩類:P2和P5類型。不管是P2還是P5類型的PGM文件都由兩部分組成,文件頭部分和數據部分。
[文件頭部分]
文件頭包括的信息依次是:
1.PGM文件的格式類型(是P2還是P5);
2.圖像的寬度;
3.圖像的高度;
4.圖像灰度值可能的最大值;
文件頭的這四部分信息都是以ASCII碼形式存儲的,下面我們可以看看gmapping建好的地圖格式是P2還是P5,如下圖所示:
可以看出這里使用的是P5格式,第二行為一個注釋信息。第三行416 416就是這張圖片的長和寬,最后一行就是圖像灰度值的最大值。
[數據部分]
數據部分記錄圖像每個像素的灰度值,按照圖像從上到下,從左到右的順序依次存儲每個像素的灰度值,對于像素灰度值的表示P2格式和P5格式有所不同。下面來重點介紹P5格式:
P5格式圖片的數據部分是從上到下,從左到右排列灰度值。每個灰度值取值為[0,Maxval],其中0表示黑色,Maxval表示白色。每個灰度值由1個或2個字節的純二進制表示。如果最大值小于256,則為1字節。否則,它是2字節。最重要的字節是第一個。
(2)安裝KolourPaint4軟件
一般從網上下載的照片格式是png或jpg的,這里我介紹一種簡單的方式來將這些格式轉換為pgm格式。需要安裝一下KolourPaint4畫圖工具,這個軟件就跟我們常用的畫圖軟件類似,安裝軟件的命令如下:
sudo apt-get install kolourpaint4- 1
安裝好該軟件后,就可以來打開了,下圖就是這個軟件的界面:
(3)使用軟件轉換圖片格式
使用KolourPaint軟件打開png格式或jpg格式的地圖軟件,如下圖所示:
然后使用圖片另存為pgm格式,如下圖所示:
最后來查看下該圖片格式是否為P5:
(4)創建對應的yaml配置文件
這個yaml配置文件編寫比較簡單,我們按照gmapping中地圖的yaml格式來修改就可以了。下面來看看自定義地圖的yaml內容:
這里來簡單介紹下yaml中兩個參數的意義:
image:要加載的地圖,這里的路徑可以寫絕對路徑也可以寫相對路徑。這里由于pgm圖片和yaml文件都放在同一個文件夾中,所以就可以直接寫home.pgm,不用加其他路徑了。
resolution:將圖片解析成多少實際距離,從file命令中得知,圖片分辨率為761721。這里0.015意思是:米/像素,這樣就可以計算出這個地圖表示的實際大小為:7610.015=11.415米,7210.015=10.815米。這就表示地圖為11.410.8=123平米的大小。
0x02 編寫launch文件
現在已經將自定義的圖片格式修改為pgm格式了,對應的yaml配置文件也編寫好了。下面我們就可以來編寫對應測試的launch文件,下面首先來看看用來加載地圖的launch文件load_home_map.launch:
<!-- Copyright: 2016-2019 ROS小課堂 www.corvin.cn Author: corvin Description: 該啟動文件用于加載自定義的home地圖,這樣就可以進行自動導航了. History: 20190102: initial this file. --> <launch> <!-- load home map --> <node pkg="map_server" type="map_server" name="stdr_load_home_map" args="$(find stdr_navigation)/maps/home.yaml"> <remap from="map" to="/amcl/map" /> </node> </launch>下面來看看最后用來最終測試用的launch文件home_map_nav.launch:
<!-- Copyright: 2016-2019 ROS小課堂 www.corvin.cn Author: corvin Description: STDR simulator robot auto navigation with amcl and move base packages. load home_map to test. History: 20190102: 加載home_map地圖進行自動導航測試. --> <launch> <!-- load stdr simulator with robot0 --> <include file="$(find stdr_launchers)/launch/home_map_robot_gui.launch" /> <!-- startup move_base node --> <include file="$(find stdr_move_base)/launch/stdr_move_base.launch" /> <!-- load home map --> <include file="$(find stdr_navigation)/launch/load_home_map.launch" /><!-- startup amcl node --> <include file="$(find stdr_amcl)/launch/home_map_amcl.launch" /> </launch>其實這里所有的代碼都已經提交到stdr_ws代碼倉庫中,如果你已經下載了本代碼的話,就可以在本地直接拉取最新代碼。不過目前我的代碼都是優先往kinetic分支上提交,indigo分支會逐漸放棄維護。
0x03 測試查看效果
要想開始測試,我們首先需要啟動上面編寫的launch文件,使用如下命令來啟動測試:
roslaunch stdr_navigation home_map_nav.launch- 1
下面通過動圖來查看導航效果,我們可以直接在Rviz中使用“2D Nav Goal”功能來選取導航的目的地:
0x04 References
[1]. corvin_zhang. 10.在STDR中加載其他地圖. http://www.corvin.cn/1047.html
[2]. Netpbm. PGM Format Specification. http://netpbm.sourceforge.net/doc/pgm.html
[3]. 編號1993. Python pgm解析和格式轉換. https://blog.csdn.net/u012005313/article/details/83685584
[4]. suonikeyinsu. ppm\pgm格式. https://www.cnblogs.com/black-mamba/p/6755295.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的ROS自定义地图(CAD、手绘等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本控制机器人方法
- 下一篇: 【Python1】双系统安装,深度学习环