好奇心を与える

バナナを見つけて進むのはいいですが、なにもない時に止まっていては自分から見つけることができません。

好奇心を与えてみましょう。なにもない時でもロボットを動かして、好奇心があるかのようなプログラムにします。

オペラント行動

なにもない時に前に進んだり、右に回ったりしてみましょう。

このような自発的な行動を心理学の用語で「オペラント行動」といいます。

退屈なときに人がしてしまう行動や、なんとなーくしてしまう気まぐれな行動のことです。
ロボットもなんとな~く動かして、バナナを見つけたらしっかり前に進むようにすればまるで好奇心があるかのようなロボットを作れます!

プログラム

前回のバナナを見つけて進むプログラムの中で何も見つけていない部分を書き換えてみます。

ここからは関数を使ってみましょう。

関数とは、何個かのブロックを1つのカタマリに出来る機能です。
それができると、ある動きだけ1つのカタマリにすることができるので、プログラムがスッキリします。

「関数」のなかから「宛先「なにかして下さい」」というのがあるので、それを持ってきておきます。
これが関数で、この中にブロックを入れていくことができます。
そして「なにかして下さい」というのは関数の名前になっています。これを変えてみましょう。
今回はオペラント行動に関するプログラムをここに入れたいので、「operant」とします。

すると、「関数」のなかに「operant」という小さなブロックができます。
このブロックを実行すると、なんとoperant関数に入れたブロックが実行されるという仕組みです!

operant関数にオペラント行動のプログラムを入れるとして、このちいさなoperantブロックをバナナもかぼちゃのおばけも見つけられなかった時に入れてみましょう。

こうすると、何も見つからなかった時にoperant関数の中が実行されます。
ここに気まぐれな動きを入れてみましょう。

きまぐれな動き

コンピューターは適当が苦手です。
指示通りに動くように作られているので指示がないことが苦手なのです。

なんとなく前に進んだり、なんとなく右に回る動きをしたいのですが、どうしたらいいのでしょう。

「計算」の中に「ランダムな数字」というブロックがあります。

この丸いブロックはときには1になり、ときには50になったりと、その都度ごとに違う数字に変化するブロックです。

これは適当な動きを作るには便利です!
たとえば、1のときだけ真っすぐ進んでそれ以外は右に回る とすればすごく時々真っすぐ進むことができます。
50以下ならまっすぐ、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 elseif="1" else="1"></mutation>
                    <value name="IF0">
                      <shadow type="logic_boolean" id="~/Y]V0sB63NH2A2~}:!]">
                        <field name="BOOL">TRUE</field>
                      </shadow>
                      <block type="obniz_ai_classify" id="{bug.It,@;!EA{5#(6q(">
                        <field name="text">banana</field>
                      </block>
                    </value>
                    <statement name="DO0">
                      <block type="obniz_parts_airobotkit_move" id="`B7Z)n*jzTK*6FzYC~2p">
                        <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
                        <field name="flag">forward</field>
                      </block>
                    </statement>
                    <value name="IF1">
                      <block type="obniz_ai_classify" id="~vt,MPg[OXot+LLOiq@2">
                        <field name="text">jack-o</field>
                      </block>
                    </value>
                    <statement name="DO1">
                      <block type="obniz_parts_airobotkit_move" id=":{qU7Bp_GApU?y+qRqbE">
                        <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
                        <field name="flag">back</field>
                      </block>
                    </statement>
                    <statement name="ELSE">
                      <block type="procedures_callnoreturn" id="{5,N+HVR6cvdFYF8hgOU">
                        <mutation name="operant"></mutation>
                        <field name="NAME">operant</field>
                      </block>
                    </statement>
                  </block>
                </statement>
              </block>
            </next>
          </block>
        </next>
      </block>
    </next>
  </block>
  <block type="procedures_defnoreturn" id="D6`J?$X%R]dCkn`-)t;3" x="153" y="837">
    <field name="NAME">operant</field>
    <field name="PARAMS"></field>
    <comment pinned="false" h="120" w="160">この関数の説明…</comment>
    <statement name="STACK">
      <block type="controls_if" id="$lP)3e}!?yl$cj!M*z$p">
        <mutation else="1"></mutation>
        <value name="IF0">
          <shadow type="logic_boolean" id="H3~#8}mQR~8-t:CoKx-)">
            <field name="BOOL">TRUE</field>
          </shadow>
          <block type="logic_compare" id="dx|nZq]0%dc=N@hdPyX`">
            <field name="OP">LT</field>
            <value name="A">
              <shadow type="math_number" id="2C|w?R4E8e`mKWr5a^$e">
                <field name="NUM">10</field>
              </shadow>
              <block type="math_random_int" id=":x;Uy5(gLx8R7{_m%UAO">
                <value name="FROM">
                  <shadow type="math_number" id="f}s+CBQ|1juBVC[*wL~v">
                    <field name="NUM">1</field>
                  </shadow>
                </value>
                <value name="TO">
                  <shadow type="math_number" id="T:W_@rXYfNujeC=j+g9q">
                    <field name="NUM">100</field>
                  </shadow>
                </value>
              </block>
            </value>
            <value name="B">
              <shadow type="math_number" id="_q~;BmDpI21wAV)Qqx4z">
                <field name="NUM">50</field>
              </shadow>
            </value>
          </block>
        </value>
        <statement name="DO0">
          <block type="obniz_parts_airobotkit_move" id="dyD7n|-grGkq_*B)uq=u">
            <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
            <field name="flag">forward</field>
          </block>
        </statement>
        <statement name="ELSE">
          <block type="obniz_parts_airobotkit_turn" id="y!jiV~T81(!p?j+3Xsdz">
            <field name="AIRobotKit" id="Jk=/mw~HxfZs@VDVmFYY" variabletype="airobotkit">airobotkit</field>
            <field name="flag">right</field>
          </block>
        </statement>
        <next>
          <block type="obniz_util_wait" id="P44p4(c5CV0m?n1g#eQP">
            <value name="time">
              <shadow type="math_number" id="v.PK4Y](Zh4wAVu?,A?[">
                <field name="NUM">500</field>
              </shadow>
            </value>
          </block>
        </next>
      </block>
    </statement>
  </block>
</xml>

これを実行することで、なにもないときでもぐるぐる回ったり真っすぐ進んだりとランダムな動きをします。まるで何かを探しているみたいですね!

バナナを探す

バナナを見つけたら真っ直ぐ進むので、ちょっとバナナを置いて実験してみましょう。

見つけられるようにもう少しゆっくり動いたほうがいいですね。

オペラント行動のときの動きをモーターの強さが変えられるブロックにしてみます。
40や50など少し小さめの値にして直進と回転させます。

動かしてみると同じく適当に動きますが、さっきと違ってバナナを見つけることが少し簡単になりました。
気まぐれですので、バナナのある方に偶然行ったときだけ見つけることができます。

見つけやすくする方法

ランダムであればこれで良いですが、「バナナを探す」というミッションのための動きであれば、もっと賢くすることができます。

ここからは発展なので、いろいろと試してみて下さい。

例えば、バナナが近くに間違いなくあるとわかっている場合は、あまり遠くに行かないほうがみつけられます。

または、円を描きながらだんだん遠くに行くような動きもいいですね。

アイディアはたくさんあると思います。モーターの速度を変えるだけで見つけやすくなるはずです。色々挑戦してみて下さい



Next : Avoid obstacles

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