SLAM建圖的那些事

這一節(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ù)檢索地圖。
  • 訂閱主題
  1. tf(tf / tfMessage)
    需要進(jìn)行激光,基準(zhǔn)和測距的相關(guān)框架轉(zhuǎn)換
  2. scan (sensor_msgs / LaserScan)
    激光掃描從中創(chuàng)建地圖
  • 發(fā)布主題
  1. scan (sensor_msgs / LaserScan)
    激光掃描從中創(chuàng)建地圖
  2. map(nav_msgs / OccupancyGrid)
    從此主題獲取地圖數(shù)據(jù),將其鎖定并定期更新
  3. ?entropy (std_msgs / Float64)
    機(jī)器人姿態(tài)分布的熵的估計值(較高的值表示較大的不確定性)。
  • 服務(wù)
    dynamic_map(nav_msgs / GetMap)
    調(diào)用此服務(wù)以獲取地圖數(shù)據(jù)
  • 必需的tf轉(zhuǎn)換
  1. <傳入激光數(shù)據(jù)的框架> → base_link
    通常是固定值,由robot_state_publisher或tf static_transform_publisher定期廣播。
  2. 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功能包三大塊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容