GyroBoy(ジャイロボーイ) ~レゴマインドストームEV3~
Contents
ジャイロボーイ
教育用レゴマインドストームEV3でジャイロボーイを作った時の備忘録。
ジャイロボーイはジャイロセンサーでバランスを取りながら2輪で直立しながら前進、後退、その場で回転等ができるロボット。
組立説明書とサンプルプログラムが付属しているので本体さえ説明書通りに組み立てることが出来れば作ることができる。
ジャイロセンサーを使って2輪で直立する仕組みが知りたくてプログラムを自分なりに解析してみた。
何故、直立できるのかは正直良くわからなかったが自分なりに分かった部分に関して記事に残しておく事にした。
基本的な動作
基本的な動きは、
- 二輪でバランスを取りながら自走
- 右腕のカラーセンサーで色を読み取る
- 赤なら停止
- 緑で前進
- 青でその場で時計回り
- 黄でその場で反時計回り
- 白で後退
- 左腕の超音波センサーで25cm以内に物体を検知すると若干後退をしながら両腕を振る
となっている
動画
まずは動いている様子は以下の動画を見てほしい。
直立した後、黄色を読み込ませてその場で反時計回りにゆっくりと回転している。
組立説明書
教育用レゴマインドストームEV3はOSに合ったソフトウェアをこちらのサイトからダウンロードしてインストールする。
ソフトウェアを起動して組立説明書ー>コアセットモデルー>ジャイロボーイを選択する。
1/3ページはジャイロボーイの紹介ビデオページとなっている。
右三角で次のページが表示される。
2/3ページは組立説明書。
ページ数は119ページだが指定した設計図の通りに組み立てれば組み立てることができる。
3/3ページはプログラムとなっている。
今回、このプログラムを解析してみた。
プログラム
ジャイロボーイのプログラムは以下の通り。
main | メインルーチン バランスをとって直立する処理群1とカラーセンサーを読み取ってステアリング操作やドライブ操作をしたり超音波センサーで障害物との距離を検出して25cm以内であれば後退して両腕を動かす処理群2から構成されている この記事では主に処理群1について見ていきたい 尚、処理群1に関しては約0.005秒で1ループ(BALループ)する様に制御している |
RST | 初期処理 プログラム中で使用するジャイロセンサーやモーター、各種変数をリセットしている |
gOS | 静止状態でのジャイロセンサーの平均角速度(gOS)を算出している 約0.004秒間隔で200回ループ(約0.8秒)して算出している この処理ではgOSはほぼゼロになる |
GT | 1ループ(BAL)辺りの平均処理時間(tInt)を算出している 初回は0.014をセットしている |
GG | ジャイロセンサーの角速度(gOSの再計算)、スピード、角度に関する値を計算している |
GM | モーターの回転角度に関する値を計算している |
EQ | GGで算出したジャイロセンサーに関する値とGMで算出したモーターの回転角度に関する値を元にパワー(pwr)を算出している |
Ctrl | 上記で計算したパワー(pwr)を元にドライブ値(Cdrv)とステアリング値(Cstr)で左右のパワーを調整して計算している 尚、初期状態で(カラーセンサーから何も色を読み取っていない状態)ではCdrv、Cstrともにゼロがセットされている |
Chk | パワー(pwr)が最大値(100)を1秒以上継続しているかどうかのチェック 継続している場合はループ(BAL)を終了してモーターを停止する ※転倒している時の処理と思われる |
main
処理群1と処理群2に分かれており、2つの処理群が同時並行で実行される。
処理群1はジャイロボーイの直立に関するロジック、処理群2は前進・後退、その場での回転などに関するロジックになっている。
処理群1
ジャイロボーイの直立に関するロジック。
その1
- 初期処理と顔の表情に関する処理
- バランス用ループ(BAL)の前半部分(GT~GG)処理詳細は後述する。GTでループの時間に関する処理、GGでジャイロセンサーに関する計算処理を行っている。
その2
マイブロックGM~Chkの処理詳細は後述する。
ざっくりいうとGMでモーターに関する計算計算、EQでジャイロセンサーとモーターの値からベースとなるパワー(出力)の計算処理、Ctrlで左右のパワーの分配計算を行っている。
計算ブロック(0.005-(a-b))のa-bはループのGT直後から直前までの時間を表している。
よって0.005-(a-b)秒待機する事で1ループ(BAL)が0.005秒前後でほぼ同じ時間になるように調整している。
またOKがTrueになったらループを終了するのだが、Trueになる条件はpwr(パワー)100が1秒以上継続することなので転倒などでどちらか一方にパワーが偏ってしまった時にループが終了する様になっている。
その3
モーターを止めてタッチセンサーが押されるまで待機する。
タッチセンサーが押されたらループを継続する。
処理群2
処理群1と同時並行で実行される。
カラーセンサーで読み取った色別の処理と超音波センサーで25cm以内の障害物を検知した時の処理が記述されている。
- Cdrvはドライブ値を表しておりプラスの数値で前進、マイナスの数値をセットすると後退する。
- Cstrはステアリング値を表しておりプラスの数値をセットすると時計回り、マイナスの値をセットすると反時計回りにジャイロボーイがその場で回転する。
- Cdrv、Cstrの値はEQ及びCtrlで左右のパワーの補正に利用している
RST
初期処理。
モーターやジャイロセンサー、タイマー、各種変数をリセットしている。
gOS
静止状態でのジャイロセンサーの平均角速度(gOS)を算出している。
尚、gOSはGyroSensor OffSet(ジャイロセンサーの補正値)の略と思われる。
その1
その2
その3
変数gMnはジャイロセンサーの角速度の最小値、変数gMxは最大値を算出する為の変数。
初期値に変数gMnは十分に大きい数値、g変数Mxには十分に小さい数値をセットしてその値を上回る値の時は変数を書き換えるやり方で最大値、最小値を算出している。
最大値ー最小値が2以下(ほぼ停止している状態)になるまでOSLループを繰り返す。
OSLループの中で更にgChkループを200回繰り返している。
変数gOSはgChkループでのジャイロセンサーの角速度の平均値(合算して200で割っている)。
この処理(gOS)では変数gOSはほぼゼロになるが、この後のGGにて変数gOSは再計算される。
GT
1ループ辺りの平均処理時間(tInt)の算出処理。
cLoは初回はゼロがセットされているの上のフローが実行されて変数tIntには0.014(秒)がセットされる。
2回目以降はTimer1をcLoで割ってMain処理のBALループの平均処理時間(1ループ辺りの時間)を算出して変数tIntにセットしている。
GG
ジャイロセンサーの角速度、スピード、角度に関する値を計算している
ジャイロセンサー関連の3つの変数を計算している。
変数gOS | (0.0005✕ ジャイロセンサーの角速度)+(0.9995)✕1ループ(BAL)前の変数gOs |
変数gSpd | ジャイロセンサーの角速度-変数gOS |
変数gAng | 変数gAng+(変数gSpd✕変数tInt) |
この3つの変数とモーターの回転角度を使って後続のEQにてモーターのパワーを算出しているのだが正直「やっている事は分かった」のだが「これで何故直立するのか」は分かっていない。
ジャイロボーイが前に倒れそう(ジャイロセンサーの値がプラス)なら前進、後ろに倒れそう(ジャイロセンサー値がマイナス)なら後退させることによって直立を保とうとしている理屈は分かるのだが、現時点ではそれぞれの変数の意味までは理解出来なかった。
GM
モーターの回転角度に関する値を計算している。
その1
その2
モーターの回転角度に関する2つの変数を計算している。
変数mSpd | ((変数mDP1+変数mDP2+変数mDP3+変数mD)÷4)÷変数tInt
つまり直近4ループ(BAL)の平均を算出して1ループの平均時間(tInt)で割っているのでスピードが算出される スピード✕時間=距離より、スピード=距離÷時間 |
変数mPos | 変数mPos+変数mD 通算の回転角度(AドライブとDドライブの合算値)をポジションとして算出している 前進すればプラス、後退すればマイナス値が加算されるのでループ開始からの通算位置が算出される |
EQ
ジャイロセンサーの値とモーターの値からパワー(pwr)の算出を行っている。
その1
その2
以下の計算式で変数mPos(GMで計算した通算の回転角度)を補正計算すると共に変数pwrを計算している。
変数mPos | 変数mPos-(変数tInt✕変数Cdrv) 変数mPosを補正している
|
変数pwr | (-0.01✕変数Cdrv)+((0.08✕変数mSpd)+(0.12✕変数mPos))+((0.8✕変数gSpd)+(15✕変数gAng)) 最初の(-0.01✕変数Cdrv)は前後にドライブする為の補正値、変数Cdrvは初期値はゼロがセットされている 後半のジャイロセンサーの角速度とモーターの回転角度からの計算は、やっている事は分かるけど何故これで直立できるのかは分からない |
Ctrl
上記EQで計算した変数pwrをベースにドライブ値(Cdrv)とステアリング値(Cstr)で左右のパワーを調整して計算する。
以下の計算式で左右(A、Dドライブ)のモーターのパワーを補正する。
尚、計算後のパワーが100を上回る、またはー100を下回る場合はそれぞれ100、ー100を上限、下限にする。
変数mPos | 変数mPos-(変数Cdrv✕変数tInt) 変数mPosをCdrvで補正している |
D_pwr | Dドライブのパワー 変数pwr+変数Cstr✕0.1 |
A_pwr | Aドライブのパワー 変数pwr-変数Cstr✕0.1 |
Chk
Mainの処理群1のBALループを終了する為の条件を設定する。
変数pwrの絶対値が2秒以上連続して100の場合は転倒など何らかの異常とみなして変数okをTrueにする。
それによりBALループが終了する。
動画
この記事の内容を動画で説明している。
最近のコメント