ROS SLAM #2 Hector SLAM (2D地圖建置)
最近看的資料有點多,頭昏腦脹的^^"
大概就是如下面的影片那樣,利用RPLidar這個Laser scanner感測器,搭配Hector SLAM演算法去做地圖建置。
Demo影片
[安裝RPLidar driver]
硬體:RPLidar、Tegra TK1
軟體:Ubuntu 14.04、ROS Indigo
大概可以掃到的範圍是六米內,在使用前還是得先到官方網站下載SDK。
[圖一] RPLidar的樣子
官網的資料提供Windows跟Ubuntu板本的範例,同時也附上cp2102轉接晶片的driver。(在ubuntu安裝外來驅動點我) <– 如果不能按的話就是還沒寫XD
如果原本的kernel版本裡面就有的話也可以從裡面將驅動打開就好
這是RPLidar的Driver
$ cd ~/rplidar_sdk_v1.4.5/sdk/sdk
$ make
[圖二] RPLidar盒子附的轉接頭
windows在這裡就不說了,然而Ubuntu的sample要build過才能執行喔(大家自己摸索吧哇哈哈)
驅動都OK之後,要記得把com port的權限改掉,否則會遇到無法從感測器獲得資訊的情況。
先確定有認到port,再改權限成666即可。
$ ls /dev/ttyUSB*
[圖三]
更改com port 權限
$ sudo chmod 666 /dev/ttyUSB0
再來要裝的是RPLidar 在 ROS的package,有兩種方式。
第一種:透過PPA下載
$ sudo apt-get install ros-indigo-rplidar-ros
第二種:把Github 上的 source code放到catkin_ws裡 (選擇SLAM的branch)
$ cd ~/catkin_ws/src
$ git clone https://github.com/robopeak/rplidar_ros
$ cd ~/catkin_ws
$ catkin_make
載好ROS的範例就可以來執行看看囉~
單純preview畫面
$ roslaunch rplidar_ros view_rplidar.launch
[圖四] RPLidar preview
[下載Hector SLAM]
$ cd ~/catkin_ws/src
$ git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam
$ cd ~/catkin_ws
$ catkin_make
然後就可以來執行SLAM的部份
$ roslaunch rplidar_ros view_slam.launch
[圖五] 搭配hector slam demo
Hector SLAM簡介
Hector = Heterogeneous Cooperating Team of Robots
成立於2008的秋天,於2010年晚期從原本的RoboFrame中的演算法移植變成ROS的型式package。
註:RoboFrame似乎是某一個機器人作業系統
用2D網格的方式,將Laser scanner的值透過tf library轉換成xy坐標。
Pm為sensor位置,其餘紅點為暫存走過的格點。
estimate估計障礙物可能的位置並且描繪,重複掃描用bilinear filtering方式不斷修正地圖。
[圖六] Hector SLAM原裡
感測器使用的是RPLidar,下圖是利用rqt_graph畫出的關係圖。
大致上主要的路徑已塗上顏色。
RPlidar讀資料跟SLAM演算法是不同Package,並不是寫在一起的,透過message機制傳遞資訊。(這就是ROS的優點啊!)
Node | 功能 |
---|---|
/link2_broadcaster | ROS navigation的功能[見補充] |
/link1_broadcaster | ROS navigation的功能[見補充] |
/rplidarNode | 將讀到的值丟到 /scan 的這個topic |
/hector_height_mapping | Hector SLAM演算法 |
Topic (資料型態)
Topic | Data type | 功能 |
---|---|---|
/tf_static | tf2_msgs/TFMessage | ROS navigation的功能[見補充] |
/tf | tf2_msgs/TFMessage | ROS navigation的功能 |
/initalpose() | ROS navigation的功能 | [見補充] |
/scan | sensor_msgs/LaserScan | Lidar讀到的值 |
/map | nav_msgs/OccupancyGrid | Map的值 |
[圖七] Demo code的流程圖
再將hector mapping的部份拆開來會看到
Node | 功能 |
---|---|
hector_pose_estimation | 將sensor的值轉換成imu資訊丟給tf處理。 |
hector_mapping | 不斷地即時更新map,並publish。 |
hector_map_server | 儲存並畫出地圖形狀,提供查詢位置(pose)服務。 |
hector_trajectory_server | 從TF中提取資訊,轉換成移動路徑位置。 |
hector_geotiff | 將所有得到的資訊整合到網格地圖(可以從rviz看到)。 |
imu = (Inertial Measurement Unit)
data type:geometry_msgs
包含方位變異值(orientation)、角速度變異值(angular velocity)、線性加速度變異值(linear acceleration)主要是roll(x)與pitch(y),因為不需要考慮高度。
[圖八] 網路上抓的,畫的比較好的圖。
[補充] ROS navigation的功能
包含tf、actionlib、pluginlib、dynamic_reconfigure簡單來說,是ros提供用在地圖與機器人姿態之間轉換的功能。
用這些現成的工具,就可以做到定位(相對定位)的效果。
歡迎轉載分享,但是要告知並註明出處。
若有錯誤,懇請指正。