導航:首頁 > 知識科普 > ros建圖方法有哪些

ros建圖方法有哪些

發布時間:2022-09-22 12:43:18

1. 如何設計一款基於ROS的移動機器人

最近幾年各種移動機器人開始涌現出來,不論是輪式的還是履帶式的,如何讓移動機器人移動都是最核心的工作。要讓機器人實現環境感知、機械臂控制、導航規劃等一系列功能,就需要操作系統的支持,而ROS就是最重要的軟體平台之一,它在科研領域已經有廣泛的應用。
不過有關ROS的書籍並不多,國內可供的學習社區就更少了。本期硬創公開課就帶大家了解一下如何利用ROS來設計移動機器人。

分享嘉賓李金榜:EAI科技創始人兼CEO,畢業於北京理工大學,碩士學位。 曾在網易、雪球、騰訊技術部有多年linux底層技術研發經驗。2015年聯合創立EAI科技,負責SLAM演算法研發及相關定位導航軟體產品開發。EAI科技,專注機器人移動,提供消費級高性能激光雷達、slam演算法和機器人移動平台。
移動機器人的三個部分
所謂的智能移動, 是指機器人能根據周圍的環境變化,自主地規劃路線、避障,到達目標地。
機器人是模擬人的各種行為,想像一下,人走動需要哪些器官的配合? 首先用眼睛觀察周圍環境,然後用腦去分析如何走才能到達目標地,接著用腿走過去, 周而復始,直到到達目標地址為至。機器人如果要實現智能移動,也需要眼、腦和腿這三部分的緊密配合。

「腿」是機器人移動的基礎。機器人的「腿」不局限於類人或類動物的腿,也可以是輪子、履帶等,能讓機器人移動起來的部件,都可以籠統地稱為「腿」。
類人的腿式優點是:既可以在復雜路況(比如爬樓梯)下移動、也可以更形象地模仿人的動作(比如跳舞),缺點是:結構和控制單元比較復雜、造價高、移動慢等。
所以大部分移動的機器人都是輪式機器人,其優勢在於輪子設計簡單、成本低、移動快。而輪式的也分為多種: 兩輪平衡車、三輪、四輪和多輪等等。目前最經濟實用的是兩個主動輪+一個萬向輪。
眼睛

機器人的眼睛其實就是一個感測器。它的作用是觀察周圍的環境,適合做機器人眼睛的有激光雷達、視覺(深度相機、單雙相機)、輔助(超聲波測距、紅外測距)等。
「腦」
機器人的大腦就負責接收「眼睛」傳輸的數據,實時計算出路線,指揮腿去移動。
其實就是要把看到的東西轉換為數據語言。針對如何描述數據,如何實現處理邏輯等一系列問題。 ROS系統給我們提供一個很好的開發框架。

ROS簡介
ROS是建立在linux之上的操作系統。它的前身是斯坦福人工智慧實驗室為了支持斯坦福智能機器人而建立項目,主要可以提供一些標准操作系統服務,例如硬體抽象,底層設備控制,常用功能實現,進程間消息以及數據包管理。
ROS是基於一種圖狀架構,從而不同節點的進程能接受、發布、聚合各種信息(例如感測,控制,狀態,規劃等等)。目前ROS主要支持Ubuntu操作系統。
有人問ROS能否裝到虛擬機里,一般來說是可以的,但是我們建議裝個雙系統,用Ubuntu專門跑ROS。

實際上,ROS可以分成兩層,低層是上面描述的操作系統層,高層則是廣大用戶群貢獻的實現不同功能的各種軟體包,例如定位繪圖,行動規劃,感知,模擬等等。ROS(低層)使用BSD許可證,所有是開源軟體,並能免費用於研究和商業用途,而高層的用戶提供的包則使用很多種不同的許可證。
用ROS實現機器人的移動
對於二維空間,使用線速度 + 角速度可以實現輪式機器的隨意移動。
線速度:描述機器人前後移動的速度大小
角速度:描述機器人轉動的角速度大小
所以控制機器人移動主要是要把線速度角速度轉換為左右輪的速度大小,然後,通過輪子直徑和輪間距,可以把線速度和角速度轉化為左輪和右輪的速度大小。
這里有一個關鍵問題就是編碼器的選擇和pid的調速。
編碼器的選擇:一般編碼器和輪子是在一個軸上,目前來說,速度在0.7m/s以下的話,編碼器選600鍵到1200鍵之間都ok。不過需要注意的是,編碼器最好用雙線的,A、B兩線輸出,A向和B向輸出相差90度,這樣可以防抖動。防抖動就是可以在之後里程計算時可以更准確。
左輪和右輪的速度大小的控制,通過輪子編碼器反饋,通過PID實時調整電機的PMW來實現。實時計算出小車的里程計(odom),得到小車移動位置的變化。
計算車的位置變化是通過編碼器來計算的,如果輪子打滑等情況,那麼計算的變化和實際的變化可能不同。要解決這個問題,其實是看那個問題更嚴重。要走5米只走了4.9米重要,還是要走180度只走了179度重要。
其實角度的不精確對小車的影響更大。一般來說,小車的直線距離精確度可以控制在厘米范圍內,在角度方面可以控制精準度在1%~2%。因為角度是比較重要的參數,所以很多人就用陀螺儀來進行矯正。
所以有時候大家問小車精度有多高?其實現在這樣已經精度比較高了,難免打滑等問題,不可能做到百分之百的精準。
小車在距離和角度方面做到現在這樣對於自建地圖導航已經是可以接受的,要提高更高的精度可能就要其他設備輔助,比如激光雷達來進行輔助,激光雷達可以進行二次檢測進行糾正。
激光雷達數據的存儲格式,它首先會有一個大小范圍,如果超出范圍是無效的。還有就是有幾個采樣點,這樣就可以激光雷達可以告訴你隔多少度有一個采樣點。

另外最後那個Intensities是告訴大家數據的准確率,因為激光雷達也是取最高點的數據,是有一定的准確率的。上面的ppt其實就是用激光雷達掃了一個牆的形狀。
激光雷達掃出一個靜態形狀其實沒有意義,雷達建圖的意義其實在於建立房間的地圖。
如何繪制地圖?
第一步是收集眼睛數據:
針對激光雷達,ROS在sensor_msgs 包中定義了專用了數據結構來存儲激光消息的相關信息,成為LaserScan。
它指定了激光的有效范圍、掃描點采樣的角度及每個角度的測量值。激光雷達360度實時掃描,能實時測出障礙物的距離、形狀和實時變化。
第二步就是把眼睛看到的數據轉化為地圖:

ROS的gmapping把激光雷達的/scan數據轉換為柵格map數據,其中黑色代表障礙物、白色代表空白區域,可以順利通行、灰色 :未知領域。隨著機器人的移動,激光雷達可以在多個不同方位觀測同一個位置是否有障礙物,如果存在障礙物的閾值超過設置值是,就標定此處是存在障礙物;否則標定不存在障礙物。 把障礙物、空白區域和未知領域的尺寸用不同灰度表示出來,就是柵格地圖。便於下一步定位和導航。
有時候會出現很直的牆,機器人卻無法直著行走,這時的問題可能就是機器人的輪子出現打滑等其他問題,而走歪了,這時繪制出的地圖也可能是歪的。這種情況可以通過加一個陀螺儀來避免這個情況。因為激光雷達的特性,有時候遇到黑色或鏡面會導致測距不準。
目前的解決方法就是不用激光雷達,或者用激光雷達和超聲波進行輔助處理。
ROS的地圖是分多層的,我可以在不同高度放多台激光雷達來一起疊加,共同繪制一張地圖。地圖繪制結束之後,就可以進行定位和導航等工作。
如何定位和導航?
定位:其實是概率性的定位,而不是100%的精度。根據激光雷達掃描周圍障礙物的形狀,與地圖的形狀做匹配,判斷機器人所在位置的概率
機器人的定位是否成功,與地圖特徵有很大關系,如果區域特徵明顯,那麼機器人就很容易判斷自己的位置。如果出現難以定位的問題,可能需要人給指定初始位置,或者加led來進行位置識別,或者其他的定位設備來協助定位。
目前的視覺通過色彩或者光的技術越來越多。
導航:全局路徑規劃+局部調整(動態避障)
導航其實就是全局定位,首先根據現有地圖進行規劃,但是在運行過程中會進行局部的路線規劃。但是總體還是根據全局路徑來走。
導航中工作量還很大,比如掃地機的路徑規劃和服務機器人的路徑規劃是不一樣的,掃地機器人可能要全覆蓋的有牆角的地圖,而服務機器人主要圍繞指定的路徑或者最短路徑來進行規劃,這部分是ROS工作量最大的一塊。
路徑規劃根據不同應用場景變化比較大,但是ROS提供基礎的路徑規劃的開發包,在這個基礎上我們會做自己的路徑規劃。
機器人描述和坐標系變換

在導航時,哪些區域可以通過,取決於機器人形狀等信息,ROS通過URDF(UnifiedRobot Description Format) 就是描述機器人硬體尺寸布局,比如輪子的位置、底盤大小、激光雷達安裝位置,這些都會影響到坐標系的轉換。
坐標系遵循的前提是每個幀只能有一個父幀,再往上進行一些眼神或者關聯。
激光雷達的安裝位置直接影響/scan輸出數據。所以激光雷達和機器人的相對位置是需要做坐標變換,才能把激光雷達的數據轉化為機器人視角的數據。
ROS的坐標系,最終歸結為三個標准框架,可以簡化許多常見的機器人問題:
1)全局准確,但局部不連續的幀(』map」)
2)全局不準確,但局部光滑框架(』odom」)
3)機器人自身框架(』base_link」)
多種感測器(像激光雷達、深度攝像頭和陀螺儀加速度計等)都可以計算base_link和odom的坐標關系,但由於「每個幀只能有一個父幀」,所以只能有一個節點(比如 robot_pose_ekf 融合多感測器)發布base_link和odom的坐標關系。
Base link自身的坐標系,因為不同元件裝在機器人上不同位置,都要對應到base link的坐標系中,因為所有的感測器都是要通過機器人的視角來「看」。
有些朋友問我,激光雷達在建地圖的時候,小車移動後地圖就亂了,這是因為小車的底盤坐標系和激光雷達的坐標系沒有標定準確。
map和odom之間的關聯
因為小車移動需要一個局部聯系,比如小車在向前走,不停的累加,這是里程計的作用,map起到全局的、不連續的作用,經過激光雷達和map對應。
如果要學習ROS的話,坐標系的變化是重要的點。坐標系的變換還有一個點,就是每個幀都只有一個父幀,有時候兩個坐標都和它有關聯的話,就是A和B關聯,B再和C關聯,而不是B/C都和A關聯。
三個坐標幀的父子關系如下:
map –> odom –> base_link
其實, map和odom都應該和base_link關聯,但為了遵守「每個幀只能有一個父幀」的原則,根據map和base_link 以及 odom->base_link的關系,計算出map與odom的坐標關系並發布。
odom->base_link的坐標關系是由里程計節點計算並發布的。
map -> base_link的坐標關系是由定位節點計算出來,但並不發布,而是利用接收odom->base_link的坐標關系,計算出map->odom的坐標關系,然後發布。
只有里程計的時候,沒有激光雷達,也可以跑,但是要先根據預設地圖進行簡單避障。
精彩問答
Q:還有ROS的實時性有什麼改進進展嗎 ?
A:實時改進要看ROS2.0的設計,其實ROS2.0的進展網上有公開。但是實際上他的進展離實際應用還有一定距離,至少今年下半年還達不到穩定,不過可以去研究下他的代碼,他對內存管理,線程管理,在實時性上有了很大改善。
Q:vSLAM對內存和CPU要求頗高。實際工程中,李老師使用的是什麼硬體配置?可以做多大的地圖呢?
A:確實如此,目前來說我們還是使用激光雷達和感測器輔助來進行,這個和地圖大小沒有太大關系,主要是與地形障礙物復雜程度有關。

2. ros中為啥gmapping建圖的時候模型反向運動

應該是定位問題,RBpf是一種有效解決同時定位和建圖的演算法,它將定位和建圖分離,每一個粒子都攜帶一幅地圖。
ros中gmapping建圖:
准備。

1、之前在github上下載的雙輪差速小車中有該小車的gmapping和鍵盤控制的文件可以直接用。
2、如果之前安裝的不是ros的full版本還需要下載gmapping功能包。
sudo apt-get install ros-indigo-slam-gmapping。
註:官方自帶的gmapping屬於功能包/軟體包/二進制包——ros中下載的代碼分為兩類:二進制和源代碼,二進制不需要編譯,例如apt-get;源代碼需要編譯才可運行。
開始。
1、啟動小車。
roslaunch diff_wheeled_robot_gazebo diff_wheeled_gazebo_maze.launch。
註:這個launch文件相比一般啟動小車模型多了以兩句。
2、啟動gmapping節點。
roslaunch diff_wheeled_robot_gazebo gmapping.launch。
3、啟動rviz。
rosrun rviz rviz。
點擊左側控制板中add——by topic——map。
4、鍵盤控制。
roslaunch diff_wheeled_robot_control keyboard_teleop.launch。
註:以上四步需要開啟4個終端。其中當鍵盤控制小車移動時,需要讓滑鼠停在鍵盤控制所在的終端。
5、保存地圖。
建完地圖後需要保存,先安裝map-server。
然後保存地圖。
rosrun map_server map_saver -f ~/mymap。
此時home文件下有mymap.pgm和mymap.yaml。
參考:
https://blog.csdn.net/wangchao7281/article/details/53647481?utm_source=blogxgwz6。
https://www.cnblogs.com/wenhust/archive/2016/10/14/5960973.html。

3. 如何利用ROS MoveIt快速搭建機器人運動規劃平台

最近幾年各種移動機器人開始涌現出來,不論是輪式的還是履帶式的,如何讓移動機器人移動都是最核心的工作。要讓機器人實現環境感知、機械臂控制、導航規劃等一系列功能,就需要操作系統的支持,而ROS就是最重要的軟體平台之一,它在科研領域已經有廣泛的應用。不過有關ROS的書籍並不多,國內可供的學習社區就更少了。本期硬創公開課就帶大家了解一下如何利用ROS來設計移動機器人。分享嘉賓李金榜:EAI科技創始人兼CEO,畢業於北京理工大學,碩士學位。曾在網易、雪球、騰訊技術部有多年linux底層技術研發經驗。2015年聯合創立EAI科技,負責SLAM演算法研發及相關定位導航軟體產品開發。EAI科技,專注機器人移動,提供消費級高性能激光雷達、slam演算法和機器人移動平台。移動機器人的三個部分所謂的智能移動,是指機器人能根據周圍的環境變化,自主地規劃路線、避障,到達目標地。機器人是模擬人的各種行為,想像一下,人走動需要哪些器官的配合?首先用眼睛觀察周圍環境,然後用腦去分析如何走才能到達目標地,接著用腿走過去,周而復始,直到到達目標地址為至。機器人如果要實現智能移動,也需要眼、腦和腿這三部分的緊密配合。腿「腿」是機器人移動的基礎。機器人的「腿」不局限於類人或類動物的腿,也可以是輪子、履帶等,能讓機器人移動起來的部件,都可以籠統地稱為「腿」。類人的腿式優點是:既可以在復雜路況(比如爬樓梯)下移動、也可以更形象地模仿人的動作(比如跳舞),缺點是:結構和控制單元比較復雜、造價高、移動慢等。所以大部分移動的機器人都是輪式機器人,其優勢在於輪子設計簡單、成本低、移動快。而輪式的也分為多種:兩輪平衡車、三輪、四輪和多輪等等。目前最經濟實用的是兩個主動輪+一個萬向輪。眼睛機器人的眼睛其實就是一個感測器。它的作用是觀察周圍的環境,適合做機器人眼睛的有激光雷達、視覺(深度相機、單雙相機)、輔助(超聲波測距、紅外測距)等。「腦」機器人的大腦就負責接收「眼睛」傳輸的數據,實時計算出路線,指揮腿去移動。其實就是要把看到的東西轉換為數據語言。針對如何描述數據,如何實現處理邏輯等一系列問題。ROS系統給我們提供一個很好的開發框架。ROS簡介ROS是建立在linux之上的操作系統。它的前身是斯坦福人工智慧實驗室為了支持斯坦福智能機器人而建立項目,主要可以提供一些標准操作系統服務,例如硬體抽象,底層設備控制,常用功能實現,進程間消息以及數據包管理。ROS是基於一種圖狀架構,從而不同節點的進程能接受、發布、聚合各種信息(例如感測,控制,狀態,規劃等等)。目前ROS主要支持Ubuntu操作系統。有人問ROS能否裝到虛擬機里,一般來說是可以的,但是我們建議裝個雙系統,用Ubuntu專門跑ROS。實際上,ROS可以分成兩層,低層是上面描述的操作系統層,高層則是廣大用戶群貢獻的實現不同功能的各種軟體包,例如定位繪圖,行動規劃,感知,模擬等等。ROS(低層)使用BSD許可證,所有是開源軟體,並能免費用於研究和商業用途,而高層的用戶提供的包則使用很多種不同的許可證。用ROS實現機器人的移動對於二維空間,使用線速度+角速度可以實現輪式機器的隨意移動。線速度:描述機器人前後移動的速度大小角速度:描述機器人轉動的角速度大小所以控制機器人移動主要是要把線速度角速度轉換為左右輪的速度大小,然後,通過輪子直徑和輪間距,可以把線速度和角速度轉化為左輪和右輪的速度大小。這里有一個關鍵問題就是編碼器的選擇和pid的調速。編碼器的選擇:一般編碼器和輪子是在一個軸上,目前來說,速度在0.7m/s以下的話,編碼器選600鍵到1200鍵之間都ok。不過需要注意的是,編碼器最好用雙線的,A、B兩線輸出,A向和B向輸出相差90度,這樣可以防抖動。防抖動就是可以在之後里程計算時可以更准確。左輪和右輪的速度大小的控制,通過輪子編碼器反饋,通過PID實時調整電機的PMW來實現。實時計算出小車的里程計(odom),得到小車移動位置的變化。計算車的位置變化是通過編碼器來計算的,如果輪子打滑等情況,那麼計算的變化和實際的變化可能不同。要解決這個問題,其實是看那個問題更嚴重。要走5米只走了4.9米重要,還是要走180度只走了179度重要。其實角度的不精確對小車的影響更大。一般來說,小車的直線距離精確度可以控制在厘米范圍內,在角度方面可以控制精準度在1%~2%。因為角度是比較重要的參數,所以很多人就用陀螺儀來進行矯正。所以有時候大家問小車精度有多高?其實現在這樣已經精度比較高了,難免打滑等問題,不可能做到百分之百的精準。小車在距離和角度方面做到現在這樣對於自建地圖導航已經是可以接受的,要提高更高的精度可能就要其他設備輔助,比如激光雷達來進行輔助,激光雷達可以進行二次檢測進行糾正。激光雷達數據的存儲格式,它首先會有一個大小范圍,如果超出范圍是無效的。還有就是有幾個采樣點,這樣就可以激光雷達可以告訴你隔多少度有一個采樣點。另外最後那個Intensities是告訴大家數據的准確率,因為激光雷達也是取最高點的數據,是有一定的准確率的。上面的ppt其實就是用激光雷達掃了一個牆的形狀。激光雷達掃出一個靜態形狀其實沒有意義,雷達建圖的意義其實在於建立房間的地圖。如何繪制地圖?第一步是收集眼睛數據:針對激光雷達,ROS在sensor_msgs包中定義了專用了數據結構來存儲激光消息的相關信息,成為LaserScan。它指定了激光的有效范圍、掃描點采樣的角度及每個角度的測量值。激光雷達360度實時掃描,能實時測出障礙物的距離、形狀和實時變化。第二步就是把眼睛看到的數據轉化為地圖:ROS的gmapping把激光雷達的/scan數據轉換為柵格map數據,其中黑色代表障礙物、白色代表空白區域,可以順利通行、灰色:未知領域。隨著機器人的移動,激光雷達可以在多個不同方位觀測同一個位置是否有障礙物,如果存在障礙物的閾值超過設置值是,就標定此處是存在障礙物;否則標定不存在障礙物。把障礙物、空白區域和未知領域的尺寸用不同灰度表示出來,就是柵格地圖。便於下一步定位和導航。有時候會出現很直的牆,機器人卻無法直著行走,這時的問題可能就是機器人的輪子出現打滑等其他問題,而走歪了,這時繪制出的地圖也可能是歪的。這種情況可以通過加一個陀螺儀來避免這個情況。因為激光雷達的特性,有時候遇到黑色或鏡面會導致測距不準。目前的解決方法就是不用激光雷達,或者用激光雷達和超聲波進行輔助處理。ROS的地圖是分多層的,我可以在不同高度放多台激光雷達來一起疊加,共同繪制一張地圖。地圖繪制結束之後,就可以進行定位和導航等工作。如何定位和導航?定位:其實是概率性的定位,而不是100%的精度。根據激光雷達掃描周圍障礙物的形狀,與地圖的形狀做匹配,判斷機器人所在位置的概率機器人的定位是否成功,與地圖特徵有很大關系,如果區域特徵明顯,那麼機器人就很容易判斷自己的位置。如果出現難以定位的問題,可能需要人給指定初始位置,或者加led來進行位置識別,或者其他的定位設備來協助定位。目前的視覺通過色彩或者光的技術越來越多。導航:全局路徑規劃+局部調整(動態避障)導航其實就是全局定位,首先根據現有地圖進行規劃,但是在運行過程中會進行局部的路線規劃。但是總體還是根據全局路徑來走。導航中工作量還很大,比如掃地機的路徑規劃和服務機器人的路徑規劃是不一樣的,掃地機器人可能要全覆蓋的有牆角的地圖,而服務機器人主要圍繞指定的路徑或者最短路徑來進行規劃,這部分是ROS工作量最大的一塊。路徑規劃根據不同應用場景變化比較大,但是ROS提供基礎的路徑規劃的開發包,在這個基礎上我們會做自己的路徑規劃。機器人描述和坐標系變換在導航時,哪些區域可以通過,取決於機器人形狀等信息,ROS通過URDF(UnifiedRobotDescriptionFormat)就是描述機器人硬體尺寸布局,比如輪子的位置、底盤大小、激光雷達安裝位置,這些都會影響到坐標系的轉換。坐標系遵循的前提是每個幀只能有一個父幀,再往上進行一些眼神或者關聯。激光雷達的安裝位置直接影響/scan輸出數據。所以激光雷達和機器人的相對位置是需要做坐標變換,才能把激光雷達的數據轉化為機器人視角的數據。ROS的坐標系,最終歸結為三個標准框架,可以簡化許多常見的機器人問題:1)全局准確,但局部不連續的幀(』map」)2)全局不準確,但局部光滑框架(』odom」)3)機器人自身框架(』base_link」)多種感測器(像激光雷達、深度攝像頭和陀螺儀加速度計等)都可以計算base_link和odom的坐標關系,但由於「每個幀只能有一個父幀」,所以只能有一個節點(比如robot_pose_ekf融合多感測器)發布base_link和odom的坐標關系。Baselink自身的坐標系,因為不同元件裝在機器人上不同位置,都要對應到baselink的坐標系中,因為所有的感測器都是要通過機器人的視角來「看」。有些朋友問我,激光雷達在建地圖的時候,小車移動後地圖就亂了,這是因為小車的底盤坐標系和激光雷達的坐標系沒有標定準確。map和odom之間的關聯因為小車移動需要一個局部聯系,比如小車在向前走,不停的累加,這是里程計的作用,map起到全局的、不連續的作用,經過激光雷達和map對應。如果要學習ROS的話,坐標系的變化是重要的點。坐標系的變換還有一個點,就是每個幀都只有一個父幀,有時候兩個坐標都和它有關聯的話,就是A和B關聯,B再和C關聯,而不是B/C都和A關聯。三個坐標幀的父子關系如下:map–>odom–>base_link其實,map和odom都應該和base_link關聯,但為了遵守「每個幀只能有一個父幀」的原則,根據map和base_link以及odom->base_link的關系,計算出map與odom的坐標關系並發布。odom->base_link的坐標關系是由里程計節點計算並發布的。map->base_link的坐標關系是由定位節點計算出來,但並不發布,而是利用接收odom->base_link的坐標關系,計算出map->odom的坐標關系,然後發布。只有里程計的時候,沒有激光雷達,也可以跑,但是要先根據預設地圖進行簡單避障。精彩問答Q:還有ROS的實時性有什麼改進進展嗎?A:實時改進要看ROS2.0的設計,其實ROS2.0的進展網上有公開。但是實際上他的進展離實際應用還有一定距離,至少今年下半年還達不到穩定,不過可以去研究下他的代碼,他對內存管理,線程管理,在實時性上有了很大改善。Q:vSLAM對內存和CPU要求頗高。實際工程中,李老師使用的是什麼硬體配置?可以做多大的地圖呢?A:確實如此,目前來說我們還是使用激光雷達和感測器輔助來進行,這個和地圖大小沒有太大關系,主要是與地形障礙物復雜程度有關。

4. ROS 怎麼設置 網路流量圖

防火牆問題,添加
/ip firewall filter add chain=input action=acc proto=tcp dst-port=埠
注意,拖到drop規則前。

5. 基於深度相機 RealSense D435i 的 ORB SLAM 2

相比於 上一篇文章 ,這里我們將官方給的 rosbag 數據包替換為來自深度相機的實時數據。之所以選擇 Intel RealSense 這款深度相機,僅僅是因為它是最容易買到的。。。在京東上搜「深度相機」,符合要求的幾乎都是這個系列的。具體到 D435i 這個型號,它可以提供深度和 RGB 圖像,而且帶有 IMU,未來如果我們繼續做視覺+慣導的 SLAM 也夠用了。

參考: https://www.intelrealsense.com/depth-camera-d435i/

Intel 官方給出了非常詳細的介紹,尤其是 產品手冊 ,幾乎涵蓋了用戶需要(以及不需要)了解的全部信息。
這里把其中關於 D435i 的關鍵信息摘錄出來,方便以後查閱。

Interl RealSence D4×× 系列,包括 D435i,都是採用經典的雙目視覺的方式測量深度。盡管具有紅外投射器,但並不是採用紅外反射測距。它的作用僅僅是投射不可見的固定的紅外紋理樣式,提高在紋理不明顯的環境中(例如白牆)的深度計算精度,輔助雙目視覺測距。左右兩個相機將圖像數據送入內置的深度處理器,在其中基於雙目測距的原理計算每個像素的深度值。

下圖顯示的是紅外投射在白紙上的紋理模式:

雙目測距相機的參數

紅外投射器參數

RGB 相機參數

深度圖像解析度與支持的幀率

RGB圖像解析度與支持的幀率

IMU 參數

Intel RealSense SDK 2.0 是跨平台的開發套裝,包含了基本的相機使用工具如 realsense-viewer,也為二次開發提供了豐富的介面,包括 ROS,python , Matlab, node.js, LabVIEW, OpenCV, PCL, .NET 等。

在 Linux 系統中,開發工具庫有兩種安裝方式,一種是安裝預編譯的 debian 包,另一種是從源碼編譯。
如果 Linux 內核版本為 4.4, 4.8, 4.10, 4.13, 4.15, 4.18* 5.0* and 5.3*,並且沒有用戶自定義的模塊,最好選擇安裝預編譯的 debian 包,方便很多。

通過如下命令查看 ubuntu kernel 版本

顯示結果為 5.0.0-23-generic ,滿足上述版本要求。我們選擇安裝預編譯的 debian 包。

Ubuntu 下的安裝步驟可以參考 https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md
具體步驟摘錄如下(針對 Ubuntu 18.04):

然後就可以運行 realsense-viewer 查看相機的深度和 RGB 圖像,以及 IMU 中的測量,如下圖所示:

另外還需要查看一下

確認包含 realsense 字樣,例如 version: 1.1.2.realsense-1.3.14 。

再查看一下 dkms

返回結果中包含類似 librealsense2-dkms, 1.3.14, 5.0.0-23-generic, x86_64: installed 。

如果以上都沒問題,說明 RealSense SDK 2.0 安裝成功!
如果上述返回結果有誤,則可能影響後續的運行。根據我們的經驗,realsense-dkms 會選擇 /lib/moles 中的第一個 kernel 安裝,如果系統中存在多個 kernel,而當前運行的 kernel 不是 /lib/moles 中的第一個 kernel,就可能出問題。

Intel RealSense D4×× 系列相機從 Firmware version 5.12.02.100 開始加入了自標定功能,大大提高了相機標定的自動化程度,不再需要拿著標定板擺拍了。

詳細操作可以查看 這里 。

簡要流程:

在本文中,我們的最終目的是將相機的深度和 RGB 數據發布到 ros topic 上,然後通過 ORB SLAM 2 進行點雲建圖。
這里就需要用到 ROS 的 realsense 庫 ros-$ROS_VER-realsense2-camera 。需要注意的是,這個 ROS 庫並不依賴於 RealSense SDK 2.0,兩者是完全獨立的。因此,如果只是想在 ROS 中使用 realsense,並不需要先安裝上邊的 RealSense SDK 2.0。

安裝步驟參考 https://github.com/IntelRealSense/realsense-ros 。
具體命令如下(前提:已安裝 ROS melodic 版本):

包括兩部分:

在啟動相機之前,我們需要設置一下 realsense2_camera rospack 中的 rs_camera.launch 的文件。
對於 ros launch 中各個參數的介紹可以參考 這里 。

在 rs_camera.launch 文件中確保以下兩個參數為 true :

前者是讓不同感測器數據(depth, RGB, IMU)實現時間同步,即具有相同的 timestamp;
後者會增加若干 rostopic,其中我們比較關心的是 /camera/aligned_depth_to_color/image_raw ,這里的 depth 圖像與 RGB 圖像是對齊的,對比如下

然後就可以用如下命令啟動相機了:

部分 ros topic 如下:

其中關鍵的是 /camera/color/image_raw 和 /camera/aligned_depth_to_color/image_raw 分別對應 RGB 圖像和深度圖像。基於這些數據,我們希望實現 ORB SLAM 2 + 點雲建圖的效果 。

相比於採用 rosbag 數據包的 ORB SLAM 2,這里有以下幾點修改:

做完以上修改,就可以按照 前一篇文章 中的步驟編譯和運行 ORB SLAM 2 了,此時深度和 RGB 數據不再是來自 rosbag ,而是來自相機。

命令總結如下:

最終保存的點雲地圖效果如下:

本文記錄了基於深度相機 Intel RealSense D435i 實現 ORB SLAM 2 的過程,由於之前的文章( 1 , 2 )已經非常詳細的記錄了基於 rosbag 數據包的 ORB SLAM 2,本文的大部分內容是記錄與深度相機相關的一些設置,方便自己以後查閱,也希望能幫到類似研究方向的其他讀者。

6. 激光雷達SLAM演算法

機器人研究的問題包含許許多多的領域,我們常見的幾個研究的問題包括:建圖(Mapping)、定位(Localization)和路徑規劃(Path Planning),如果機器人帶有機械臂,那麼運動規劃(Motion Planning)也是重要的一個環節,SLAM需要機器人在未知的環境中逐步建立起地圖,然後根據地區確定自身位置,從而進一步定位。

ROS系統通常由大量節點組成,其中任何一個節點均可以通過發布/訂閱的方式與其他節點進行通信。舉例來說,機器人上的一個位置感測器如雷達單元就可以作為ROS的一個節點,雷達單元可以以信息流的方式發布雷達獲得的信息,發布的信息可以被其他節點如導航單元、路徑規劃單元獲得。

ROS的通信機制:

ROS(機器人操作系統)中SLAM的一些功能包,也就是一些常用的SLAM演算法,例如Gmapping、Karto、Hector、Cartographer等演算法。我們不會去關注演算法背後的數學原理,而是更注重工程實現上的方法,告訴你SLAM演算法包是如何工作的,怎樣快速的搭建起SLAM演算法。

地圖 : ROS中的地圖很好理解,就是一張普通的灰度圖像,通常為pgm格式。這張圖像上的黑色像素表示障礙物,白色像素表示可行區域,灰色是未探索的區域

地圖在ROS中是以Topic的形式維護和呈現的,這個Topic名稱就叫做 /map ,由於 /map 中實際上存儲的是一張圖片,為了減少不必要的開銷,這個Topic往往採用鎖存(latched)的方式來發布。地圖如果沒有更新,就維持著上次發布的內容不變,此時如果有新的訂閱者訂閱消息,這時只會收到一個 /map 的消息,也就是上次發布的消息;只有地圖更新了(比如SLAM又建出來新的地圖),這時 /map 才會發布新的內容。 這種方式非常適合變動較慢、相對固定的數據(例如地圖),然後只發布一次,相比於同樣的消息不定的發布,鎖存的方式既可以減少通信中對帶寬的佔用,也可以減少消息資源維護的開銷。

Gmapping ,Gmapping演算法是目前基於激光雷達和里程計方案裡面比較可靠和成熟的一個演算法,它基於粒子濾波,採用RBPF的方法效果穩定,許多基於ROS的機器人都跑的是gmapping_slam。

gmapping的作用是根據激光雷達和里程計(Odometry)的信息,對環境地圖進行構建,並且對自身狀態進行估計。因此它得輸入應當包括激光雷達和里程計的數據,而輸出應當有自身位置和地圖。

論文支撐:R-LINS: A Robocentric Lidar-Inertial State Estimator for Robust and Efficient Navigation

6軸 IMU:高頻,聚焦自身運動,不採集外界環境數據
3D LiDAR:低頻,聚焦車體運動,採集外界環境數據

R-LINS使用以上兩種感測器來估計機器人的運動姿態, 對於任一感測器而言,單獨的依靠自己的數據是很難實現地圖構建的, 比如純雷達模型使用的感測器是激光雷達,可以很好的探測到外界的環境信息。但是,同樣的,也會受到這些信息的干擾,再長時間的運算中會產生一定的累計誤差。為了防止這種誤差干擾到後續的地圖構建中,需要使用另一種感測器來矯正機器人自身的位姿信息, 即IMU感測器,IMU感測器由於是自身運動估計的感測器,所以,採集的都是自身運動的姿態信息。可以很好的矯正激光雷達里程計的位姿信息。所以,通常使用激光雷達和慣導來進行數據融合,實現姿態信息的矯正。

一共分為三大塊:

7. ros是怎麼利用gmapping建立地圖的

ROS的stack庫分作兩部分,一部分為核心部分,即main部分,簡而言之就是使用下面命令,安裝ROS系統時就已經安裝到我們用戶電腦上的那部分。$sudoapt-getinstallros-diamondback-desktop-full另一部分為選用部分,即universe部分,它不僅包括一些開源庫的支持,如opencv,pcl,openni_kinect等,還有更上面以機器人功能模塊命令的一些stack,例如pr2_doors,find_object,facerecognition,grasp等等,真是一個豐富的寶藏,更詳細的stack包可以在官網的StackList頁面查詢。(.bashrc中$rosmake.(pr2_doors裡面所需的package文件)

閱讀全文

與ros建圖方法有哪些相關的資料

熱點內容
嬰兒拉肚子的鑒別方法 瀏覽:260
如何培養正氣的方法 瀏覽:564
oppo的ip地址在哪裡設置方法 瀏覽:882
思維方法特點是什麼 瀏覽:9
簡單萬用表使用方法完整視頻教程 瀏覽:863
兒童痣治療方法 瀏覽:487
研究方法調查問卷教學 瀏覽:399
fema安全分析方法 瀏覽:306
孩子快速入睡的方法 瀏覽:798
搜派風水機使用方法 瀏覽:695
豬肉價格下跌的解決方法 瀏覽:936
泉州學唱歌技巧和發聲方法 瀏覽:964
神經源性膀胱工傷治療方法 瀏覽:967
如何選擇設計特殊雜質檢查方法 瀏覽:15
電纜線接線方法視頻 瀏覽:777
湖南煙熏肉食用方法 瀏覽:313
釣具的連接方法 瀏覽:135
細胞增生的治療方法 瀏覽:834
下列處理方法不正確的是 瀏覽:168
舒適進入安裝方法 瀏覽:226