這一節(jié)將來總結(jié)關(guān)于SLAM構(gòu)建地圖的相關(guān)知識,從具體的場景來寫,然后對于用到的知識將會詳細(xì)補(bǔ)充。
在構(gòu)建地圖時用到的launch文件是exploring_slam_demo,首先是他的代碼部分:
<launch>
<include file="$(find mbot_navigation)/launch/gmapping.launch"/>
<!-- 運(yùn)行move_base節(jié)點(diǎn) -->
<include file="$(find mbot_navigation)/launch/move_base.launch" />
<!-- 運(yùn)行rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find mbot_navigation)/rviz/nav.rviz"/>
</launch>
很容易看出是由三部分組成,以下分三塊來講
一 gmapping.launch文件
路徑:mbot_navigation/launch
代碼:
<launch>
<arg name="scan_topic" default="scan" /> // laser的topic名稱,與自己的激光的topic相對應(yīng)
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true"> //啟動slam的節(jié)點(diǎn)
<param name="base_frame" value="$(arg base_frame)"/>
<param name="odom_frame" value="odom"/>
<param name="map_update_interval" value="5.0"/> //地圖更新的頻率,兩次scanmatch的間隔,地圖更新也受scanmach的影響,如果scanmatch沒有成功的話,是不會更新地圖的
<!-- Set maxUrange < actual maximum range of the Laser -->
<param name="maxRange" value="5.0"/> // 傳感器的最大范圍。如果傳感器范圍內(nèi)沒有障礙物的區(qū)域在地圖中顯示為自由空間,則設(shè)置maxUrange <實際傳感器的最大范圍<= maxRange。
<param name="maxUrange" value="4.5"/> // //set maxUrange < maximum range of the real sensor <= maxRange 激光的最大可用范圍。光束被裁剪為該值。
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/> // 內(nèi)核中要查找一個對應(yīng)關(guān)系
<param name="lstep" value="0.05"/> //optimize機(jī)器人移動的初始值(距離)
<param name="astep" value="0.05"/> // optimize機(jī)器人移動的初始值(角度)
<param name="iterations" value="5"/> ////icp的迭代次數(shù)
<param name="lsigma" value="0.075"/> //用于計算的波束可能性的sigma
<param name="ogain" value="3.0"/> //在評估可能性時使用的增益,用于平滑重采樣效果
<param name="lskip" value="0"/> ////為0,表示所有的激光都處理,盡可能為零,如果計算壓力過大,可以改成1
<param name="srr" value="0.01"/> //作為平移函數(shù)的平移誤差(rho / rho)
<param name="srt" value="0.02"/> //作為旋轉(zhuǎn)的函數(shù)的平移誤差(rho / theta)
<param name="str" value="0.01"/> //作為平移函數(shù)的旋轉(zhuǎn)中的測量誤差(θ/ rho)
<param name="stt" value="0.02"/> // 作為旋轉(zhuǎn)的函數(shù)的旋轉(zhuǎn)中的測量誤差(θ/θ)
<param name="linearUpdate" value="0.5"/> ////機(jī)器人移動linearUpdate距離,進(jìn)行scanmatch(每次[機(jī)器人翻譯遠(yuǎn)處時,處理一次掃描)
<param name="angularUpdate" value="0.436"/> //機(jī)器人選裝angularUpdate角度,進(jìn)行scanmatch (俗話說:每次機(jī)器人旋轉(zhuǎn)這么遠(yuǎn)時處理一次掃描)
<param name="temporalUpdate" value="-1.0"/> //如果上次掃描處理的時間早于更新時間(秒),則處理掃描。小于零的值將關(guān)閉基于時間的更新。
<param name="resampleThreshold" value="0.5"/> //基于Neff的重采樣閾值
<param name="particles" value="80"/> //很重要,粒子個數(shù)
<param name="xmin" value="-1.0"/> //map初始化的大小
<param name="ymin" value="-1.0"/> //初始地圖大小Y最小值
<param name="xmax" value="1.0"/> // 初始地圖大小X最大值
<param name="ymax" value="1.0"/> //初始地圖大小Y最大值
<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"/> //角度采樣步驟的可能性
<remap from="scan" to="$(arg scan_topic)"/> // 激光掃描從中創(chuàng)建地圖
</node>
</launch>
上面的注釋來源于:gmapping介紹及參數(shù)說明
使用slam_gmapping節(jié)點(diǎn),需要移動機(jī)器人提供里程計數(shù)據(jù),并且機(jī)器人配備有固定激光測距儀。slam_gmapping節(jié)點(diǎn)將每個傳入的掃描轉(zhuǎn)化為odom(里程計)TF框架,可以參照:TF參照
節(jié)點(diǎn):
- slam_gmapping
該slam_gmapping節(jié)點(diǎn)發(fā)生在sensor_msgs /激光掃描信息,并建立一個映射(nav_msgs / OccupancyGrid)??梢酝ㄟ^ROS 主題或服務(wù)檢索地圖。 - 訂閱主題
- tf(tf / tfMessage)
需要進(jìn)行激光,基準(zhǔn)和測距的相關(guān)框架轉(zhuǎn)換- scan (sensor_msgs / LaserScan)
激光掃描從中創(chuàng)建地圖
- 發(fā)布主題
- scan (sensor_msgs / LaserScan)
激光掃描從中創(chuàng)建地圖- map(nav_msgs / OccupancyGrid)
從此主題獲取地圖數(shù)據(jù),將其鎖定并定期更新- ?entropy (std_msgs / Float64)
機(jī)器人姿態(tài)分布的熵的估計值(較高的值表示較大的不確定性)。
- 服務(wù)
dynamic_map(nav_msgs / GetMap)
調(diào)用此服務(wù)以獲取地圖數(shù)據(jù) - 必需的tf轉(zhuǎn)換
- <傳入激光數(shù)據(jù)的框架> → base_link
通常是固定值,由robot_state_publisher或tf static_transform_publisher定期廣播。- base_link → odom
通常由里程表系統(tǒng)(例如,移動基座的驅(qū)動器)提供,
- 提供tf轉(zhuǎn)換
地圖 → odom
在地圖框架內(nèi)的機(jī)器人姿勢的當(dāng)前估計
軟件包摘要:
這個包包含一個用于OpenSlam的Gmapping的ROS包。gmapping包提供基于激光的SLAM(同時定位和建圖),作為稱為slam_gmapping的ROS節(jié)點(diǎn)。使用slam_gmapping,您可以從移動機(jī)器人收集的激光和姿勢數(shù)據(jù)創(chuàng)建2-D占用網(wǎng)格地圖(如建筑平面圖)。
重要參數(shù)說明:
- particles (int, default: 30) gmapping算法中的粒子數(shù),因為gmapping使用的是粒子濾波算法,粒子在不斷地迭代更新,所以選取一個合適的粒子數(shù)可以讓算法在保證比較準(zhǔn)確的同時有較高的速度。
- minimumScore (float, default: 0.0) 最小匹配得分,這個參數(shù)很重要,它決定了對激光的一個置信度,越高說明對激光匹配算法的要求越高,激光的匹配也越容易失敗而轉(zhuǎn)去使用里程計數(shù)據(jù),而設(shè)的太低又會使地圖中出現(xiàn)大量噪聲,所以需要權(quán)衡調(diào)整。(在這個launch文件中沒有用到這個參數(shù)具體原因還不知道)
二 move_base.launch 文件
路徑:mbot_navigation/launch
代碼:
<launch>
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
<rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find mbot_navigation)/config/mbot/local_costmap_params.yaml" command="load" />
<rosparam file="$(find mbot_navigation)/config/mbot/global_costmap_params.yaml" command="load" />
<rosparam file="$(find mbot_navigation)/config/mbot/base_local_planner_params.yaml" command="load" />
</node>
</launch>
路徑:mbot_navigation/config/mbot
代碼說明:
- costmap_common_params.yaml 代價地圖通用配置文件
- global_costmap_params.yaml 全局代價地圖配置文件
- local_costmap_params.yaml 本地代價地圖配置文件
- base_local_planner_params.yaml 本地規(guī)劃器配置文件
具體關(guān)于每一個問價參照博客;move_base配置參數(shù)
關(guān)于move_base的說明參照move_base
三 運(yùn)行rviz
路徑:mbot_navigation/rviz
代碼:
Panels:
- Class: rviz/Displays
Help Height: 78
Name: Displays
Property Tree Widget:
Expanded:
- /Global Options1
- /RobotModel1/Links1/base_footprint1
- /Pose Array1
Splitter Ratio: 0.652661026
Tree Height: 691
- Class: rviz/Selection
Name: Selection
- Class: rviz/Tool Properties
Expanded:
- /2D Pose Estimate1
- /2D Nav Goal1
Name: Tool Properties
Splitter Ratio: 0.428570986
- Class: rviz/Views
Expanded:
- /Current View1
Name: Views
Splitter Ratio: 0.5
- Class: rviz/Time
Experimental: false
Name: Time
SyncMode: 0
SyncSource: LaserScan
Visualization Manager:
Class: ""
Displays:
- Alpha: 0.5
Cell Size: 0.5
Class: rviz/Grid
Color: 0; 0; 0
Enabled: true
Line Style:
Line Width: 0.0299999993
Value: Lines
Name: Grid
Normal Cell Count: 0
Offset:
X: 0
Y: 0
Z: 0
Plane: XY
Plane Cell Count: 80
Reference Frame: odom
Value: true
- Angle Tolerance: 0.100000001
Class: rviz/Odometry
Covariance:
Orientation:
Alpha: 0.5
Color: 255; 255; 127
Color Style: Unique
Frame: Local
Offset: 1
Scale: 1
Value: true
Position:
Alpha: 0.300000012
Color: 204; 51; 204
Scale: 1
Value: true
Value: true
Enabled: false
Keep: 100
Name: Odometry
Position Tolerance: 0.100000001
Shape:
Alpha: 1
Axes Length: 1
Axes Radius: 0.100000001
Color: 255; 25; 0
Head Length: 0.300000012
Head Radius: 0.100000001
Shaft Length: 1
Shaft Radius: 0.0500000007
Value: Arrow
Topic: /odom
Unreliable: false
Value: false
- Angle Tolerance: 0.100000001
Class: rviz/Odometry
Covariance:
Orientation:
Alpha: 0.5
Color: 255; 255; 127
Color Style: Unique
Frame: Local
Offset: 1
Scale: 1
Value: true
Position:
Alpha: 0.300000012
Color: 204; 51; 204
Scale: 1
Value: true
Value: true
Enabled: false
Keep: 100
Name: Odometry EKF
Position Tolerance: 0.100000001
Shape:
Alpha: 1
Axes Length: 1
Axes Radius: 0.100000001
Color: 255; 25; 0
Head Length: 0.300000012
Head Radius: 0.100000001
Shaft Length: 1
Shaft Radius: 0.0500000007
Value: Arrow
Topic: /odom
Unreliable: false
Value: false
- Alpha: 1
Class: rviz/RobotModel
Collision Enabled: false
Enabled: true
Links:
All Links Enabled: true
Expand Joint Details: false
Expand Link Details: false
Expand Tree: false
Link Tree Style: Links in Alphabetic Order
back_caster_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
base_footprint:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
base_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
front_caster_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
laser_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
left_wheel_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
right_wheel_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
Name: RobotModel
Robot Description: robot_description
TF Prefix: ""
Update Interval: 0
Value: true
Visual Enabled: true
- Alpha: 0.699999988
Class: rviz/Map
Color Scheme: map
Draw Behind: true
Enabled: true
Name: Map
Topic: /map
Unreliable: false
Use Timestamp: false
Value: true
- Alpha: 1
Buffer Length: 1
Class: rviz/Path
Color: 255; 0; 0
Enabled: true
Head Diameter: 0.300000012
Head Length: 0.200000003
Length: 0.300000012
Line Style: Lines
Line Width: 0.0299999993
Name: Local Plan
Offset:
X: 0
Y: 0
Z: 0
Pose Color: 255; 85; 255
Pose Style: None
Radius: 0.0299999993
Shaft Diameter: 0.100000001
Shaft Length: 0.100000001
Topic: /move_base/TrajectoryPlannerROS/local_plan
Unreliable: false
Value: true
- Alpha: 1
Buffer Length: 1
Class: rviz/Path
Color: 0; 213; 0
Enabled: true
Head Diameter: 0.300000012
Head Length: 0.200000003
Length: 0.300000012
Line Style: Lines
Line Width: 0.0299999993
Name: Global Plan
Offset:
X: 0
Y: 0
Z: 0
Pose Color: 255; 85; 255
Pose Style: None
Radius: 0.0299999993
Shaft Diameter: 0.100000001
Shaft Length: 0.100000001
Topic: /move_base/TrajectoryPlannerROS/global_plan
Unreliable: false
Value: true
- Alpha: 1
Arrow Length: 0.300000012
Axes Length: 0.300000012
Axes Radius: 0.00999999978
Class: rviz/PoseArray
Color: 170; 255; 127
Enabled: true
Head Length: 0.0700000003
Head Radius: 0.0299999993
Name: Pose Array
Shaft Length: 0.230000004
Shaft Radius: 0.00999999978
Shape: Arrow (Flat)
Topic: /particlecloud
Unreliable: false
Value: true
- Alpha: 1
Autocompute Intensity Bounds: true
Autocompute Value Bounds:
Max Value: 0.30399999
Min Value: 0.30399999
Value: true
Axis: Z
Channel Name: intensity
Class: rviz/LaserScan
Color: 255; 0; 0
Color Transformer: FlatColor
Decay Time: 0
Enabled: true
Invert Rainbow: false
Max Color: 255; 255; 255
Max Intensity: 4096
Min Color: 0; 0; 0
Min Intensity: 0
Name: LaserScan
Position Transformer: XYZ
Queue Size: 10
Selectable: true
Size (Pixels): 3
Size (m): 0.00999999978
Style: Points
Topic: /scan
Unreliable: false
Use Fixed Frame: true
Use rainbow: true
Value: true
- Alpha: 1
Axes Length: 1
Axes Radius: 0.100000001
Class: rviz/Pose
Color: 0; 255; 0
Enabled: true
Head Length: 0.100000001
Head Radius: 0.150000006
Name: Goal Pose
Shaft Length: 0.5
Shaft Radius: 0.0299999993
Shape: Arrow
Topic: /move_base_simple/goal
Unreliable: false
Value: true
- Alpha: 0.699999988
Class: rviz/Map
Color Scheme: costmap
Draw Behind: false
Enabled: true
Name: Inflated Obstacles
Topic: /move_base/local_costmap/costmap
Unreliable: false
Use Timestamp: false
Value: true
- Class: rviz/Marker
Enabled: true
Marker Topic: /waypoint_markers
Name: Marker
Namespaces:
{}
Queue Size: 100
Value: true
Enabled: true
Global Options:
Background Color: 0; 0; 0
Default Light: true
Fixed Frame: map
Frame Rate: 30
Name: root
Tools:
- Class: rviz/MoveCamera
- Class: rviz/Interact
Hide Inactive Objects: true
- Class: rviz/Select
- Class: rviz/SetInitialPose
Topic: /initialpose
- Class: rviz/SetGoal
Topic: /move_base_simple/goal
Value: true
Views:
Current:
Angle: -6.3000164
Class: rviz/TopDownOrtho
Enable Stereo Rendering:
Stereo Eye Separation: 0.0599999987
Stereo Focal Distance: 1
Swap Stereo Eyes: false
Value: false
Invert Z Axis: false
Name: Current View
Near Clip Distance: 0.00999999978
Scale: 52.4497948
Target Frame: <Fixed Frame>
Value: TopDownOrtho (rviz)
X: 0.412709981
Y: -2.02176332
Saved: ~
Window Geometry:
Displays:
collapsed: false
Height: 904
Hide Left Dock: false
Hide Right Dock: false
QMainWindow State: 000000ff00000000fd00000004000000000000016a00000342fc0200000005fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000198000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000002800000342000000d700ffffff000000010000010f00000270fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000002800000270000000ad00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004a00000003efc0100000002fb0000000800540069006d00650000000000000004a00000030000fffffffb0000000800540069006d00650100000000000004500000000000000000000004280000034200000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
Selection:
collapsed: false
Time:
collapsed: false
Tool Properties:
collapsed: false
Views:
collapsed: false
Width: 1432
X: 2298
Y: 239
備注:這一塊代碼屬于建立rviz界面中的控件,添加控件屬性,訂閱話題。如下圖左側(cè)的欄目框:

Screenshot from 2019-01-24 11-05-05.png
以上是mbot_navigation功能包三大塊。