ROS-激光雷達建立地圖算法介紹

                                                  激光雷達建立地圖算法介紹

建圖算法:

1. hector_slam

要求: 高更新頻率、小測量噪聲的激光掃描儀,不需要里程計,可手持建圖。

在hector_slam程序中,最重要的是hector_mapping節點:

(1)訂閱的主題:

scan(類型:sensor_msgs/LaserScan):激光雷達的掃描數據,通常由設備的運行的節點提供,例如:hokuyo node

syscommand(類型:std_msgs/String) : 系統命令,直接受“reset”,當接受該命令時,重設map frame 和robot 位置到初始的狀態。

(2)發佈的主題:

map_metadata(類型:nav_msgs/MapMetaData):發佈地圖Meta數據,其餘節點可以獲取到map元數據,鎖定並且定期更新。

map(類型:nav_msgs/OccupancyGrid):發佈地圖柵格數據,其餘節點可以獲取到map數據,鎖定並且定期更新。

slam_out_pose(類型:geometry_msgs/PoseStamped):無協方差的預估機器人姿態。

poseupdate(類型:geometry_msgs/PoseWithCovarianceStamped):使用高斯預估不確定性的預估機器人姿態。

(3)服務:

dynamic_map(類型:nav_msgs/GetMap):使用該服務,獲取地圖數據。

(4)需要的tf

->base_fram激光雷達座標系與基座標系之間的變換,通常是固定值,由robot_state_publisher或者a tf static_transform_publisher發佈。

(5)提供的tf

map->odom :在map座標系中預估的robot姿態,當pub_map_odom_transform爲true時發佈。

 

2. gmapping_slam: tutorial

目前激光2Dslam用得最廣的方法,gmapping採用的是RBPF的方法,優點是定位準確,但需要完整的硬件平臺。

更能實現的需求:

基於激光雷達

RB粒子濾波算法

二位柵格地圖

機器人里程計信息

OpenSlam算法

輸出地圖話題:nav_msgs/OccupancyGrid

主要節點:slam_gmapping

該slam_gmapping節點發生在sensor_msgs /激光掃描信息,並建立一個映射(nav_msgs / OccupancyGrid)。可以通過ROS 主題或服務檢索地圖。

1)訂閱主題

tf(tf / tfMessage) :需要進行激光,基準和測距的相關框架轉換,即激光雷達座標系與基座標系之間的變換。

scan (sensor_msgs / LaserScan):激光掃描從中創建地圖。

2)發佈主題

map_metadata(nav_msgs / MapMetaData):從此主題獲取地圖數據,將其鎖定並定期更新。

map(nav_msgs / OccupancyGrid):從此主題獲取地圖數據,將其鎖定並定期更新

〜entropy (std_msgs / Float64):機器人姿態分佈的熵的估計值(較高的值表示較大的不確定性)。

3)服務

dynamic_map(nav_msgs / GetMap):調用此服務以獲取地圖數據。

4 必需的tf轉換

<傳入激光數據的框架> → base_link :通常是固定值,由robot_state_publisher或tf static_transform_publisher定期廣播。

base_link → odom:通常由里程錶系統(例如,移動基座的驅動器)提供,

5 提供tf轉換

地圖 → odom :在地圖框架內的機器人姿勢的當前估計。

3. karto_slam

karto_slam是基於圖優化的方法,用高度優化和非迭代cholesky矩陣進行稀疏系統解耦作爲解。圖優化方法利用圖的均值表示地圖,每個節點表示機器人軌跡的一個位置點和傳感器測量數據集,箭頭的指向的連接表示連續機器人位置點的運動,每個新節點加入,地圖就會依據空間中的節點箭頭的約束進行計算更新。

karto_slam的ROS版本,其中採用的稀疏點調整(the Spare Pose Adjustment(SPA))與掃描匹配和閉環檢測相關。landmark越多,內存需求越大,然而圖優化方式相比其他方法在大環境下製圖優勢更大.在某些情況下karto_slam更有效,因爲他僅包含點的圖(robot pose),求得位置後再求map。

4. core_slam

core_slam是爲了更加簡單容易地理解性能損失最小化的一種slam算法。將算法簡化爲距離計算與地圖更新的兩個過程, 第一步,每次掃描輸入,用基於簡單的粒子濾波算法來計算距離,粒子濾波的匹配器用於激光與地圖的匹配,每個濾波器粒子代表機器人可能的位置和相應的概率權重,這些都依賴之前的迭代計算。選擇好最好的假設分佈,即低權重粒子消失,新粒子生成。在更新步驟,掃描得到的線加入地圖中,當障礙出現時,圍繞障礙點繪製調整點集,而非僅一個孤立點。

系統總體框架

整個移動機器人的控制系統如上圖所示。

具體的各功能模塊之間的任務結構如下圖所示,其中base_controller節點將訂閱的cmd_vel信息通過串口或其它通信接口發送給下位機(嵌入式控制板)。下位機中根據機器人運動學公式進行解算,將機器人速度轉換爲每個輪子的速度,然後通過CAN總線(或其它總線接口)將每個輪子的轉速發送給電機驅動板控制電機轉動。電機驅動板對電機轉速進行閉環控制(PID控制),並統計單位時間內接收到的編碼器脈衝數,計算出輪子轉速。

base_controller節點將接收到的cmd_vel速度信息轉換爲自定義的結構體或union類型的數據(自定義的數據類型中可以包含校驗碼等其它信息),並通過串口發送控制速度信息(speed_buf)或讀取機器人傳回的速度信息 (speed_buf_rev)。base_controller節點正確讀取到底層(比如嵌入式控制板)傳回的速度後進行積分,計算出機器人的估計位置和姿態,並將里程計信息和tf變換髮布出去。

 

ROS gmapping導航包,要求的2 個 輸入,一是激光數據,另一個是里程計信息

里程計又包含2方面的信息:

一是位姿(位置和角度),即(x, y,θ)

二是速度,即(前進速度v和轉向速度ω)

里程計信息的數據獲取的途徑是:

1、採用ROS裏的package: laser_scan_matcher  

首先laser_scan_matcher 這個包,這個包能根據/scan 數據發佈2D位姿的數據, 我們是否可以根據2D位姿數據來轉換成表示位置的下x,y, z 以及表示姿態的四元數。

速度的獲取:根據2D位姿和時間變量,來計算前進速度和轉向速度。2D位姿數據包含:float64 x, float64 y, float64 theta,根據dt 時間裏dx,dy,dtheta, 就可以算出前進速度,和轉向速度。如果2D位姿數據足夠精準,基本都用不上陀螺儀校準。

 

2、採用電機編碼器來獲取

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章