![](https://habrastorage.org/files/0c0/0b7/05f/0c00b705f38d4785962d44075c0214e2.jpg)
挑戦する
タスクは、障害物が存在する可能性のある最初は未知の環境で、一連の位置によって定義される軌道に沿って移動することです。 それを解決するには、次のことができる必要があります。
- 障害物マップを作成する
- パスと障害物に対するクアドロコプターの位置を決定する
- 障害物の飛行を考慮して軌道を修正します
- 制御信号の計算-コントローラーの実装
技術ベースはParrot AR.Droneです。 AR.Droneには、興味のある次のデバイスが装備されています。
- フロントカメラ:640x360、30 fps、対角視野角92度
- 下部カメラ:統合された自動操縦で使用され、一般的に風とドリフトを補正します
- 超音波高度センサー:0.25-3 m以内で動作
- ANN(加速度計+ジャイロスコープ+磁力計)+気圧計:すべてのセンサーは、(明らかに)センサーフュージョンを使用して単一のシステムに統合されています
![](https://habrastorage.org/files/928/d44/089/928d44089ec948b68901e77c78be68ab.png)
さらに、ANNと下部チャンバーの測定値に基づいて、単一の走行距離計が形成されます。
したがって、標準のAR.Droneツールを使用して環境マップを構築するには、一般的にフロントカメラのみを使用します。 これは、単眼視のタスク、すなわち単眼SLAMに直接つながります。
大規模直接SLAM
SLAMは、1台のカメラの助けを借りて、現代技術のきしみだと言えるでしょう。 過去数年間に登場したこのようなアルゴリズムは、不注意なフライス盤のオペレーターの指で数えることができます-これらは、ORB SLAM、LSD(Large Scale Direct)SLAM(およびその前身であるSVO(Semi-direct Visual Odometry))、PTAM(Parallel Tracking And Mapping)です。 多かれ少なかれ(高密度)環境マップを構築するアルゴリズムがさらに少なくなります。 最も高度なアルゴリズムのうち、LSD SLAMのみがこのようなカードを発行します。
![](https://habrastorage.org/files/e0a/384/597/e0a384597fe34ce888833cb34c4c84e4.png)
一言で言えば、LSD SLAMは次のように機能します。 並行して、追跡、マップ作成、マップ最適化の3つの手順が機能します。 追跡コンポーネントは、現在のキーフレームに対する新しい各フレームの位置を推定します。 マップ作成コンポーネントは、フレームマップをトリッキーな方法でクリアするか、新しいキーフレームを作成することにより、既知の位置を持つフレームを処理します。 マップ最適化コンポーネントは、キーフレームグラフでサイクルを検索し、浮動スケールの影響を排除します。 開発者の記事でアルゴリズムの詳細を理解できます。
アルゴリズムの安定した効率的な動作のために(これらの要件はすべての単眼SLAMアルゴリズムに適用されます)、以下が必要です。
- 最も正確なカメラキャリブレーションと、その後の画像の修正。 キャリブレーションと整流の精度、および使用される歪みモデルは、結果のカードの品質に直接影響します。
- 広角カメラビュー。 多かれ少なかれ信頼できる操作のために、80-90度以上のFOVを持つカメラが必要です。
- 1秒あたりの十分なフレーム。 FOVが90度の場合、1秒あたりのフレーム数は30(より良い、より多い)以上でなければなりません。
- カメラの動きには、持ち運びをせずにターンを含めないでください。 このような動きはアルゴリズムを破壊します。
段落2と3は、簡単な考慮によって互いに接続されています。2つの隣接するフレーム間の変位を計算するには、これらのフレームの画像が十分に重なり合う必要があります。 したがって、カメラの動きが速いほど、視野角またはフレームレートを大きくして、フレーム間の通信が失われないようにする必要があります。
これらの要件が満たされている場合、LSD SLAMの作成者のビデオを見るとわかるように、非常に高品質のカードを入手できます。
印象的ですね。 ただし、そのような品質のカードを達成したとしても、もう1つの問題が待っています。単一の単眼SLAMアルゴリズムでは、受信したカードの絶対スケール、したがってローカリゼーションを基本的に評価できません。 したがって、いくつかのトリックに頼って、マップオブジェクトのサイズを決定するのに役立つ、またはカメラの動きの絶対値を推定する外部データソースを見つける必要があります。 最初の方法は、想像力によってのみ制限されます:カメラの視野に既知のサイズのオブジェクトを配置し、それをマップの同様の部分の縮尺と比較したり、以前に既知の設定でアルゴリズムを初期化したりすることができます。 2番目の方法は、たとえば高度計データを使用して、非常に簡単に適用できます。
スケールを推定するために、LSD SLAMアルゴリズムとAR.Drone高度計の2つのソースから取得した垂直軸に沿った変位のデータを使用しました。 これらの値の比率は、マップのスケールと単眼システムの位置です。 ランダムな外乱を除去するために、ローパスフィルターで取得したスケール値を取得しました。
障害物回避と経路修正
LSD SLAMは、環境マップを、部分的な深度マップが添付されたキーフレームのグラフの形式で保存します。 グラフのすべてのノードを組み合わせて、環境の既知の部分のマップを点群の形式で取得します。 ただし、これは障害マップではありません! 高密度の障害物マップを取得するために、Octomapライブラリを使用しました。これは、点群に基づいてoctree障害物マップを作成します。
衝突をチェックし、軌道を調整するために、ライブラリFCL(柔軟な衝突ライブラリ)+ OMPL(オープンモーションプランニングライブラリ)のスタックを使用しました。 マップを更新した後、障害物との軌跡の衝突テストが開始されます。衝突の場合、軌跡のセグメントはスケジューラーによって再計算されます(BIT *を使用しましたが、オプションがある場合があります)。
コントローラー
コントローラーは、PIDコントローラーに基づいて非常にシンプルであることが判明しました。 これは軌道をたどるのに十分でした。 追加する必要があるのは、カメラの回転速度を制限してSLAMの安定性を維持することだけでした。
![](https://habrastorage.org/files/b46/23e/31b/b4623e31ba3a4333b2d6008383a1a8ca.png)
プラットフォームおよび一般的なソリューションスキーム
ソリューション全体のプラットフォームとして、ROSを使用しました。 このプラットフォームは、並列動作コンポーネント(ROS用語のノード)の迅速な開発、それらの間の通信、監視、動的構成、優れたGazeboシミュレーターなどに必要なすべてのインフラストラクチャを提供し、本格的なロボットソリューションの開発を促進します。 システムの個々のコンポーネントの安定性にはまだ多くの課題が残されていますが、責任あるプロジェクトの制作に使用する価値はありません。
一般的なソリューションスキームは次のようになりました。
![](https://habrastorage.org/files/53d/b9f/ff8/53db9fff8e264edab899c23755b778ef.png)
結論
蜂蜜の樽:
- 単眼SLAMが試行される可能性があります。
- ROSは、少なくとも開発とテストにとって非常に便利なプラットフォームです。クールなロボットプロジェクトの実装は、ますますシンプルになります。
軟膏で飛ぶ:
- 単眼のSLAMを機能させることは、特にカメラのキャリブレーションに関しては、非常にトリッキーなビジネスです。
参照:
開発者サイトのLSD SLAMページ: vision.in.tum.de/research/vslam/lsdslam
オープンモーションプランニングライブラリ: ompl.kavrakilab.org
フレキシブルコリジョンライブラリ: github.com/flexible-collision-library/fcl
Octomap: octomap.github.io