
繰り返しになりますが、Todのブログはあなたと一緒です。今日も、ROSロボットのオペレーティングシステムのナビゲーションスタックの紹介を続けます。 前の記事でナビゲーションスタックの一般的な説明が行われたこと、ロボットでの使用に必要な要件が特定されたこと、ロボットの動きを制御すること、感覚オドメトリーおよびソナーデータを取得することを考慮したことを思い出してください。 この記事では、ナビゲーションスタックの最も「おいしい」可能性について説明します。ロボットの進路で遭遇する障害を考慮して、地図を作成し、移動の軌跡を計画します。 カットの下では、とりわけ、アパート内のTodロボットのナビゲーションを含むビデオがあります。
Kinect
ロボットで地図を作成するには、プロのレーザー距離計または安価な深度カメラ(KinectまたはASUS Xtion)を使用できます。 おそらく皆さんは、Xbox 360のゲームコントローラーとしてKinectを知っており、そのインタラクティブな機能を拡張していますが、Kinectのおかげでプロのロボット工学がより使いやすくなったことを誰もが知っているわけではありません。 エントリーレベルのレーザー距離計の価格は約1,000ドルですが、Kinectを購入すると150〜200ドルかかります。

上の写真からわかるように、Kinectにはいくつかのタイプのセンサーが装備されており、ロボット工学の分野でいくつかのタスクを一度に解決するのに役立ちます。
- 最大1280x1024の解像度のVGAカメラは、テレプレゼンスシステム、屋内ナビゲーション、ビデオコールで使用できます。
- 深度センサーから受信したデータに基づいて、2次元および3次元マップが構築され、自律航法の他のタスクが実行されます。ロボットにマニピュレーターがあれば、オブジェクトが検索およびキャプチャされます。
- 4つのマイクの配列-音源の定位用(これは別の記事の興味深いトピックです)。
ROSでは、Kinectとの通信は、関連するトピックでいくつかのタイプのメッセージを公開することにより、openni_launchパッケージノードを通じて行われます。 まず、次のトピックに注意を払う必要があります。
- / camera / rgb / image_color-画像としてのRGBカメラのデータ。
- /カメラ/深度/画像-画像形式の深度センサーのデータ。
- /カメラ/深度/ポイント-ポイントの3次元クラウドの形式での深度センサーのデータ。
ナビゲーションスタックでKinectを使用するには、点群データを偽のレーザー2D距離計データに変換する必要があります。つまり、元の点群の水平カットを取得する必要があります。 この問題を解決するために、Turtlebotロボットのスタックにあるパッケージpointcloud_to_laserscanを使用しました。 これは、Kinectタッチデータスライスがsensor_msgs / LaserScanメッセージ形式でどのように見えるかです。

ただし、Kinectには高価なレーザー距離計と比較して、いくつかの欠点があります。 ロボット上のKinectの位置を決定する際には、まずこれらを考慮する必要があります。 主な欠点の1つは、大きなブラインドゾーン(約50 cm)です。 この問題に関する以前の記事でのambikonturからのコメントといくつかの議論の後、Kinectをロボットの背面に近づけることにしました。 これにより、ケース内のほとんどの不感帯を「隠す」ことができました。

したがって、この段階で、Todロボットはナビゲーションに関連する次のタスクを既に実行できます。
- オドメトリデータを受信して、モーションパスを追跡します。
- 線形および角速度形式のロボット移動コマンドを受け入れます。
- 点群形式の感覚ソナーデータを受信します。
- Kinectセンサーデータを2次元レーザー距離計形式で受信します。
このようなシステムに基づいて、より高いレベルのナビゲーションタスクを解決できます。 まず、SLAM(同時ローカリゼーションとマッピング)は、このようなタスクに起因する可能性があります。 SLAMは「鶏と卵」の問題を解決します。一方で、宇宙でのロボットの位置の信頼できる推定には、正確に構築されたマップが必要です。 別の同様に重要なナビゲーションタスクは、移動の軌跡を計画することです。
ROSナビゲーションスタックは、高度なナビゲーションタスクを解決するために設計された3つの主要なパッケージを提供します。
- gmappingは、SLAMアルゴリズム、レーザー距離計データ、走行距離計に基づいて部屋の地図を作成します。
- amclは、既存のマップ上のロボットの位置を決定します。
- move_baseを使用すると、障害物を考慮して、ロボットをマップ上の任意のポイントに移動できます。
次に、各パッケージの機能を詳しく見てみましょう。
マッピング
まず、ROSのマップはPGM形式の通常の画像ファイルであり、各ピクセルは次のようになります。
- 白-スペースは無料です。
- 黒-スペースは障害物で占められています。
- 灰色-スペースはまだロボットによって探索されていません。

gmappingパッケージの一部としてのslam_gmappingノードは、マップの構築を目的としています。 収集された感覚データに基づいて、パッケージで使用されるSLAMアルゴリズムは、各セルに障害物を見つける特定の確率が与えられたグリッドマップを形成します。 新しい感覚データが到着すると、各セルの確率が調整され、その結果、マップの最も信頼性の高い表現が得られます。 gmappingはセンサーデータとして、TodロボットのソースがKinectであるレーザー距離計データと走行距離計データを使用します。
マップを作成するには、キーボードまたはジョイスティックからロボットを制御し、部屋を歩き回り、結果のマップをファイルに保存する必要があります。 使用するレンジファインダーの機能を考慮に入れながら、部屋をあまり速く移動しない方が良いです。 たとえば、Kinectの前には不感帯があります。そのため、地図を作成するときは、壁に近づきすぎないようにしてください。
自宅での戦闘でgmappingパッケージとTodロボットをテストしましたが、これがその結果です。
amcl
amclノードアルゴリズム(Adaptive Monte Carlo Localization)は、たとえばgmappingパッケージを使用して作成された既製のマップで機能します。 このアルゴリズムは、モンテカルロ法と粒子フィルターに基づいてロボットの位置を確率的に決定するために設計されています。
Todロボットは、amclノードへの入力としてレーザー距離計と走行距離計センシングデータを使用します。 開始後、ノードはロボットの初期位置を設定することを想定しています。 これは、たとえばドックからロボットを起動するときに便利です。 ただし、初期位置が指定されていない場合は、マップ座標系の先頭にポイントが割り当てられます。
下の写真でわかるように、地図にはレーザー距離計の現在のデータが壁や障害物に赤い点の形で表示され、ロボット自体は緑の矢印の雲の中にあります。 これらの矢印は、amclノードによって形成された、現時点でのロボットの可能な位置の配列を示しています。 ロボットがマップ内を移動し、新しい感覚データを受信すると、ロボットの位置の不確実性が減少し、このクラウドは小さくなります。

amclノードでは、アルゴリズムの多くのパラメーターを設定できます。 たとえば、パーティクル(パーティクル)の最大数を増やすと、ロボットの位置を決定する精度が向上しますが、同時にCPUの負荷が増加します。
move_base
キーボードからロボットを制御することで、ロボットをマップ上で動かすことができますが、ROSナビゲーションスタックで利用可能なmove_baseパッケージは、ロボットの自律的な移動も可能にします。 地図上にポイントを設定するだけで十分です。ロボットは、ターゲットへの最適なルートを独自に設定します。 タスクの実行中に、ロボットは現在の位置を報告し、ターゲットが何らかの理由で利用できない場合、システムに影響を与えることなくそれをキャンセルします。
グローバルルートは、現在既知の障害を考慮して、目標を設定した直後に構築されます。 ゴールに移動する間、グローバルルートはローカルルートというセグメントに分割されます。 各ローカルルートは、ロボットの適切な直線速度と角速度を設定することにより、着信感覚データを考慮して構築されます。
ターゲットへのロボットの移動経路の性質は、2つのコンポーネントによって決定されます。
- グローバルコストマップ(グローバルコストマップ)-グローバルな移動ルートを構築します。
- ローカルコストマップ(ローカルコストマップ)-最も近いローカル移動ルートを構築します。
コストマップは、現在のルートを正常に完了するために必要なナビゲーション情報を提供します。 コストマップの構成ファイルでは、ロボットの寸法、ルートに沿ったロボットの速度、セグメントの長さ、ルートの更新頻度などが設定されます。
これで、ROSナビゲーションスタックの紹介を終了します。 次の投稿では、トッドにロシア語を理解するように教えます。 ブログを購読-最新情報を入手してください。