激光雷達建立地圖算法介紹
建圖算法:
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、採用電機編碼器來獲取