ロボットを使った地図の作成

9581 ワード

ロボットを使った地図の作成
発表時間:2016年11月04日11:40:53    ブラウズ数:1013回    来源:Kaka Blog
rosbagは、新しいアルゴリズムをデバッグする際に非常に役立つツールであるmessageをしばらく録画することができます.バグを迅速に分離するのに役立ちます.
rosbag
rosbagは、新しいアルゴリズムをデバッグする際に非常に役立つツールであるmessageをしばらく録画することができます.バグを迅速に分離するのに役立ちます.(同じデータはアルゴリズムの改良後の効果を比較しやすい)
メッセージを録画するときはrecord関数の後ろにtopicの名前を付けることができます.例えば、すべてのscanとtf topicを録画するには、
rosbag record scan tf

YYYY_というフォーマットが生成されますMM_DD_HH_mm_ss.bag、時間は録画を開始する時間で、このフォーマットの名前を生成したくない場合は2つの方法があります.
rosbag record -O foo.bag scan tf
rosbag record -o foo scan tf

1番目の名前はfoo.bag 2 2番目のフォーマットはfoo_YY_MM_DD_HH_mm_ss.bagです-aパラメータですべてのtopicを録画します
rosbag record -a

Ctrl+Cを入力して録画を停止します.再生速度の速さなどを制御できるパラメータがあります.
使用方法
rosbag play --clock foo.bag

これによりfoo.bagレコードのtopic messagesが再生され、複数のbagを指定すると順番に再生されます.--clockパラメータはtopicに録画時のclockをパブリッシュさせる.これは地図を構築する際に非常に重要です.
注意:clockパラメータはrosbag再生時に当時のclockをパブリッシュし、他のtopicパブリッシュメッセージが同時に存在する場合、Gazeboシミュレータでは2つの異なるclockがあり、地図を構築する際に時間がジャンプして発生し、構築地の計算が混乱する可能性があります.
したがってrosbagの–clockパラメータを使用すると、他のノードがtopicをパブリッシュしていないことを確認します.簡単な方法は、すべてのシミュレータをオフにすることです.の
bagファイルの情報を表示できます.
rosbag info foo.bag

録画時間やtopicの録画情報が表示されます.
地図を作成
地図を構築するgmappingパッケージのslam_gmappingノード、アルゴリズムはRao-Blackwellized(粒子確率仮定密度アルゴリズム)で、ロボットの追跡位置を維持します.
まず、地図を構築するデータを生成します.世界を移動してロボットを動かしてデータを得ることができますが、ここでは別の方法を採用し、rosbagで運転ロボットが格納したデータを保存し、slam_を再生します.gmappingは私たちのために地図を構築します.これは私たちのslamをgmappingノードは毎回良い地図を得て、毎回車を操作して歩く必要はありません.
まず、シミュレータを起動します.
roslaunch turtlebot_stage turtlebot_in_stage.launch

ステージロボットをrvizで起動しました
キーボードで制御し、書き上げたlaunchファイルを起動します.
roslaunch turtlebot_teleop keyboard_teleop.launch

センサー情報を収集する必要がありますgmappingは地図を構築するにはlaserとodometryシステムが必要で、odometryはtfで報告して、私はすでに/scanと/tfを購読しました
rosbag record -O data.bag /scan /tf

今はロボットを運転して歩くことができますが、面倒で、私のところはナビゲーション機能で歩いています..録画が完了したらCtrl+Cで録画を停止し、rosbag info data.bagで録画情報を見ることができます
シミュレータがパブリッシュしたレーザデータと再生する競合のため、地図を構築する前にシミュレータをオフにします.地図を構築しroscoreを起動し、別のtermianlでROSに録画したbagファイルを使用してslam_を起動するように伝えます.gmappingノード
rosparam set use_sim_time true
rosrun gmapping slam_gmapping

レーザtopicがscanと呼ばない場合は、再マッピングが必要です.メッセージの再生を開始します
rosbag play --clock data.bag

これはslamですgmappingは、再生が完了するとslam_を出力する必要があります.gmappingも出力を停止します.地図も構築されました.地図を保存し、slamを止めないでください.gmapping運転:
rosrun map_server map_saver

ハードディスク(HDD)にmap.pgmmap.yamlが格納され、画像が開きます.
カーブの壁面がずれている場合、地図が悪いのは、センサーが地図をうまく作成できないためです.slam_gmappingは/scanメッセージを期待し、turtlebotにはレーザ測距計がなく、彼が使っているデータはMicrosoft Kinectセンサで合成されている.問題は、偽のレーザ測距計が一般のレーザ測距計に比べて範囲が狭く、slam_gmappingはレーザデータを用いてrobotがどのように移動するかを推定し,誤差を補正するマイルメータがないため効果が悪い.(現実的には3 dcameraでレーザデータをシミュレートすることもでき、例 クリックジャンプ )
いくつかのgmappingパラメータを設定してmappingの品質を改善することができます.
rosparam set /slam_gmapping/angularUpdate 0.1
rosparam set /slam_gmapping/linearUpdate 0.1
rosparam set /slam_gmapping/lskip 10
rosparam set /slam_gmapping/xmax 10
rosparam set /slam_gmapping/xmin -10
rosparam set /slam_gmapping/ymax 10
rosparam set /slam_gmapping/ymin -10

gmappingパラメータの紹介:

   //laser topic  ,       topic   
  //         //      //  slam       
    
    //         ,  scanmatch   ,      scanmach   ,  scanmatch      ,            //set maxUrange < maximum range of the real sensor <= maxRange
    
    
    
    optimize         (  )    //optimize         (  )    //icp         
    
    // 0,          ,     ,        ,    1    //   ,  scanmatch       ,      scanmatch  ,              //                    
    
    
    //     linearUpdate  ,  scanmatch    
         angularUpdate  ,  scanmatch    
    
    
    //   ,      
    //map          
    
    
    
    
    
    
    
    
  

重要なパラメータの説明:1.particles(int,default:30)gmappingアルゴリズムの粒子数、gmappingは粒子フィルタリングアルゴリズムを使用しているため、粒子は絶えず反復的に更新されているので、適切な粒子数を選択することで、アルゴリズムが比較的正確であることを保証しながら高い速度を持つことができる.
minimumScore(float,default:0.0)最小マッチングスコア、このパラメータは重要であり、レーザに対する信頼性を決定し、高いほどレーザマッチングアルゴリズムに対する要求が高くなり、レーザのマッチングも失敗しやすくなり、マイルメーターデータを使用することに移行し、低すぎると地図に大量のノイズが発生するため、バランス調整が必要となる.品質を改善するには、ロボットをゆっくり運転する必要があります.特にロボットが曲がるときです.gmappingを起動する前に上のパラメータを設定すると、比較的良い地図が得られます.パラメータがslam_gmappingにどのように影響するかに注意してください.同じbagファイルを2回使用して、地図を構築する効果の比較を見ることができます.異なるパラメータを変更して、それから同じbagを比較して、適切な効果を見つけます.
MapServerを起動し、mapを表示
rosrun map_server map_server map.yaml

map.yamlは私たちがさっき保存したmapファイルで、map serverを実行すると2つのtopic、mapと  map_metadata、mapリリースのmessagesタイプは  nav_msgs/OccupancyGridはmapそのものに対応する.map_metadata発行messagesタイプはnav_msgs/MapMetaDataであり、YAMLファイルに対応する
$ rostopic echo /map_metadata
map_load_time:
  secs: 0
  nsecs:         0
resolution: 0.0500000007451
width: 4000
height: 4000
origin:
  position:
    x: -100.0
    y: -100.0
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: 0.0
    w: 1.0

4000*4000個の格子があり、各格子は5 cmで、下は座標系の円点の位置と角度で、rvizで見ることができ、以下のフォーマットのコマンドを使用することができます.
roscd mapping/maps
rosrun map_server mapserver willow.yaml

つまり地図のあるyamlファイルディレクトリに切り替えてmapserverを実行しrvizを起動すると地図が表示されます
rviz rviz

mapメッセージを傍受することに注意してください.これで地図がrvizに表示されます.