6.地圖保存與編輯
寫在前面
- 當(dāng)前平臺(tái)文章匯總地址:ROS2機(jī)器人從入門到實(shí)戰(zhàn)
- 獲取完整教程及配套資料代碼,請(qǐng)關(guān)注公眾號(hào)<魚(yú)香ROS>獲取
- 教程配套機(jī)器人開(kāi)發(fā)平臺(tái):兩驅(qū)版| 四驅(qū)版
- 為方便交流,搭建了機(jī)器人技術(shù)問(wèn)答社區(qū):地址 fishros.org.cn
一、 安裝NAV2_MAP_SERVER
sudo apt install ros-$ROS_DISTRO-nav2-map-server
二、 保存地圖
ros2 run nav2_map_server map_saver_cli --help
可以看到有下面的用法
Usage:
map_saver_cli [arguments] [--ros-args ROS remapping args]
Arguments:
-h/--help
-t <map_topic>
-f <mapname>
--occ <threshold_occupied>
--free <threshold_free>
--fmt <image_format>
--mode trinary(default)/scale/raw
NOTE: --ros-args should be passed at the end of command line
我們的地圖話題為map,文件名字我們用fishbot_map,所以有下面這個(gè)這樣寫的命令行。
ros2 run nav2_map_server map_saver_cli -t map -f fishbot_map
接著我們就可以得到下面的兩個(gè)文件
.
├── fishbot_map.pgm
└── fishbot_map.yaml
0 directories, 2 files
這兩個(gè)文件就是對(duì)當(dāng)前地圖保存下來(lái)的文件,其中.pgm是地圖的數(shù)據(jù)文件,.yaml后綴的是地圖的描述文件。
三、 地圖數(shù)據(jù)文件.pgm介紹
OccupancyGrid由一個(gè).yaml格式
的元數(shù)據(jù)文件,和.pgm圖片格式的地圖數(shù)據(jù)文件組成。從上節(jié)課建圖后保存的文件也可以看出。
.
├── fishbot_map.pgm
└── fishbot_map.yaml
0 directories, 2 files
打開(kāi)上節(jié)課建好的地圖,觀察下,你應(yīng)該會(huì)有幾點(diǎn)疑問(wèn):
- 不是說(shuō)占據(jù)柵格地圖每個(gè)柵格都有一個(gè)概率嗎?為什么看不出來(lái)?
- 立方體內(nèi)和圓柱體內(nèi)和墻之外的區(qū)域?yàn)槭裁词腔疑模?/li>
原因如下:
- 一個(gè)柵格對(duì)應(yīng)到圖片上其實(shí)是一個(gè)像素,每一個(gè)像素的值在0-255之間,所以將像素值和占據(jù)率之間的映射即可,而像素值反應(yīng)到圖像上就是顏色的深淺,1.2圖對(duì)應(yīng)的像素顏色如下:
- 建圖的時(shí)候物體內(nèi)和墻之外的區(qū)域機(jī)器人并沒(méi)有探索到,沒(méi)有數(shù)據(jù)參考就認(rèn)為其值是未知的。
四、地圖描述文件.yaml介紹
除了fishbot_map.pgm
文件外,還有另外一個(gè)fishbot_map.yaml
的文件,fishbot_map.yaml
文件是地圖的配置文件,該文件內(nèi)容如下:
image: fishbot_map.pgm
mode: trinary
resolution: 0.05
origin: [-3.37, -2.88, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.25
-
image:圖像名稱
-
mode:圖像模式,默認(rèn)為trinary(三進(jìn)制),還有另外兩個(gè)可選項(xiàng)scale(縮放的)和raw(原本的值)。
-
resolution:分辨率,一個(gè)柵格對(duì)應(yīng)的物理尺寸,單位為m。0.05則表示一個(gè)柵格為0.05m
-
origin:地圖原點(diǎn)位置,單位是m。
-
negate:是否反轉(zhuǎn)圖像
-
cooupied_thresh:占據(jù)閾值
-
free_thresh:空閑閾值
如何在地圖上找出機(jī)器人原點(diǎn)的像素位置?
-
圖像的像素原點(diǎn)在左下角
-
借張圖左邊的0,0是地圖原點(diǎn),右邊的圖是圖像的像素原點(diǎn)
-
假如機(jī)器人地圖原點(diǎn)是[-3.37m, -2.88m],除上分辨率則可得到像素原點(diǎn)[-67.4px,-57.6px]。
地圖原點(diǎn)
在x和y軸分別偏移[-67.4px,-57.6px]就到了像素原點(diǎn),反過(guò)來(lái)說(shuō),地圖原點(diǎn)就在像素原點(diǎn)的[67.4px,57.6px]處。
五、編輯地圖
最后我們來(lái)說(shuō)一下如何對(duì)地圖進(jìn)行編輯,地圖編輯的方法有很多,你可以手動(dòng)改圖片,也可以通過(guò)opencv等圖像處理庫(kù)進(jìn)行圖像的去除噪點(diǎn)等操作。
這里小魚(yú)介紹的是手動(dòng)添加一個(gè)地圖用PS進(jìn)行編輯 。
打開(kāi)網(wǎng)址:https://www.gaituya.com/ps/
接著點(diǎn)擊文件打開(kāi)選擇我們的.pgm文件,即可看到下圖。
接著小魚(yú)將下面的正方形給補(bǔ)上。
保存后在文件選擇導(dǎo)出為png
格式即可,因?yàn)镻S并不支持pgm
格式的導(dǎo)出,所以我們選擇png
格式,幸運(yùn)的是png
格式的地圖也是被map_server所支持的。
把導(dǎo)出的圖片放到map文件夾下,接著我們需要修改下yaml配置文件中圖片的后綴。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-779655.html
image: fishbot_map.png
mode: trinary
resolution: 0.05
origin: [-3.37, -2.88, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.25
六、總結(jié)
到這里我們總算把地圖搞定了,接下來(lái)我們一起搞定導(dǎo)航。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-779655.html
到了這里,關(guān)于【ROS2機(jī)器人入門到實(shí)戰(zhàn)】地圖保存與編輯的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!