RC飛行機用に6軸のジャイロを入手したのですが、その勉強をしていて10年程前にLEGOのMindstormsで作った倒立振り子型のロボットのことを思い出しました。それは1軸のジャイロセンサで傾きを検出して、その傾きと逆方向にロボットを傾けるように車輪を回転させてバランスを取るようにしたものなのですが、2本の脚で不安定に立ったそのロボットのことを最近歩き始めた孫のビデオを見て連想したのでしょう。下はそのロボットのデモのビデオです。
www.youtube.com
RC飛行機は複雑な3軸の動きをするので、ジャイロからの信号で制御した飛行特性を見ながらカットアンドトライでゲインを少しずつ上げて調整する「勘」の世界のようですが、このロボットの場合は1軸で比較的シンプルなので、理論に基づいたプログラムで制御しました。しかし、それを作った時はまだこのブログを書いていなかったのでその理論的背景や製作過程について記述したものを何も残しておらず、それを撮影した上のようなビデオをFacebookで紹介しだけでした。
そこで、もう一度作りなおして、このブログに書き残しておくことにしました。
前回作ったときは、Mindstorms NXT上でleJOSというJavaの環境でプログラミングしたのですが、今手元にあるハードウェアはMindstorms EV3でプログラミングの環境はPythonに移行しています。そこでPythonで書き直すことにしますが、スクラッチからつくるのは大変で、古希のおじいさんにはもうそんな根性はありません。
なにか参考にできるものはないかと探してしていて、LEGOがMindstorms EV3のために用意したMicroPythonのサイトで周辺デバイスを使ったロボットのサンプルをいくつか紹介している中に、Gyro Boyというジャイロセンサを使った倒立振り子型のロボットの例がPythonのサンプル・プログラムとともに紹介されていたのを思いだし、その中身を検討してみました。
pybricks.com
ここ数年プログラミングから遠ざかっていたので、ちょっと時間を要してしまいましたが、だんだん内容が分かってくると、サンプル・プログラムはとてもにエレガントに書かれていて、Pythonのいい勉強になります。
処理の中心はバランスを取るためのコントロール・ループで、それを一定時間で回しながら、外部からの命令をジェネレーターのyield命令で取り込むようにしているのです。
そして、キーとなるバランスの制御はロボットの傾きとその角速度、車輪の回転角とその角速度の4つの変数の加重和でモータをコントロールするようにしています。それは以前私が使った制御方式と合致しているので、以前の経験も活きそうです。
そこで、先ずはそれをしっかり理解するために、サンプル通りにロボットを作り、プログラムを動かしてみました。
ロボットは、3台のモータ、ジャイロセンサ、カラーセンサ―、赤外線センサ、タッチセンサを登載していています。
正立した状態で起動させると、ジャイロセンサによって検出した傾きに応じて車輪を動かし2輪で自立します。カラーセンサに色を認識させると、緑、前進、黄:右旋回、青:左旋回、赤:停止の動きをします。赤外線センサの前方25㎝以内に障害物を検知すると手を振り自動的に右か左に下がってそれを回避します。そのビデオはその様子を撮影したものです。
安定していています。
これからこの枠組みをベースにしていろいろと試してみることにします。
ーーーーーーーーーーーーーーーー