DJI Tello等ドローンの自律飛行を実現するには、3D環境でナビゲーション経路を計画としてOMPL(Open Motion Planning Library)を試してみます。
目次
- OMPLのインストール
- OMPLの基礎
- OMPL.appの入門
- OMPLの使用 ← いまココ
- DJI Telloの使用
- navigationスタックの使い方
- OMPLで3D 経路計画
動作環境
- Ubuntu 18.04
- ROS Melodic
- Tello EDU
OMPLの使用
デザイン考察
- OMPLは柔軟性と適用性を維持ため環境の幾何学とロボットを明確に表現していません。
- ユーザがロボットの表現、stateの有効性、衝突チェックを提供する必要があります。
OMPL 基礎
- StateSampler クラス:
一律とガウスサンプリングの方法を提供する。 - NearestNeighbors クラス:
state区間中のサンプの最近傍検索のインタフェースを提供する。 - StateValidityChecker クラス:
環境の障害物とロボットの制約の衝突構成を評価する。 - MotionValidator クラス:
2つstate間のロボットの行動の有効性をチェックする。 - OptimizationObjective クラス:
コスト付き関連操作のインタフェースを提供する。 - ProblemDefinition クラス:
スタートStateとゴール構成を定義する。
クエリを解決
OMPLのコンポーネント
幾何学計画
ユーザがロボットのstate区間を定義、スタートとゴール構成を提供する必要があります。
計画とコントロール
幾何学計画と同様にロボットのstate区間を定義、スタートとゴール構成を提供する必要があります。
その上、ユーザがControlSpace
オブジェクトで有効なコントロール入力を定義、StatePropagator
インスタンスでコントロールを適用した場合システムStateがどのように変化するのかを計算する方法を提供する必要があります。
サンプルセットアップ
幾何学とコントロールを解決する複数オブジェクトをカプセル化します。サンプルセットアップを使用には、state space, start state, goal stateの情報を設定します。
OMPLを用いたソースのコンパイル
- base libraryを変更した場合
(例:ompl/geometric/plannersに新しいplannerを追加した場合)
cmakeを再度実行
- OMPLをリンクした場合
-lompl のコンパイルオプションでリンク
ベンチマーク
OMPLがパスクエリの回数と複数plannerを試すベンチマーククラスを提供します。
高度な機能
状態空間構造(State Space)
共通状態空間(Rn for Euclideanspaces, SO(2) and SO(3) for the space of rotations in 2D and 3D)を提供します。
プランナーカスタマイズ
OMPLのプランナーをカスタマイズことができます。
例として、PRMとRRTプランナーも最近傍探索をユーザコードに置換できるフックを提供します。
Python バインディング
C++言語以外も、ユーザがPython スクリプトでPython バインディングのAPIを呼び出して行動計画クエリを解決することができます。(Py++ と Boostが必要)
from ompl import base
from ompl import geometric
- An STL vector of int’s is of type vectorInt in Python (analogously for other types)
- The C++ class State has been renamed AbstractState, while the C++ class ScopedState<> iscalled State in Python.
- The C++ class ScopedState is called RealVectorState. The Scoped-State’s for the other pre-defined state spaces have been renamed analogously.
- The C++ class RealVectorStateSpace::StateType has been renamed to RealVectorStateInternal(analogously for the other state space types), to emphasize that a user should really be usingRealVectorState.
- Use the “()” operator on a ScopedState in Python to retrieve a reference to a C++ State.
- The print method (for classes that have one) is mapped to the special python method str,so a C++ call likefoo.print(std::cout)becomesprint fooin python. Similarly,a C++ call likefoo.printSettings(std::cout)becomesprint foo.settings()in python.
- The signature of the state validity checker is changed. In python the state validity checker hasthe following form:
def isStateValid(spaceInformation, state):
returnspaceInformation.satiesfiesBounds(state)
Next: 5.1. DJI Telloのフロントカメラのcamera_calibration
prev: 3. OMPL.appの入門