/写真
ハリーリー CCIT-GRADは 、人工知能の問題に非常に興味を持っています。 オートパイロット車
のトピック
についてはすでに
触れましたが 、1週間前に、AI分野の科学者や開発者の新しい成果、および懐疑論者の恐怖について
話した資料を公開しました。
今日は、この問題に再び触れ、行動の木とは何か、それらがロボット工学でどのように使用されるか、そして未来があるかどうかについて話します。
特定のアクションを実行するためのロボットのプログラミングは複雑なプロセスです。 マシンはその場で環境に適応する必要があるため、入力変数はしばしば不明です。 標準のロボット制御モデルは有限状態マシン[FSM-有限状態マシン]の形式で開発されましたが、この方法は複雑なアルゴリズムの作成には適していません。モデルの新しい要素が追加されると、その複雑さが急速に増加し始めるためです。
これらの欠点を軽減するために、ビデオゲーム開発者によって広く使用されているアプローチが使用され始めました。 ビヘイビアツリーについてです。 有限状態マシンとは異なり、ツリーはより正式な構造を持っているため、それらを使用すると、マシンの動作を簡単にプログラムできます。
動作ツリー[BT-動作ツリー]は、ノードがロボットの可能な動作である指向性の非循環グラフです。 ツリーの「幅」は使用可能なアクションの数を示し、ブランチの「長さ」はその複雑さを特徴づけます。
4ステートマシン
ステートマシンに対するビヘイビアツリーの利点は何ですか? 有限状態マシンの状態の数が増えると、その
複雑さが急激に増加します。 状態の数がNのFSMの遷移の数は、N *(N-1)に等しくなります。 N = 4の場合、12の可能な遷移が得られます。 もう1つの状態を追加すると、20の遷移があり、もう1つは30です。
いわゆる
階層型 FSMはこの問題を部分的に解決しますが、状態の数が多いと、構造はまだ複雑すぎます。
ステートマシンのアーキテクチャと動作ツリー
「木質」アーキテクチャには、この欠点がありません。 各州のFSMが独自の意思決定ロジックを持っている場合、BTでは、現状のままで限界から除外されます。 これにより、プログラム中でもノードを追加および削除できます。ノードを呼び出す新しいコードを記述するか、古いコードを削除するだけです。
さらに、多数の状態を持つツリーは、小さなサブツリーに分割できます。これにより、「地上の向き」とバグの検索がさらに簡素化されます。
行動ツリーの原理
行動ツリー
の原理BTノード
は、タスクまたは動作
と呼ばれます。 各タスクには4つの状態があります。
- タスクが正常に完了した場合は「成功」。
- 条件が満たされない場合、または何らかの理由でタスクを実行できない場合は、「失敗」。
- タスクが起動され、完了を待機している場合は「進行中」
- プログラムで不明なエラーが発生した場合、「エラー」。
任意のノードの操作の結果は、常に1レベル上の親ノードに送信されます。 ツリーは最上位ノード(ルート)から表示されます。 それから、ツリーの左のブランチから深さ検索が実行されます。 1つのノードに複数のサブタスクがある場合、それらは左から右に実行されます。
ノード間では、アクション、アクションノード、シーケンス実行ノード、パラレルノード、セレクター、条件、インバーターのタイプが区別されます。
アクションは、変数または何らかの動きの記録です。 シーケンスノードは、子ノードのいずれかが値「Failure」、「At work」、または「Error」を表示するまで、各子ノードの動作を交互に実行します。 これが発生しない場合、値「成功」を返します。
パラレルアクションノードは、指定された数のノードが失敗または成功のステータスを返すまで、子ノードの動作を実行します。
セレクターは、子ノードのいずれかが値「成功」、「作業中」、または「エラー」を与えるまで、各子ノードの動作を交互に実行します。 これが発生しない場合、Failureを返します。
条件には、結果を決定する基準と変数が含まれます。 たとえば、「この部屋に人がいますか?」という条件は、部屋内のすべてのオブジェクトを反復処理し、「Person」変数と比較します。 反転ノードは、NOT演算子の機能を実行します。
GitHub
は 、barえる、歩く、他の犬のことをする犬の行動をシミュレートするツリーの実装例を
提供します 。
ツリーはlibGDXコードとして表されます。 libGDXは、CおよびC ++を使用してJavaで記述されたフレームワークです。
# # Dog tree # # Alias definitions import bark:"com.badlogic.gdx.ai.tests.btree.dog.BarkTask" import care:"com.badlogic.gdx.ai.tests.btree.dog.CareTask" import mark:"com.badlogic.gdx.ai.tests.btree.dog.MarkTask" import walk:"com.badlogic.gdx.ai.tests.btree.dog.WalkTask" # Tree definition (note that root is optional) root selector parallel care urgentProb:0.8 alwaysFail com.badlogic.gdx.ai.tests.btree.dog.RestTask # fully qualified task sequence bark times:"uniform,1,3" # the type of attribute times is a IntegerDistribution walk com.badlogic.gdx.ai.tests.btree.dog.BarkTask # fully qualified task mark
ここで犬の行動ツリー図を見つけることができます。 ビヘイビアツリーのもう少し複雑なバージョンが
ここに示されてい
ます 。犬は所有者から呼び出されるまで庭を歩きます。 このモデルはすでにサブツリー呼び出しを使用しています。
ビヘイビアツリーの主な利点は形式です。 一連のツール、テンプレート、および構造を使用して、非常に興味深く、表現力のある動作を実現できます。 これは、コンピューターゲームでの人工知能の実装と小型ロボットの作成で頻繁に選択されるようになったのは、BTだった理由の1つです。
たとえば、オランダのデルフト工科大学の科学者グループは、2台の内蔵カメラを使用して環境データを受信するDelFly Explorerプラットフォームに基づくロボットを
開発しました 。 彼らの
記事の中で、彼らは、ロボットが部屋の中で開いている窓を見つけて、そこに飛び込む実験を説明した。
科学者は人工ニューラルネットワークを放棄することを決定しました。小型ロボットのプラットフォームでは、データの収集と計算の可能性は非常に限られており、さらに、開発されたANNは分析が難しく、手動で構成することが困難です。 代わりに、学習を最適化するための進化的アルゴリズムだけでなく、よりシンプルで理解しやすい構造を持つ動作ツリーが選択されました。
ゲームのテーマについては、ここに例があります。 ビヘイビアツリーは、サンシャインコースト大学の自動車
シミュレーターの 作成に使用され
ました 。 このシミュレータは現在、ドライバーの心理テストに使用されています。
このプロジェクトのビヘイビアツリーは、
Fluent-Behavior-Treeライブラリを使用してC#プログラミング言語で構築されました。 すべてのコードとフローチャートは
ここにあります 。
おわりに
一般に、ビヘイビアツリー
は便利でエレガントな組織構造を
提供しますが、それでも高度な意思決定を実装する可能性はありません。
最新のAIには、質的に複雑で独自の動作を行う複雑なシステムをサポートできるテクノロジーが必要です。 予測不可能なアクションを実行し、開発者が提供していない状況で意思決定を行えるAIが必要です。
これを行うには、より強力なソリューションとアルゴリズムが使用されますが、ロボット装置の計算要件はしばしば満たされないことがあります。 ただし、解決策があります-クラウドロボット工学。 この場合、作業のすべてのロジックはリモートサーバーに保存され、小さなロボットはアクションのコマンドのみを受け取ります。
このようなアプローチは、別の問題を自動的に解決します-電子機械アシスタントをインテリジェントにします。 クラウドに接続すると、ロボットに世界に関するすべての必要な情報が提供されます。 この方向での作業はすでに進行中です。たとえば、有名なロボット研究者であるAndrew Ng
はこれらの問題に
取り組んでいます。
おそらく近い将来、ロボットは無線ネットワークを介して互いにデータとコードの交換を開始するでしょう。
PSHabréのブログからの興味深い資料: