MakeXとは、Makeblock社のロボットDIYプラットフォームで作ったロボットをプログラミングするなどして、様々なタスクを競いあうロボットコンテストです。毎年12月、中国の深センや広州などで世界大会が開催されており、その予選大会が全世界で行われています。日本でも、2018年から開催されるようになりました。

参考記事:MakeblockのロボコンMakeXとは?

 今回は、そのMakeX2018のタスクの一つである「mBotと障害物の距離と同じ長さを走行させる」というプログラムにチャレンジします。
 全く同じではありませんがMakeX2019にも同じようなタスクがありますし、mBotを使ったロボットプログラミングの基礎を終えた後に、応用として取り組める内容かなと思います。

参考記事:2018MakeX スターター部門タスク解説
参考記事:2019MakeX テーマ・開催概要

実現したいコトをイメージして、その要素を分解する

 ロボットプログラミングをすなら、ある程度、動かし方とかを学んだあとは、誰かにこうしろと言われたり、プログラムサンプルを見てただ動かして終わり。。みたいなものだと、非常にもったいないですよね。
 
 自分が実現したい動作をイメージして、その為にはどのようなプログラム要素やセンサー・モーターが必要なのか、イメ―ジを分解し、分解した要素を一つ一つ検証して、その要素を一つにまとめて、完成させるというプロセスが、自発的に出来るようになることが、重要かなと思います。これ、子供・大人関係なく、ロボットプログラミングだけじゃなく、実社会を生きていくうえで、重要なスキルですよね。

1、実現したいことをイメージし、言葉に置き換える 

 という事で、まずは、実現したいことを具体的にイメージしましょう!こちらは、2018MakeXのタスクのデモンストレーション動画です。

 このデモンストレーション動画を見れば、実現したいことのイメージはすぐにつかめますよね。
 予めタスクが具体的に提示されているような場合は、これでいいのですが、例えば、何か自分で考えた動作をロボットに行わせたい場合、頭でイメージしたら、言葉にすることが必要だと思います。言葉にすることで、具体的にどうしたいのかが、自分の中でも整理できます。

 上の動画は、例えば、言葉にするとこういう事ですね。

「まずはmBot1が、障害物Aとの距離を測定。測定した距離と同じ距離になるように障害物Bを移動させる。移動させた後、今度はmBot2が障害物Bとの距離を測定し、障害物Cを障害物Aの距離と同じ距離に移動させる」

 実生活でも、自分が何かやりたいとき、人に協力を依頼する時も、具体的にして欲しいことを説明した方が、円滑にコミュニケーションをとることが出来ますよね。あー、これは社会人でも必要だよ。

2、実現したいことを細かい要素に分解する

 さて、そのあとすぐにプログラミングに取り組むという積極性も必要ですが、その前に、実現したいことを、細かく分解して、より具体的に何をしなければいけないかを整理する必要があります。
今回のタスクの場合、主に以下の4つに分けることが出来ます。

1、距離を測定する
2、mBotの向きを変える
3、mBotを前進させて障害物を移動させ、その後、mBotを元の位置に戻す
4、mBot1からmBot2へ合図を送る

この4つの要素を実現するためには、各要素ごとにさらに細かく検証する必要があります。

1、距離を測定する

 mBotの超音波センサーでは、障害物との距離を測ることが可能です。超音波センサーからは、障害物との距離が4㎝~400㎝の値で出力されます。
 これは、スペックで謳われていることですが、本当にそうなのか、まずは、実際に検証する所からやってみましょう。
 まずは、超音波センサーの検出データをPC上のmBlock5のスプライトに言わせて、実際の距離とあっているか、確認してみます。

 mBotとPCのmBlock5を接続させた後、以下のようなプログラムをアップロードして実行してみましょう。

mBlock5_超音波センサー距離測定プログラムの画像
スプライトは、mBotから送信されたデータを言わせるプログラムを作ります。

mBlock5_測定距離をスプライトに言わせるプログラムの画像
 

※mBlock3とmBlock5で、スプライトにセンサーデータを言わせるプログラムは変わります。
mBlock3では、スプライト(PCのパンダ)とデバイス(mBot)で使えるブロックパレットは同じでしたが、mBlock5では、スプライトとデバイスが別々になっています。
 従いまして、デバイス(mBot)で検出したデータをスプライトに言わせるような連携動作をさせたい場合は、「メッセージ」機能を使う必要があります。
 但し、mBlock5の標準のメッセージ機能には、mBotのセンサーデータを送る機能がありません。そこで、「アップロードモードのブロードキャスト」という機能拡張ブロックを、デバイス(mBot)とスプライト(PC上のmBlock5)に追加する必要があります。↓の動画をご参照ください。

 これで、超音波センサーで測定した距離をスプライトに言わせることが出来ます。次に、スプライトが表示している超音波センサーの検出距離が、実際の距離とあっているかどうかを確認してみましょう。こんな感じにメジャーを用意します。

MaleX超音波センサー距離測定画像

■メジャーと超音波センサーでの距離測定実測結果

障害物の遠さ メジャーで測った距離 超音波センサーで測定した距離
近い 11㎝ 10.89㎝
真ん中 21㎝ 21.07㎝
遠い 31㎝ 31.07㎝

 この通り、超音波センサー測定距離とメジャーの測定距離は、ほぼ一緒になりましたので、距離の区別がしっかりできる事が確認できました。
 実際にタスクをクリアするプログラムにするには、「もし、超音波センサーの距離が○○ならば、mBotを○○の速さで■■秒動かす」というようなブロックを組み合わせていけば出来そうですね。

ちなみに、mBotで使われている超音波センサーの原理については、こちらの記事を参照してみてください。

参考記事:超音波センサーで衝突回避プログラム

2、mBotの向き方向を変更する

 距離を測定した後は、mBotの向きを変える必要があります。mBotの向きを、思った通りの角度に回転させて変える方法の一つとしては、時間と速さを調整して制御することが考えられます。

私の場合は、↓のようなブロックで90度右回転が出来ました。

mBlock5_回転制御
 この速さと時間で制御する方法は、mBotのバッテリ残量やタイヤの状態などの要因でそれぞれ異なります。皆さんの場合は、また違った数値設定にする必要がありますので、それはmBotを動かしながら、試行錯誤して最適な数値(パラメータ)を探していく必要があるんですねえ。
 他の人がネットにアップしているサンプルプログラムをそのまま使っても、自分のmBotがきれいに動くとは限りません。これが、実物のロボットをプログラムする醍醐味ですね。

参考記事:mBotを自立走行させる

 尚、距離測定の場合は、センサーデータをスプライトに送るために、アップロードモードで実行しました。
 今回は、mBotとスプライトを連携させる必要はなく、プログラムの数値を変えながら、mBotの走行の為に最適なパラメータを探し当てるだけなので、いちいちプログラムをアップロードせず、接続モード(アップロードモードじゃない方)にして、PCからプログラム実行をするのがお勧めです。この場合、mBotのファームウェアは、一度最新バージョンにアップデートしておきましょう。

なんて、やり方も、もしかしたら、できるかもしれません。(未検証なので、出来ないかもしれません、是非皆さんでも試してみてください)

3、前進させて障害物を移動させた後、元の場所に後退

 回転させた後は、mBotの前進させて障害物Bを移動させ、その後、mBotをもとのエリアに後退させる必要があります。
 その場合に、検知した障害物Aとの距離に応じて、前進する距離を変更させる必要がありますので、近い・中くらい・遠いの3段階のmBot移動距離を実現するために、それぞれmBotをどのくらいの速さで何秒前進させなければならないのか?を試行錯誤する必要があります。

mBlock5_距離測定後のmBot走行距離制御

 私の場合は、↑のようなパラーメータで制御することが出来ました。速さが50%だと、mBotが接したときに、障害物Bがはじいてしまったので、少しゆっくり移動させるように30%にしました。

 ちなみに、mBotがきれいにまっすぐ進むために、ラインフォロワーかRGBラインフォロワーを使って、白線に沿わせることも可能ですよね。

参考記事:mBotのライントレースセンサを使って自動運転

4、IR通信で、mBot1からmBot2に合図を送る

 mBotには、赤外線(IR)送受信器が、ついています。mBotのブロックパレットの、「センサー」の部分に以下のブロックがあります。

ブロックパレット_赤外線メッセージ 画像 

 mBotが、後退し終えたら、赤外線メッセージを送るとすれば良いでしょう。受信側のmBotには、↓のブロックのように、赤外線メッセージを受け取るまで待つとして、その後に、障害物の距離検知以降のプログラムを実行をすればよいでしょう。

 赤外線メッセージ_受信側ブロック

 2台のmBotを赤外線メッセージでやり取りさせる方法に関しては、以下の記事も参考頂ければ、イメージがわくと思います。

参考記事:mBot2台を赤外線通信で会話させる

 ここまでで、冒頭の動画のような動作をさせるための要素の検証までできました。この後は、各要素を、一つのプログラムにまとめていくという作業をしていきます。

分解した要素を組み合わせて、一つ一つ構造化していく 

 構造化していくというと少々大袈裟ですが、簡単に言うと、「順次処理」「繰り返し」「条件分岐」を駆使しながら、各要素を組み合わせていきます。

参考記事:順次処理
参考記事:繰り返し
参考記事:条件分岐

 繰り返し処理では、「ずっと」ブロック=ループ処理がよく使われますが、安易にずっとブロックを使うと、そのループから抜け出せなくなるので、「○○回繰り返す」や、「■■まで繰り返す」といった、条件を付けたループ処理をしていく必要があります。条件設定では、演算ブロックとタイマーブロックが活躍するでしょう。

 また、同じような動きの繰り返しが、出てきますので、その部分は、ブロックを定義して、まとめることも必要になってきます(そうじゃないとかなり長く分かりにくいプログラムになって、バグを修正しにくくなります)

 こういったことを駆使しながら、試行錯誤していくと、↓のような動作を実現するプログラムを作ることが出来ます。 

 mBot1が動作を終わらせた後、IR通信でmBot2に合図を送っています。また、mBot1はRGBラインフォロワーセンサーを利用して白線のライントレースをしており、mBot2は通常のラインフォロワーセンサーを利用してライントレースをしております。微妙に、ライントレースの滑らかさが違いますね。 

 MakeX2018のタスクの中でも、このタスクは、超音波センサー、回転制御、ライントレース、IR通信といったmBotの主要なセンサーを活用し、更に、順次処理、ループ処理、定義ブロック作成、タイマーの活用、演算ブロックの要素が必要になってくるので、非常に秀逸なタスクじゃないかと思います。

試行錯誤していくことが重要と考えていますので、プログラムは公開しないようにしますが、この記事を参考にしていただければ、進めるにあたって、何かしらの指針にはなるかと思います。

もし、息詰まるようでしたら、こちらで管理しております、Makeblockユーザーコミュニティ(無料です。だれでも入れます)で、質問して頂ければ、様々なユーザーさんからアドバイスがもらえるんじゃないかと思います。

Makeblockユーザーコミュニティはこちら

■この記事の使用環境
・mBot_v1.1 2台
・Windows10 PC
・mBlock5_v5.0.1_ 2019/4/13現在最新版