我が家ではお掃除ロボットとしてルンバがいたのですが、この度、床水拭きのブラーバくんがやってきました。これを記念してScratchでお掃除ロボットルンバを作ってみようの回です。
2つのルンバくんの動き
さて、ルンバにはランダムに部屋を駆け回る汎用モデルと、自分の位置を把握して地図をつくり規則正しく動く高機能モデルがあります。ランダムな動きをするのがルンバ600シリーズ以下、高機能モデルがルンバ900シリーズ以上といった感じでしょうか。本当にこんな動きなのかはわかりませんが、概ねこんな感じでしょう。
ということで、今回はこの2つのルンバくんをScratchで表現してみたいと思います。
普通のルンバくん(汎用モデル)
普通のルンバくんは、壁にぶつかったら方向を変えてゴミがなくなるまで縦横無尽に走り回ります。この姿を表現したのがこちら
中身を確認したい場合はこちら
スプライトの説明
まず最初はネコがのったルンバのスプライトです。コードの中身はこちら。この特徴は反復処理でずっと4歩動かすとしているのだけど、もし端に触れたら跳ね返るという処理をいれています。この時、単に跳ね返るとすると角度によっては左右に移動するだけの跳ね返りになってしまうため、スプライトを回す角度をランダムに-90度から90度にして不規則な方向に跳ね返るという形を実現してます。ここで、このままだとネコのルンバくんがくるくる回ってしますので、最初に回転方向を回転しないに指定して、常にスプライトの絵は同じ向きを向いているという形にしています。たった、これだけでの処理でルンバの動きが実現できました。
次は埃(ほこり)のスプライトです。これはクローン処理を利用して実現しています。クローン処理はこのブログで何度もでてますよね。確認したい場合は、こちらの記事などをみてください。もぐらたたき、迷路ゲーム(みつばち出現版)
ここでは、300個の埃を画面上にランダムに並べたいので、クローンした時にX,Y座標を乱数でいれることでいろんな場所に散らばる処理をしています。
そして、別途、埃という変数を用意して、ルンバに触れたら-1ずつへらし。クローンを削除するという処理をいれて埃を消しています。
最後は背景の処理です。背景は初期化処理で埃の変数に埃クローンの数300をいれて、埃が0になった、すなわちルンバが全ての埃を掃除したときに、背景をCLEANEDと表示させてプログラムを終了させます。
賢いルンバくん(高機能モデル)
賢いルンバ君は上から下までキレイに秩序だてて掃除をし、端についたら反対側の端に移動して再度、残ったゴミを取るべく上下に移動するというものとなっています。これを表現したのがこちら
中身を確認したい場合はこちら
スプライトの説明
賢いルンバくんは、埃と背景のスプライトは普通のルンバくんと同じです。イヌがのったルンバくんのスプライトだけ処理の内容がかわります。それがこちら。
違う箇所としては同じずっと4ずつ移動させるのだけど端に触れた時の処理が変わります。小学校の掃除時間のぞうきん掛けのように端から端へ上から下へ秩序だった流れで掃除をしたい。この処理を実現するには端にふれた時に、逆方向(上端に触れたら次は下方向、下端にふれたら次は上方向)に動くという処理をいれてやります。それが条件処理の〔端に触れたなら〕かつ〔Y座標が正か負か〕によって、上端にふれたのか下端に触れたのか判定します。そして、上下端に触れたら右にずれるので、徐々にルンバは右に移動するのですが、最後、右端に触れたら、左端へ動くという処理をいれています。これは実質1回しか発動しません。そして普通ルンバと同じように埃が0になったら処理終了です。
まとめ
実際のルンバのアルゴリズムとは違うのかもしれないけれど何となくルンバっぽい動作が作れましたのよね。そして、これをみるとちゃんと賢い方のルンバくんは短時間で効率的に掃除をするので優秀ですね。我が家のルンバくんも最新型に買い替えようかしら。
コメント