我們已經在gazebo中實現了機器人的仿真,而且能夠控制機器人的運動, 查看機器人所感知到的信息, 包括lasercan, 圖像信息, 深度信息, 點雲, 也包括沒有提到的速度信息. 這里,我們建立用ROS navigation stack 導航功能包ROS navigation stack 導航功能包 , 進行機器人地圖構建與導航.
part 2.1: 讓turtlebot自主導航
1 創建地圖
使用下面的命令,借助鍵盤遙控機器人創建精確詳盡的地圖.
加載Gazebo仿真環境
roslaunch turtlebot_gazebo turtlebot_world.launch
開始構建地圖
roslaunch turtlebot_gazebo gmapping_demo.launch
rviz可視化
roslaunch turtlebot_rviz_launchers view_navigation.launch
鍵盤遙控
roslaunch turtlebot_teleop keyboard_teleop.launch
通過不斷地讓機器人在環境中游走, 就可以得到一個grid 地圖.
2 保存地圖
保存地圖到本地文件夾
rosrun map_server map_saver -f ~/file_folder/test_map
3 加載地圖
關閉之前的節點, 重新打開gezebo仿真環境, 加載地圖, 進行導航.
加載Gazebo仿真環境
roslaunch turtlebot_gazebo turtlebot_world.launch
加載地圖
roslaunch turtlebot_gazebo amcl_demo.launch map_file:=~/file_folder/test_map.yaml
rviz可視化
roslaunch turtlebot_rviz_launchers view_navigation.launch
part 2.2: 解釋與擴展
對於仿真環境,顯示以及配置文件已經在之前詳細說明.
gmapping
上文采用gmapping
進行地圖構建, gmapping
是一個ros自帶的地圖構建工具包。slam_gmapping
采用激光數據(topic:sensor_msgs/LaserScan
)生成二維地圖(topic:nav_msgs/OccupancyGrid
). 在gmapping
tutorial中 ,可以發現, 訂閱的主題,發布的主題,以及調用的服務。
訂閱主題
tf (tf/tfMessage)
坐標系轉換scan (sensor_msgs/LaserScan)
激光數據
發布主題
map_metadata (nav_msgs/MapMetaData)
map (nav_msgs/OccupancyGrid)
地圖數據entropy (std_msgs/Float64)
表示機器人位姿的不確定性
服務
dynamic_map (nav_msgs/GetMap)
調用獲得地圖數據
amcl
amcl
全稱adaptive Monte Carlo localization
,是一個機器人二維環境的概率定位系統, 在已知地圖的環境中, 利用粒子濾波跟蹤機器人的位姿. ROS中的amcl
節點訂閱激光數據sensor_msgs/LaserScan
和地圖數據nav_msgs/OccupancyGrid
, 得到機器人的估計位姿.
訂閱主題
scan (sensor_msgs/LaserScan)
激光數據tf (tf/tfMessage)
initialpose (geometry_msgs/PoseWithCovarianceStamped)
map (nav_msgs/OccupancyGrid)
地圖信息
發布主題
amcl_pose (geometry_msgs/PoseWithCovarianceStamped)
機器人在地圖中的估計位置及協方差particlecloud (geometry_msgs/PoseArray)
粒子雲位置估計tf (tf/tfMessage)