人を追いかける

obnizのブロックプログラムでは人が左の方にいるのか、右の方にいるのかも分かります。

それを使えば、人間を追いかけるロボットも作れます。やってみましょう。

追いかける とはどうやるのか

人がいればまっすぐ進めばいいだけです。

でも、人が少し右にいたら?右に動きたいですよね。

「人がいる方向に動く」ことで人を追いかけることができます。

そのためには、人の位置(カメラに写っている顔の位置)がわからないといけません。
そしてその位置を元にモーターの動きを変えないといけません

人の位置

顔が写っている時にその場所を知るには「顔の位置」ブロックを使います。

このブロックは左右どちらの方に顔が写っているかを数字で答えてくれます。
右に行くほど大きくなるのですが、
一番左が-100で中央が0、そして一番右が100となります。
なので、中央より少し右の方ですと10とか20とかになります。

これをつかって人を追いかけてみましょう。

どのように動かすか。

動きを3つに分けてみましょう。

  1. 左の方にいたら左に進む
  2. まんなかあたりにいたらそのまま真っすぐ進む
  3. 右の方にいたら右に進む

「顔の位置」ブロックで場所がわかるようになりました。
-100から100ですから、これを3つに分けることにします。
-100から-50は、かなり左の方に顔があるので「左に進む」にします。
-50から50は、だいたい真ん中に顔があるので「まっすぐすすむ」にします。
50から100は「右に進む」ことにします。

ブロックプログラム

まずは、顔が写っているかどうかをループでチェックします。
写っていなかったら止まっていてほしいので、止めるブロックを置きます。

するとこのようになります。

問題はここからです。
この「顔が写っていたら」のなかで顔の位置で動きを変えたいです。

まず、顔が右の方だった場合を作ってみましょう。
「もしも」ブロックを持ってきます。そしてもしもの条件に「論理」にある数字を比較するためのブロックを持ってきます。このようなやつです。

これは2つの数字を比較します。10 = 10というのは正しいので、もしもの中にあるブロックが実行されます。

ここに「顔に位置」を入れます。
そして、等号(=)だったものを不等号(>)にします。数字も10ではなく50にしましょう。

これはどういう意味でしょう。
カメラに写っている顔の位置が「顔の位置」ブロックに入ります。
そしてそれが50よりも大きかったら 正しい ということになります。

つまりこれをつかって「もしも」ブロックを作れば顔が右の方にあるということが分かります!
このようにすればOKです。

右だけじゃなく左にある場合も追加しましょう。
もしもブロックの左下にあるプラスを押して条件を増やし、今度は-50より小さかったら という条件にします。そして、どちらでもない「他」も用意します。他ということは、顔が-50から50のだいたい真ん中にあるということです。

モーターの出力変更

カメラで右や左に人がいるとわかったとして、
まっすぐでも回転でもなく、ゆっくり右や左に回るにはどうしたらいいでしょうか。

「モーター回転」というブロックがあります。このブロックではモーターのパワーを数字を使って変えることができます。

そして左右別々の値を設定することができます。

これを使えば右のモーターだけ少し弱くすることもできます。
そうするとゆっくりと右に進むことになります。

これを使って、顔が右の方にあるときは右モーターを少し弱くして右に勧めて、左のときは左を弱めてみましょう。

そしてどちらでもないときは同じパワーでモーターを回してみましょう。

このようになります。

さぁ!完成です!
あとはこのもしもブロックを「カメラに顔が写っていたら」の中に入れれば完成です!

<!-- Block Program Example -->
<xml xmlns="http://www.w3.org/1999/xhtml">
  <variables>
    <variable type="obniz" id="X2:3=S(hsdv0mk{aavHW">obniz</variable>
    <variable type="UIButton" id="80uQ37Yg!_RM@zbm[`cF">button</variable>
    <variable type="UIButton" id="#7$4fAkr(P%;.%JaKIy`">backbutton</variable>
    <variable type="UIButton" id="akidXEU*0XQ}VT^!o6Sp">rightbutton</variable>
    <variable type="UIButton" id="KBvD*sLV+fD7(ieEkq5x">leftbutton</variable>
    <variable type="" id="hpvY$6K[tgY$$/L_8%xc">count</variable>
    <variable type="dcmotor" id="V?6USN(jVhQ,P{82]/*M">dcmotor</variable>
    <variable type="airobotkit" id="Jk=/mw~HxfZs@VDVmFYY">airobotkit</variable>
    <variable type="led" id="!MAt1@Dsy)#f.p,K@;=%">led</variable>
  </variables>
  <block type="obniz_connect" id="Z8!^LPO*[5?q{e*57()u" x="154" y="225">
    <field name="obniz" id="X2:3=S(hsdv0mk{aavHW" variabletype="obniz">obniz</field>
    <value name="obniz_id">
      <shadow type="text" id="XmI_$os3vVOeQ~scg106">
        <field name="TEXT">OBNIZ_ID_HERE</field>
      </shadow>
    </value>
    <next>
      <block type="obniz_parts_airobotkit_wired" id="Z|2}f3PXkYzz)24$KZ.9">
        <field name="obniz" id="X2:3=S(hsdv0mk{aavHW" variabletype="obniz">obniz</field>
        <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
        <next>
          <block type="obniz_ai_camera_start" id="}_Jnf^Ml:ymM4qw~6?SQ">
            <next>
              <block type="obniz_util_repeat" id="9lu9Z1ZCks18R6J`^jq{">
                <statement name="DO">
                  <block type="controls_if" id="!/V})r$xUelMg[uMK;8V">
                    <mutation else="1"></mutation>
                    <value name="IF0">
                      <shadow type="logic_boolean" id="~/Y]V0sB63NH2A2~}:!]">
                        <field name="BOOL">TRUE</field>
                      </shadow>
                      <block type="obniz_ai_face" id="$@ci;u+%z,[ea4Y/LN)O"></block>
                    </value>
                    <statement name="DO0">
                      <block type="controls_if" id="bW8#T-9)Et,Q=fTLjHT3">
                        <mutation elseif="1" else="1"></mutation>
                        <value name="IF0">
                          <shadow type="logic_boolean" id=";0O==ii2y|%isNbC948t">
                            <field name="BOOL">TRUE</field>
                          </shadow>
                          <block type="logic_compare" id="KQ|3A3It0v?F!^GlDO([">
                            <field name="OP">GT</field>
                            <value name="A">
                              <shadow type="math_number" id="WT,6C]6yuZQ-GhZ}1={u">
                                <field name="NUM">10</field>
                              </shadow>
                              <block type="obniz_ai_faceposition" id="mY/QuV5_CC_0#-Vc:f#%"></block>
                            </value>
                            <value name="B">
                              <shadow type="math_number" id="ac(ysY6Wu4lgC]qLyw{2">
                                <field name="NUM">50</field>
                              </shadow>
                            </value>
                          </block>
                        </value>
                        <statement name="DO0">
                          <block type="obniz_parts_airobotkit_motor" id="*/EQ9Rzr}[.pc~r8n~Rd">
                            <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
                            <value name="leftpower">
                              <shadow type="math_number" id="5RNA]eoMs[6,7sWAOYM8">
                                <field name="NUM">60</field>
                              </shadow>
                            </value>
                            <value name="rightpower">
                              <shadow type="math_number" id="aM.]zCX1Ai$Q%;k=kOL$">
                                <field name="NUM">40</field>
                              </shadow>
                            </value>
                          </block>
                        </statement>
                        <value name="IF1">
                          <block type="logic_compare" id="aX_LTOR=F|W]L(P/aoLp">
                            <field name="OP">LT</field>
                            <value name="A">
                              <shadow type="math_number" id="V9ZY6n1XrRoXVb,WKk5i">
                                <field name="NUM">10</field>
                              </shadow>
                              <block type="obniz_ai_faceposition" id="oPFNmv?!ijR_1Q|[[/Ww"></block>
                            </value>
                            <value name="B">
                              <shadow type="math_number" id="=y?XST4fY3C*p:l@7,qO">
                                <field name="NUM">-50</field>
                              </shadow>
                            </value>
                          </block>
                        </value>
                        <statement name="DO1">
                          <block type="obniz_parts_airobotkit_motor" id="-;KCAlmLU4ga(|vvQPkl">
                            <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
                            <value name="leftpower">
                              <shadow type="math_number" id="k,r@]}|:pvB9YpS~ZB#o">
                                <field name="NUM">40</field>
                              </shadow>
                            </value>
                            <value name="rightpower">
                              <shadow type="math_number" id="#nJQr7MJ(_i`GSY3]Doc">
                                <field name="NUM">60</field>
                              </shadow>
                            </value>
                          </block>
                        </statement>
                        <statement name="ELSE">
                          <block type="obniz_parts_airobotkit_motor" id="JkKeSy@F)Gh-0Ef3(;NQ">
                            <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
                            <value name="leftpower">
                              <shadow type="math_number" id="O*eaIt0:Rpeq)bTtM-a[">
                                <field name="NUM">60</field>
                              </shadow>
                            </value>
                            <value name="rightpower">
                              <shadow type="math_number" id="Ww+rGzP8-h)gP8CRS~dV">
                                <field name="NUM">60</field>
                              </shadow>
                            </value>
                          </block>
                        </statement>
                      </block>
                    </statement>
                    <statement name="ELSE">
                      <block type="obniz_parts_airobotkit_stop" id="GX@x*CB7znMZ;)MLNky]">
                        <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
                      </block>
                    </statement>
                  </block>
                </statement>
              </block>
            </next>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>

動かしてみましょう。

この下の動画のように顔をきちんと追いかけてくると思います。



Next : Detect a banana

You will Get in Few Days

Circuit for Starter “obniz Board” is available on Amazon and other online stores.
You can get it at below

Our products and resellers

Forum

Visit our developer’s forum to discuss and discover technologies.

Forum

Contact

Feel free to contact out support and technical team.

Contact us