Top / VstoneMagicを使ってみる / プログラミング / 繰り返し・条件分岐を使った顔認識

2.4. 繰り返しや条件分岐を使った顔認識プログラムの作成

ロボットには、カメラやマイク等のセンシングデバイスが多数備わっていますが、これらを使うプログラムでは「一定時間で入力情報を繰り返し取得する」「取得した入力情報によって処理を分岐する」と言う仕組みが基本となります。これを実現するために、本ソフトウェアでは繰り返しや条件分岐の仕組みを持つ命令ブロックが多数備わっています。本章では、Sotaの顔認識プログラムを参考に、これらの機能の使い方や、プログラムのアルゴリズムについて説明します。

繰り返し機能の使用例

繰り返し機能を持つブロックにはforやwhileなどがあります。繰り返し機能を持つブロックは、メソッドブロックのように「開始」と「終了」の2個で構成され、間に挟んだブロックが繰り返し対称となります。

  • ○ forブロックによる繰り返し

    まずは、forブロックを使ったシンプルな規定回数の繰り返しをしてみましょう。forブロックをmymainのクラスに追加してください。

    image119.png




    まずはブロックの接続を行いましょう。メインメソッドには、mot1、mot2、mot3のサブメソッドがあります。このうちmot2とmot3だけをforのブロックで挟んで繰り返されるようにしましょう。

    既に接続しているブロックを切り離す場合は、切り離すブロックを全て選択し、キーボードのSHIFTキーを押しながら、切り離すブロックの先頭をドラッグしてください。

    image120.png



    切り離したブロックを、forの開始ブロックに接続しましょう。最後に、forブロックをmot1のブロックの後に接続しましょう。

    image121.png

    繰り返し回数は、プロパティウィンドウの「loop」の項目で設定します。項目をクリックすると右端に詳細を開くボタンを表示するので、それをクリックしてください。クリックすると更に別の選択肢を開くボタンを表示するので、それをクリックし、選択肢より「(数値入力)」の表記がある物をクリックしてください。クリックすると、数値を入力する画面が別途開きます。ここで繰り返し回数を入力し、「OK」をクリックしてください。

    image122.png


    ブロックを接続したら、プログラムをビルド・実行してみましょう。mot1が1回、mot2,mot3がそれぞれ2回(数値を書き換えた場合はその回数)実行されたら、正しくプログラムが作成できています。forによるループは、メインメソッド以外にも、動作のサブメソッドなどで「手を?回上げる」など同じ動作を繰り返したい場合などに利用できます。

  • ○ 無限ループ

    「無限ループ」は、名前の通り永続的に処理を繰り返す命令です。先に上げたようなセンサを使ったプログラムなど、特定の条件を除き基本的にプログラムを永続的に実行し続ける仕組みに利用します。先ほどのプログラムのforループを無限ループに置き換えると、ソフトウェアからツールバーの「停止ボタン」をクリックするまで繰り返すプログラムになります。

    それでは、先ほどのプログラムのforループを無限ループに置き換えて実行してみましょう。停止ボタンを押さない限り、プログラムが繰り返されます。

    image123.png





    ループの最中に、特定の条件下で繰り返しを抜ける場合「breakブロック」を使います。ループ中にbreakブロックが実行されると、そこからループの終了のブロックまでジャンプします。ループが二重・三重に使われている場合、一番内側のループに対して機能が働きます。breakブロックは、forループ・無限ループ共に使用でき、forループの場合は、規定回数繰り返していなくてもループを終了します。

    ロボットのプログラミングでのbreakブロックの用途としては、センサを使った無限ループのプログラムで、一定時間・回数センサに反応があった(または無かった)場合にループを抜けるなどの場合に使います。

    image124.png






  • ○ 顔を追跡するプログラムの作成

    繰り返しの機能について一通り理解できたら、無限ループと「顔追跡ブロック」を組み合わせて、顔認識を続けるプログラムを作りましょう。顔追跡ブロックは、カメラで顔を検出すると、ロボットの首を動かして顔の動きを追従するブロックです。首ピッチ軸・首ヨー軸のモータ制御はブロック内で自動的に行われ、これまでのようにポーズを作る必要はありません。またその関係で、首ピッチ軸・首ヨー軸はブロックによって占有されるため、顔追跡中にポーズを実行しても、この2軸は設定したポーズに遷移せず、常に顔の追跡を行います。

    それでは、顔認識ブロックをプログラムに追加しましょう。顔認識ブロックは、メソッドや繰り返しの命令と同様に開始・終了のペアになります。各ブロックは、それぞれ「カメラデバイスの初期化と顔の認識・追跡の開始」、「顔の認識・追跡の終了とカメラデバイスの解放」の役割を持ち、このブロックに挟まれた間だけ、顔追跡が行われます。

    image125.png





    顔追跡ブロックには繰り返し機能が無いため、顔を追跡し続けるには、無限ループやforループとの組み合わせが必要になります。ただし、注意点として、顔追跡ブロックの間に繰り返しのブロックを挟むようにプログラムしてください。顔追跡の初期化・解放は原則として必要な場面で一度だけ行われることを想定していますが、繰り返しに顔追跡を入れると、何度も初期化・解放が行われることになり、動作の安定性や動作速度などに大きく影響するためです。また、同じく顔認識の中に顔認識を入れるなど、機能が重複するような使い方はしないで下さい。

    image126.png


    image127.png

    それでは、無限ループと顔認識を、次のようにつなぎかえてプログラムを実行してみましょう。実行中は、ロボットの体はこれまで通りmot1,mot2のモーションを行いますが、首は独立して動きます。顔認識中の首の動作は、顔が見当たらない場合は周囲を見回し、見つかったらそれを追いかけるような動作をします。また、顔追跡中にポーズブロックを実行すると、首ヨー軸・首ピッチ軸は指定のポーズにならずに追跡を続け、それ以外の関節はポーズの通りに動作します。



    image128.png

    _

条件分岐機能の使用例

条件分岐の機能を持つブロックは、繰り返し等と同様に「開始」「終了」の2個のブロックで構成されますが、更に間に挟めるブロックの接続先(コネクタ)が複数備わっています。各接続先には、それぞれ条件を設定でき、指定した条件が成立した場合にそれぞれの接続先へ進みます。条件は原則として上のものから順番に照合します。複数の条件が成立する場合は、その中から一番上(最初)に成立した条件に進みます。また、一つも成立する条件が無ければ、どの接続先にも進まず、条件分岐の終了側のブロックに進みます。

【条件分岐ブロックの例】
 開始・終了間に複数の接続先(コネクタ)がある。各コネクタに分岐条件を設定でき、条件が成立した接続先のプログラムが実行される。
 条件は必ず最初(上側)から確認され、複数の条件が成立する場合は一番上側の分岐が実行される
image129.png







顔認識に関連するブロックには「顔が見つかったかどうか」「検出した顔の年齢/性別」などの分岐機能を持つものが備わっています。ここではこれらを使って、条件分岐の機能を確認してみたいと思います。

※ 顔認識に関する条件分岐のブロックは、必ず顔追跡(または顔検出)ブロックの間に入れてください。顔追跡(または顔検出)していない状態でこれらのブロックを使うと、プログラムがエラーで実行停止します。







  • ○ 顔が見つかったかどうかを判断するプログラム

    まずは「顔が見つかったか?」ブロックを使って、顔が見つかったどうかで呼び出すモーションメソッドを切り替えるプログラムを作ってみましょう。まずは、ブロックをプログラムに追加してください。ブロックには最初から二つの分岐があります。分岐の上側は顔が見つかった場合、下側は見つからなかった場合です。

    image130.png





    それでは、次の手順でブロックをつなぎかえましょう。

    image131.png

    ブロックの接続が完了したら、プログラムを実行してみましょう。ロボットが顔を認識し続けることで、呼び出すメソッドが切り替わり動作が変わります。ただし、後述の「認識の閾値」設定が高めになっているので、なかなか上側の「顔を認識した場合」の分岐が実行されません。



  • ○ 分岐条件の設定

    分岐条件は、命令ブロックの設定と同じように変更することができます。分岐条件の設定はプロパティウィンドウに表示されないため、ブロックをダブルクリックして分岐条件の設定ダイアログを開きます。

    image132.png





    image133.png

    分岐条件の設定ダイアログでは、分岐条件の追加・削除・入れ替えや、各条件の詳細設定が可能です。ただし、ブロックの種類によって、追加・削除できる分岐条件の数が決まっていたり、条件の入れ替えができない場合があります。条件の詳細設定は、命令ブロックの設定と同じくブロックの種類によって項目が異なります。




          【条件分岐の設定ダイアログ】
          画面左側では、設定する条件の選択、分岐条件の追加・削除や並び順の入れ替えを行う。
          画面右側では、左側で選択した条件の詳細設定を行う。
          ブロックの種類により、条件の追加・削除・入れ替えの可否や、設定項目が異なる。


「顔が見つかったか?」ブロックでは、「連続して何回以上顔が検出されたか」が分岐条件です。無限ループで、「顔が見つかったか?」ブロックを実行するたびに、顔が見つかれば回数を加算、見つからなければ回数を0に戻します。初期値は3に設定されており、3回より多く(つまり4回以上)顔が連続して見つかれば、上側の分岐条件に進みます。現在のプログラムでは、顔が見つからなかった場合のメソッドが長く、1回のループに時間がかかるため、3回連続で顔が検出され上側の分岐に進むまでに時間がかかります。そこで、今回は分岐条件を3から0に変更してみましょう。

image134.png






 条件が0回の場合「(連続で顔が見つかった回数)>0」と言う条件になります(0回より多く、つまり1回以上)。そのため、1回でも顔が見つかれば上側の分岐に進むようになります。ただし、条件分岐の判断が行われるのは、毎ループ開始時の「顔が見つかったか?」ブロックの場所なので、そこからの分岐先でメソッドなどを実行している間は分岐の判断が行われません。

顔認識の条件分岐ブロックには、他にも年齢や性別・笑顔の点数を使った命令があり、認識した顔が男性か女性かによる分岐や、認識した顔の笑顔の度合いと任意の数値とを比較した分岐が可能です。これらを使うことで、より詳細な場合分けを行うことができます。

image135.png




目次  次のページへ>>