天天看點

Webots小車與Gampping建圖仿真與ORB3算法實踐

此篇部落格轉自本作者在古月居的部落格: https://www.guyuehome.com/34537

前言:

​ 在研一的時候,由于XXX項目的需要,其中一項就是需要測試Gmapping建圖,自然也要求使用ROS系統。由于之前經常在webots中進行仿真,是以想先在仿真中完成代碼,再遷移實體。還有的是項目需要使用的ORB-SLAM3,便又測試了單目裡程估計。這部分代碼已經上傳到我的Github上供大家參考(研究所學生白菜福利)。這裡就不貼代碼了,文中會說檔案和函數。先上一波圖,說明是可以的。

Webots小車與Gampping建圖仿真與ORB3算法實踐

Gmapping

​ gmapping是基于RBpf粒子濾波的,定位和建圖分離,是先定位後建圖的思想。機器人不斷運動運動,不斷觀測,降低自己位置的不确定度,最後精确定位。如果隻是想使用,通過ROS可以很友善調用這部分算法。對于具體的不同環境可以調節參數來獲得良好效果。參數可以在gampping的node下面進行修改,每個不同的屬性可以在ROS wiki gmapping網站上查詢。在我的代碼中,節點描述和啟動在mob.launch檔案中實作。

Webots小車與Gampping建圖仿真與ORB3算法實踐

ORB3

​ ORB-SLAM3是開源視覺SLAM庫,建的稀疏圖,emmmmm我也不是專門研究這個視覺定位建圖方向的,了解淺薄,沒啥太多實踐,是以這裡就不在BB了:)。在我的這個項目裡用來做裡程估計,給的代碼是沒有給webots中的相機進行标定内參的,就是随便給的,主要的檔案就是orb3_odom.cpp,主要功能函數就是

GrabImage

。啟動這部分功能,運作orb3.launch就可以了。另外要很準确的在webots标定相機,沒有試過,這個還得靠大家一起探索,如果有好的方法可以留言。webots的相機都是理想的(沒有畸變),查查官網,估計也不是難事。再不行也可以通過一些手段反向得到相機内參,也不是不可以。

​ 在我的工程中,主要就是矯正了坐标系,測試了下效果(裡程的機關不是準确的),感覺還行。突出的貢獻,主要是如何和webots結合在一起仿真使用吧。題外話:webots搭建世界環境是很友善的,做視覺SLAM的可以在這個虛拟環境中先進行測試,然後在部署到硬體上,感覺開發會快不少。

Webots小車與Gampping建圖仿真與ORB3算法實踐
Webots小車與Gampping建圖仿真與ORB3算法實踐

webots和ROS

​ Webots平台可以說是足夠簡單容易上手的,基于ODE實體引擎。凡事有個但是。但是當大家想把webots和ROS一起用的時候似乎就不是那麼流行。很多做ROS實體仿真的人都是在GAZEBO中實作的,但是總是有人想要用webots和ROS。總的來說,webots支援ROS還不錯,在ubuntu下面隻要裝額外的包即可webots_ros。按照官網說的,裝好環境後

​ 對于傳感器初始化,我寫成了一個函數,在mob.hpp下的 

__Order_Init_Sensor

。通過ServiceClient的形式配置傳感器的time_step和使能。然後,通過 rostopic list 你就會發現傳感器話題。電機貌似直接給指令,不用使能。使能的傳感器會以time_step的間隔發送topic,訂閱後,隻要在callback函數裡面處理資料就可以了。另外,給電機指令的函數我封裝成 mob.hpp下 

__Order_Float

。 工程中的傳感器沒多少,如果要用其他的傳感器,舉一反三,照着來就會了。

​ 總的來說特别友善。就是代碼的内容相比沒有ROS的時候多了點,這個自己封裝下就好。

​ 還有就是webots的啟動可以通過webots.launch運作腳本webots_launcher.py啟動,裡面的參數配置仔細看下就好。

其他

​ 上面的内容都弄好了,ROS的topic接口銜接以下就好。對于ROS預設坐标系和Webots不同的問題,我的解決辦法是自己在callback函數裡面進行矯正。在這個工程裡,我沒有控制小車pioneer3,而是直接給了個速度,向前進,但足以說明工程已經走通。工程裡面,可能會多一些之前沒咋見過的東西,這些都是Webots提供的一些.msg(消息格式)啊,或者.srv(ROS Service)檔案,不要太在意。

​ 還有就是這個代碼需要修改launch檔案中的一些路徑,不是簡單下載下傳編譯就好了。

​ 工程在編譯好後,先運作mob.launch(gmapping),再運作orb3.launch (orb3)。

​ 代碼可以在這裡下載下傳。

​ 最後,如果有啥問題,可以留言,古德拉克。