GELOを使った授業(中編)

inventorというLEGO社のロボットキットにあるサンプルのロボットの一つのGELOを使ったプログラミングについて学ぶ授業の中編です。見た目はよくなりますが、制御の質を求めると途端に難易度が上昇します。

前編はこちらにあります。

前編

導入まだまだ日本では普及しているとは思えないLEGO社のロボットキットinventorですが、枚方ロボットプログラミング学習塾では上のコースでは主力として使っています。spikeはちょっと高いのとパーツが少ないことがネックになりま[…]

前編では、足がない状態での4速歩行の動きを授業の流れ(プログラムを作っていく考え方)に沿って説明しました。

中編では、足の追加とセンサーを取り付けた後の制御方法と注意点を紹介します。

具体的には、足がぐらつくのを初期位置を変えて対応すること、その初期化をメッセージブロックを使って同時に処理する方法、超音波センサーやジャイロセンサーを使って移動の制御を行うプログラムとその時に発生する足の位置の問題についてになります。

最低でも授業2回分は必要なくらい盛りだくさんになります。

色々なところで、難易度が高いところが出てくるので、そういうところは自分で問題を追求するよりは、理由を説明して解決策を考えてもらうか、解決策を提示してプログラムを理解してもらうなど、その子の実力によって分かれていきます。

(それくらい、そのまま使うには罠が多いです)

GELOに足を取り付ける

GELOの足の根本もリンク機構でしたが、足そのものにもリンク機構になっていて、円形に動くわけではないのですが、つま先の軌道がカマボコを逆にしたような形なので、歩行ロボットとしてはそこまで優秀な足ではない気がします。

GELOの作成 ステップ2

メインは四本足ですが、体周りのトゲみたいに見える装甲も増えています。

もう一つ大きなポイントは超音波センサーとカラーセンサーが増えているので、距離や色が読み取れるようになっています。

この辺はプログラムの復習程度の使い方になりますが、ここでも取り扱っておきます。

横から
斜め前から

完成した様子です。ケーブルが外に出ているのが微妙な感じですが、下手にまとめると、足の動きを邪魔してしまって動きがおかしくなったので、説明書通りに落ち着きました。

GELO(足付き)の移動のプログラム

基本の動きは、足がない状態のGELOのプログラムと同じで問題がないはずですが、思った様に動かない部分が出てきます。

足の初期位置

足の初期位置(モーターの角度)が0度と180度ではどちらかの足が浮いてしまうようです。

そのまま移動を始めた場合、本体がバランスを崩して、たまに斜めに踏み込んでしまいます。

気になるようなら直した方がいいのですが、ここを制御しようとするとちょっと難しくなってしまいます。

奥の足が浮いている

足の初期位置について

修正の候補としては

  • ジャイロセンサーのヨー角を取って補正をかける
  • 浮かない初期位置を探す

この2点くらいだと思います。

ジャイロセンサーのヨー角を取って補正をかける場合

傾いた分だけ左右の速度の差をつけることで修正できそうですが、そうすると足の動きがバラバラになっていくのでまた初期化が必要になって振り出しに戻りそうです。

ある程度大きくずれたら、一旦止まってしっかり旋回してまた元の動きに戻す方がまだ良さそうですが、どちらにしても移動を変えるたびに足の初期化が必要な限り、バランスを崩す危険性が残ります。

浮かない初期位置を探す

AとDのモーターの初期位置が0度の時は、BとCのモーターの初期位置が180度にして、反対にします。また、前進と後退の場合は、AとCのモーターの回転に対して、BとDは逆回転することで、同じ方向に回転できます。旋回時はこれを片側を逆にすることで実現しています。

つまり、前進や後退は左右のモーターを逆回転にして、旋回時は同じ回転にしています。

これらを踏まえると

前後に移動する場合

  • A:0+α
  • B:180-α
  • C:180+α
  • D:0-α

旋回する場合

  • A:0+α
  • B:180+α
  • C:180+α
  • D:0+α

これを満たせば良いのですが、無理なので、それぞれ別々に初期化するしかなさそうです。

リンク機構を極めていれば角度を求められるのかもしれませんが、実際に動かして確認してみます。

これは前進、後退の時の初期値を調整するプログラムです。角度を変えればあとは勝手に計算してくれます。

色々と数字を変えていったところ、角度のずれが120度周辺のところで落ち着きました。つまり、Aの初期位置が120度、Bが60度、Cが300度、Dが240度になります。

前進・後退時の初期位置

四本の足がちゃんと地面についています。これならスタートの時にバランスを崩すことはなさそうです。

同じように、旋回する時は、AとDが90度、BとCが270度で足が地面についた状態で移動を開始できます。

旋回時の足の位置

後から思ったのですが、そもそも0度と180度の関係が正しいかどうかも怪しいと思っています。確証がないのですが。

このような検証と実験を繰り返していくのは、ハイレベルかエキスパートになってからです。

ロボットのバランスや重さが色々な影響を及ぼす、くらいが体感できるだけでも今後のロボット作りに活きたりします。

前に作ったプログラムで動作を確認する

前編で作ったプログラム

スピードですが、環境(床の滑り具合など)や個体差(モーターの調子やケーブルの位置など)でうまく動く場合とおかしくなる場合とで分かれると思います。

特に、右に曲がったり、左に曲がったりする動きがうまくいかなくなることが多いです。

ここは原因を突き止めるのが大変なところですが、動きを見ているとヒントがあります。

まず、前足と後ろ足のパワーが違うように見えます。具体的には後ろ足の方が地面を蹴る力が強く見えます。(実際には頭が重たくて前傾になりやすいのだと思いますが。)

その結果、スピードが50だと強すぎて、後ろが浮くことがあります。この時にバランスを崩して、モーターの回転がずれるのではないか、と考えています。

ということで、スピードを30とか25くらいに落とすと、かなり安定します。

解決策に目処がたったとしても、今までのプログラムにある全てのスピードを変えていくのは大変です。また、このやり方は回転数で移動することを前提にしていて、超音波センサーなどが使えないので、それも踏まえて改善していきます。

GELOのプログラムを改良する

(元々、用意されたプログラムブロックを活用したことが間違いだったのですが・・・)

ここで紹介する以外にも方法はあります。変数を使って、今までのスピードのところを一括で制御できるようにすると、変更箇所が少なくなると思いますし、移動のプログラムはスマートになると思います。

スピードを最初に決める

モーターブロック(基本)

モーターブロックには回転を続けるというブロックがあります。枚方ロボットプログラミング学習塾ではEV3の呼び方を使って動かしっぱなしにするモードをオンモードと呼んでいます。

オンモードのブロックは回転方向のみを指定でき、スピードは初期値は75%で、それ以外なら指定したスピードが自動で割り当てられます。

最初にスピードを指定しておけば、残り全て同じスピードで進めます。

最初にスピードを指定しておく

最初にスピードを指定しておけば、残り全て同じスピードで進めます。

あとは、それぞれのマイブロックをスピードの設定から、オンモードで動かし続けるプログラムに変えていきます。

マイブロックを修正する

左が元のプログラムで、真ん中が回転方向だけにしたプログラム、右は回転数での移動が不要になったので、マイブロックを編集したプログラムです。時計回りがプラスの方向です。

制御ブロックで移動量を調整する

制御ブロック

このブロックとセンサーブロックや演算ブロックを組み合わせることでオンモードを切り替えるまでの条件を作ることができます。

他のロボットでも使える考え方なので、これまでにしていきた復習や、ここで新しいやり方を覚えたりできます。

時間(秒)で制御する

時間で止まるプログラム

一番簡単な形です。

移動時にはスピードによって移動距離が変わってしまうので、それに注意して使うことになります。

超音波センサーを使って制御する

指定した距離より近づいたら止まるプログラム

超音波センサーは距離を測定できるので、近づいたり離れたりした時に次の命令を実行できるように作れます。

ピッタリ止まるのは、少しでも行きすぎると失敗するので注意が必要です。

ジャイロセンサーを使って制御する

ハブが地面に平行になっている場合に、進行方向を読み取る角はヨー角になります。ジャイロセンサーはそれだけで授業1回分以上の内容になるので、ここではヨー角を使うだけで良いとしてます。安定した移動ができるロボットで取り扱う予定です。

ブロックの初期値が「ピッチ」になっているので、ヨー角に変更して使ういます。

ジャイロセンサー関係のブロック
右に90度曲がったら止まるプログラム

ヨー角は、プログラムを実行した時のハブの角度を0度に設定されます。それを維持した使い方と毎回リセットする使い方で角度の求め方が変わります。(これも別の授業で)

今回は簡単に進めるため、毎回リセットします。

例のように=は90度を行きすぎた時に止まらなくなるので注意です。

右に90度より曲がったら止まるプログラム
左に90度より曲がったら止まるプログラム

左は値が減っていくので、マイナスで表現することになります。また、大小関係にも注意が必要です。

回転数で制御する

回転数を測って止めるプログラム

モーターの拡張ブロックを使います。

考え方の基本はジャイロセンサーと同じです。それまでの移動があるので、モーターのカウントをリセットし、前進するモーターで測定します。

○×360にして、回転数をそのまま入れられるようにしていますが、本来は角度であることを知っていれば、そのまま角度を入れても構いません。

制御後の足の位置

前回は全て回転数で移動していたので、移動後のモーターの位置が元に戻っていたため、動きが変わってもそのままで問題が起きませんでした。

オンモードで動かし続け、何かしらの制御が反応した時に止まったり、次の動きに変わる場合、足の位置は初期値とは全く関係ないところで止まります。そこで違う動きに切り替わると、足が揃って動き出すようなバグが生まれます。

初期化を同時に動かす

初期化はそれぞれのモーターの位置を順番に合わせるように実行していましたが、移動を変えるたびにモーターを一つずつ動かすのは見た目が良くありません。

プログラムは通常は一つのブロックが実行完了したら次に移ります。なのでそれぞれの指定した位置まで動かすプログラムブロックは複数選択ができず、同時に動かせません。

そこでメッセージを使って、同時に動くように指定します。メッセージを同じ名前にすることで、それぞれが同時に動きます。

「送って待つ」にしておくと、全てが終わるまで待ってくれるので、その後普通の動作が始まります。

「送る」だけの場合、オンモードのようにすぐに次のプログラムを実行してしまうので、初期化する前に移動が始まってしまいます。

※初期化自体はマイブロックにせず、他のところで直接「メッセージを送って待つ」ブロックを使えば、いつでも初期化できます。

例えば、マイブロックの中に入れておけば、移動前に必ず初期化してから、移動を開始できます。

まとめ

足をつけたことでバランスが変わったことでの修正と、センサーが増えたのでその使い方、その時に足の位置が保証されなくなるので、その修正の仕方を説明しました。

センサーとモーターを回転させ続ける使い方は、他のロボットでも基本として登場します。この組み合わせの理解がロボット制御の基本ですので、これが理解できることがスタンダードコースの1番の目的になります。

ロボットの形に関しては、足がついたことで見た目はパワーアップした気がしますが、実際の性能は落ちた気がします。一歩当たりの移動量は増えている気がしますが、重すぎてスリップしたりモーターの挙動が不安定なところです。スピードではなくパワーで動かしたら全く動かなかったので、それなりに負荷がかかっているのは間違いないです。

また、足の動きがリンク機構で動いているので、0度と180度の関係で反転するわけではなくなっているような気もします。本来はモーターではなく、足先の位相が反転する角度を求めなくてはいけませんが、その割合がずれているとしたら、モーターを回転させる速度も都度変更させることになりそうなので、もっと良い制御方法があるのだろうな、とは思っています。そこまで手をつけると、難易度の割に学ぶ内容がブレるので、スタンダードコースなどでは取り扱いません。

今後の課題

  • 他の旋回方法を考える
  • スピードをあげても大丈夫なようにする
    (ロボットのバランス?)
  • 足の初期化を効率良くする
    (最短経路は直前の移動に比べ逆回転することがあるため)
  • オリジナルで足を作る

課題としていますが、すぐに対応するわけではなく、この辺の探究は、ハイレベルコースやエキスパートコースでの課題ですね。私が色々と教え込むよりも、自分の考えに基づいて色々と実験を繰り返してもらった方が学習になると思います。

そのための自習時間もありますし。

後編はリモコン化します。

旋回が不十分なのでなかなかスムーズに動くリモコンは作れませんでしたが、これでinventorでできることの多くを紹介できるのでは、と思っています。

後編に続く(執筆中)

枚方ロボットプログラミング学習塾では、このようなロボットづくりを通じて、プログラミングやロボット作りのスキルを身につける以外に、考える体験や問題を見抜く練習ができるような授業を実施しています。

単に技術力を鍛えるだけでなく、いろいろな方面に生きる考える力を鍛えることができます。

体験授業は無料で実施しております。

その他ご質問なども何なりとお答えいたしますのでお気軽に相談ください。

連絡先 info@hrktrpg.com