1. 程式人生 > >SLAM:Google cartographer演算法 機器人建圖、儲存地圖

SLAM:Google cartographer演算法 機器人建圖、儲存地圖

這兩天跑了以下google的cartographer演算法,效果不錯,比gmapping效果要好。

cartographer的安裝網上很多教程,主要按照張明明的方法,https://github.com/hitcm/,安裝好後,下個數據集,執行roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=yourpath/cartographer_paper_deutsches_museum.bag,就可以看到網上流行的那張圖,

模擬資料跑成功後,就要用自己的機器人跑演算法了。就我的實際經驗,跑模擬資料很容易,照著教程,一步步來,基本都能看到建圖效果

//////////******************************************************************************************************************************************/////////////

我使用的是adept機器人,其實不同的機器人差別不大,主要是看用了哪些感測器資料。我用的這款adept有鐳射和里程計。

和網上其他教程基本一樣,主要修改demo_revo_lds.launch和revo_lds.lua

其中,demo_revo_lds.launch裡面,

<launch>
  <param name="/use_sim_time" value="true" />
   <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename revo_lds.lua"
      output="screen">
    <remap from="scan" to="scan" />
  </node>

主要是修改

  <remap from="scan" to="scan" />

將後面的scan修改成機器人釋出的鐳射topic

我的revo_lds.lua配置如下

include "map_builder.lua"
 
options = {  map_builder = MAP_BUILDER,
 
 map_frame = "map",
 
tracking_frame = "base_link",
 
published_frame = "base_link",
 
odom_frame = "odom",
 
provide_odom_frame = true,
 
use_odometry_data = false,

use_constant_odometry_variance = false,

constant_odometry_translational_variance = 0.,

constant_odometry_rotational_variance = 0.,
 
use_horizontal_laser = true,
 
use_horizontal_multi_echo_laser = false,

  horizontal_laser_min_range = 0.3,
  horizontal_laser_max_range = 8.,
  horizontal_laser_missing_echo_ray_length = 0.,

 
num_lasers_3d = 0,
 
lookup_transform_timeout_sec = 0.2,
 
submap_publish_period_sec = 0.3,
 
pose_publish_period_sec = 5e-3,
 
}
 
MAP_BUILDER.use_trajectory_builder_2d = true
 
TRAJECTORY_BUILDER_2D.use_imu_data = false
 
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
 
SPARSE_POSE_GRAPH.optimization_problem.huber_scale = 1e2
 
return options

其中比較關鍵的是開始的幾個frame的設定,網上轉載比較多的是

map_frame = "map",
  tracking_frame = "laser",
  published_frame = "laser",
  odom_frame = "odom",

這樣設定的原因應該是隻用了一個鐳射器,而不是機器人,所以用“laser”,這個“laser”也需要檢視鐳射器在tf_tree中的名稱,用實際的名稱替換,否則rviz中看不到地圖,因為tf有問題。我通過rosrun rqt_tf_tree rqt_tf_tree 檢視機器人釋出的tf_tree

因此,我可以用 tracking_frame = "laser_frame",這樣設定可以看到slam建圖,但是如果鐳射器不在機器人中心(laser與odom不重合),tf_tree會不斷跳變。

按照網上牛人的說明blog.csdn.net/mllearnertj/article/details/72871169,我的配置檔案裡tracking_frame = "base_link",

(一) 定義的各種座標系間的關係
1. map_frame = “map”,cartographer中使用的全域性座標系,最好保持預設,否則ROS的Rviz不認識其它的定義,導致無法視覺化建圖過程。
2.tracking_frame=”base_link”,機器人中心座標系,很重要,其它感測器資料都是以這個為基礎進行插入的。cartographer_ros裡面有個tf_bridge的類就是專門用來查詢其它座標系到此座標系的轉換關係的。
2. published_frame = “base_link”
3. odom_frame = “odom” ,3與4是配合使用的,如果引數provide_odom_frame = true 那麼最後視覺化時,釋出的轉換訊息是從 published_frame->odom_frame->map_frame, 也即cartographer內部計算出了未經迴環檢測的區域性圖座標到優化後的全域性圖座標之間的轉換關係併發布了出來。在跑官網的二維揹包例子時,在map座標周圍一直跳動的odom就是這個玩意。

接下來 roslaunch cartographer_ros demo_revo_lds.launch 就能成功看到地圖了。

///////******************************************************************************************//////////////////

儲存地圖

按照網上說法 rosservice call /finish_trajectory "stem: '地圖名稱'" 就可以在~/.ros/資料夾下生成pgm和yaml檔案。但我執行時,提示了錯誤,

"Key '"sensor_bridge  "' was used the wrong number of times."

我把配置檔案中的sensor_bridge 刪除後,地圖可以正常儲存了。效果如下

cartographer能夠在地圖中發現小的目標,這點比基於pf粒子濾波的gmapping強。

暫時寫道這,後面繼續學習cartographer和orb-slam2.

include "map_builder.lua"

options = {
 map_builder = MAP_BUILDER,
 sensor_bridge={
horizontal_laser_min_range=0.,
horizontal_laser_max_range=30.,
horizontal_laser_missing_echo_ray_length=1.,
constant_odometry_translational_variance=0.,
constant_odometry_rotational_variance=0.,

},
  map_frame = "map",
  tracking_frame = "base_link",
  published_frame = "base_link",
  odom_frame = "odom",
  provide_odom_frame = true,
  use_odometry = false,
  use_laser_scan = true,
  use_multi_echo_laser_scan = false,
  num_point_clouds = 0,
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.laser_min_range = 0.1
TRAJECTORY_BUILDER_2D.laser_max_range = 30.
TRAJECTORY_BUILDER_2D.laser_missing_echo_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true

SPARSE_POSE_GRAPH.optimization_problem.huber_scale = 1e2

return options