基於Gazebo搭建移動機器人,並結合SLAM系統完成建圖模擬

2023-05-14 18:01:28

部落格地址:https://www.cnblogs.com/zylyehuo/

gazebo小車模型建立及模擬詳見之前部落格

gazebo小車模型(附帶模擬環境) - zylyehuo - 部落格園

gazebo+rviz 模擬 - zylyehuo - 部落格園

參考連結

Autolabor-ROS機器人入門課程《ROS理論與實踐》

成果圖

step1: 準備工作

安裝必要工具包+建立工作包

  • 安裝 gmapping 包(用於構建地圖): sudo apt install ros-melodic-gmapping
  • 安裝地圖服務包(用於儲存與讀取地圖):sudo apt install ros-melodic-map-server
  • 安裝 navigation 包(用於定位以及路徑規劃):sudo apt install ros-melodic-navigation

建立資料夾及檔案

按下圖結構在 nav_demo 下依次建立

資料夾: config(也可按照步驟之後建立)、map(也可按照步驟之後建立)、launch

檔案:nav01_slam.launch、nav02_map_save.launch、nav03_map_server.launch

/home/yehuo/mycar_ws/src/nav_demo/launch/nav01_slam.launch

<launch>
    <!-- 模擬環境下,將該引數設定為true  -->
    <param name="use_sim_time" value="true"/>
    <!-- gmapping  -->
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
      <!-- 設定雷達話題  -->
      <remap from="scan" to="scan"/>

      <!-- 關鍵引數:座標系 -->
      <param name="base_frame" value="base_footprint"/><!--底盤座標系-->
      <param name="map_frame" value="map"/>
      <param name="odom_frame" value="odom"/> <!--里程計座標系-->

      <param name="map_update_interval" value="5.0"/>
      <param name="maxUrange" value="16.0"/>
      <param name="sigma" value="0.05"/>
      <param name="kernelSize" value="1"/>
      <param name="lstep" value="0.05"/>
      <param name="astep" value="0.05"/>
      <param name="iterations" value="5"/>
      <param name="lsigma" value="0.075"/>
      <param name="ogain" value="3.0"/>
      <param name="lskip" value="0"/>
      <param name="srr" value="0.1"/>
      <param name="srt" value="0.2"/>
      <param name="str" value="0.1"/>
      <param name="stt" value="0.2"/>
      <param name="linearUpdate" value="1.0"/>
      <param name="angularUpdate" value="0.5"/>
      <param name="temporalUpdate" value="3.0"/>
      <param name="resampleThreshold" value="0.5"/>
      <param name="particles" value="30"/>
      <param name="xmin" value="-50.0"/>
      <param name="ymin" value="-50.0"/>
      <param name="xmax" value="50.0"/>
      <param name="ymax" value="50.0"/>
      <param name="delta" value="0.05"/>
      <param name="llsamplerange" value="0.01"/>
      <param name="llsamplestep" value="0.01"/>
      <param name="lasamplerange" value="0.005"/>
      <param name="lasamplestep" value="0.005"/>
      
    </node>

    <node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />
    <node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />

    <node pkg="rviz" type="rviz" name="rviz" />
    <!-- 可以儲存 rviz 設定並後期直接使用-->
    <!--
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_nav_sum)/rviz/gmapping.rviz"/>
    -->
</launch>

step2: 模擬環境執行 + SLAM建圖

(1)編譯+啟動 gazebo 模擬環境

source ./devel/setup.bash 

roslaunch mycar environment.launch

(2)啟動 rviz

source ./devel/setup.bash

roslaunch nav_demo nav01_slam.launch

(3)啟動鍵盤控制節點

rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.3 _turn:=0.5

(4)在 rviz 中顯示模擬環境

(5)儲存 rviz 設定

(6)通過鍵盤控制機器人運動

每隔 5s 更新一次地圖

step3: 儲存地圖(在step2基礎上,不要關閉之前程式)

/home/yehuo/mycar_ws/src/nav_demo/launch/nav02_map_save.launch

<launch>
    <arg name="filename" value="$(find nav_demo)/map/nav" />
    <node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
</launch>

在 nav_demo 下新建資料夾 map

新建終端,儲存地圖

source ./devel/setup.bash

roslaunch nav_demo nav02_map_save.launch

/home/yehuo/mycar_ws/src/nav_demo/map/nav.yaml 檔案解釋

# 1、宣告地圖圖片資源的路徑
image: /home/yehuo/mycar_ws/src/nav_demo/map/nav.pgm

# 2、地圖刻度尺單位是 米/畫素
resolution: 0.050000

# 3、地圖的位姿(按照右手座標系,地圖右下角相對於 rviz 中原點的位姿)
# 值1:x方向上的偏移量
# 值2:y方向上的偏移量
# 值3:地圖的偏航角度(單位:弧度)
origin: [-50.000000, -50.000000, 0.000000]

# 地圖中的障礙物判斷:
# 最終顯示結果:白色是可通行區域,黑色是障礙物,藍灰是未知區域
# 判斷規則:
# 1、地圖中的每個畫素都有取值 [0,255]       255:白色       0:黑色
# 2、根據畫素值計算一個比例:        p   = (255 - 畫素值)/  255       ==>   0:白色    1:黑色
# 3、判斷是否是障礙物, p > occupied_thresh        就是障礙物
#                    p < free_thresh            就無障礙物

# 4、佔用閾值
occupied_thresh: 0.65

# 5、空閒閾值
free_thresh: 0.196

# 6、取反(1:黑的區域變白的,白的區域變黑的)
negate: 0

step4: 讀取地圖

/home/yehuo/mycar_ws/src/nav_demo/launch/nav03_map_server.launch

<launch>

    <!-- 設定地圖的組態檔 -->
    <arg name="map" default="nav.yaml" />

    <!-- 執行地圖伺服器,並且載入設定的地圖-->
    <node name="map_server" pkg="map_server" type="map_server" args="$(find nav_demo)/map/$(arg map)"/>

</launch>

讀取地圖

source ./devel/setup.bash

roslaunch nav_demo nav03_map_server.launch

顯示讀取的地圖

開啟一個新的終端,啟動 rviz