gazebo小車模型建立及模擬詳見之前部落格
參考連結
成果圖
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