2018年9月26日水曜日

2018年9月報

1.9月授業内容
2.今月の課題
3.今後の授業スケジュール
4.お知らせ


1. 9月授業内容


1.0 <スタートアップ(全コース)>


 割愛します。



1.1 <プライマリーコース『メカビートル』>


 割愛します。




1.2 <ベーシックコース『ロボリン君』>


 第5回アイデアコンテスト全国大会(2015年)ミドルコース最優秀賞作品(当時小3)がベースの、ボウリングロボットです。


 最優秀賞作品とは言え、書くべきことは特にないです。(このロボットだけは…)

モーター軸が直接、腕(うで)に見立てたLロッドを回すだけですので、ギアトレーンも動力リンクも、何もなし。

 デザイン性は秀逸(しゅういつ)ですので、雰囲気(ふんいき)は満点です。
これはもう、ボウリング大会で盛(も)り上がるしかありません。
ボウリング場さながら、各自のレーンを横にずらっと並べ、下記のレギュレーション(テキスト通り)にて点数を競いました。

1) ピンはピニオンギアうす + シャフト3ポチ
2) ピン数は5本(前2本+後ろ3本のレイアウト)
3) ピン位置はスコアボード前4ポチ分の範囲(はんい)内
4) ボールはマイタギア2個をくっつけた大きさまで(テキストp.14)
5) 2投球×5フレーム(全ストライクで最高70点)(*1)


 30点超えで優勝する人、1~2点で終わる人など、さまざま。
何ゲームやっても、あまり変わりません。偶然(ぐうぜん)や運だけではないようです。

下記が勝つポイントだったようです。

・投球ロボットが左右に向きを変えられるか(2日目テキスト)
・電池がパワフルか(新しいか、4本よりも5本か)
ピン同士が離(はな)れているか(くっつけて置くと、後ろのピンが前のピンを支え、倒れにくくなる)
・腕をぐるっと回した後にボールに当てるか(腕の加速を待たず、スイッチONですぐに当てる位置だと、ボールが遅くてピンまで届かない)

 皆さん、楽しみにしていただけあって、ゲーム中はいつにも増(ま)して、歓喜(かんき)の雄叫(おたけ)びや、ミスを嘆(なげ)く声が飛び交(か)いました。

君たちは、まだまだ、遊び足りないんだね。



*1 本物のボウリングでは、1~9フレームまで2投球、10フレーム目を3投球にして、全ストライク(9フレーム目までストライク9回 + 10フレーム目ストライク3回)で 30点×10フレーム=300点満点です。
 ロボリン君では、5フレームとも2投球、全ストライク(4フレーム目までストライク4回 + 5フレーム目ストライク2回)で 15点×4フレーム + 5フレーム目10点=70点満点です。
 ストライクを出すと、次の2投分まで加算した(計3投分の)点数が入り、最高で、本物では10点×3=30点、ロボリン君では5点×3=15点となります。


1.3 <ミドルコース『ステアリングカー』>



 機械の王道たる、自動車です。ロボット教室の生徒さんなら、絶対に造って欲しい一台です。


 しかし、これまで幾度(いくど)となくロボット本体にタイヤ4輪を付けて転がしてきたのに、なぜ今さら“”なんでしょうか?
そのポイントは曲がる仕掛け(ステアリング)、つまり、ハンドル(英語ではステアリングホイール)を回すと左右の前輪が同期して向き(舵角=だかく)を変えるメカニズムです。

このメカニズムは3点から構成されています。


(1) ラック&ピニオン方式
 円形のピニオンギアを直線状のラックギアと噛み合わせ、ハンドル操作による回転運動を左右方向の直線運動に変換し、前輪の舵角(だかく)を変えます。

 このラックギア(洗濯板みたいなやつ;通じるかな…)は、今までロボット顔面の付け髭(ひげ)くらいにしか利用する機会のなかった人にとっては、初めて日の目を見ました!
これが本来の使い方ですよ!

 この仕組みは、プラモデルで自動車を組み立てたことのある人なら知っていたでしょうが(*1)、実車と同じ(*2)です。


(2) 平行リンク
 左右のタイヤの舵角が揃(そろ)う仕組みは、平行リンクと呼ばれる機構です。
左右に動くラックギアが平行リンクの外形を長方形にしたり、それを潰(つぶ)して平行四辺形にしたりしますが、いずれにせよ、4辺は平行のままですね。


(3) ユニバーサル・ジョイント(自在継ぎ手)
 ピニオンギアを回転させるシャフト(水平方向)と、ハンドルを回転させるシャフト(後方斜め上方向)は、同一直線上になく、途中で折れ曲がって接続しています。
ハンドルを上下左右に揺らしても問題なく操舵(そうだ)できます(*3)。

 チェーンや多数のギアを介さず、駆動力を数本のシャフト(棒)で遠方の異なる方向に伝達できる点で、これは大発明なのです。
なぜそのようなことができるのか、言葉で説明するよりじっくり観察しましょう(*4)。


 さて、学ぶべき点の多いリアルなモデルカーでしたが、授業最後の競技は“運転技能”。
マリオカートで鍛えてるって言ったって、車庫入れしたこと、ないでしょ?

教習所さながら、狭い角を曲がり、障害物を避け、脱輪にも注意しながら、狭いスペースに縦列(じゅうれつ)駐車や、後ろ向きに駐車するまでの時間を競いました。

操縦性を高め、速く走らせるポイントは以下の通り。


・あまり屈(かが)まずに済むよう、ステアリングシャフトをびよ~んと延長
・電池ボックス/スライドスイッチを延長ケーブルでつないでリモコン化(2日目テキスト)
アクセルペダル代わりにタッチセンサー(黒)を直列につなぎ、前進⇔後退の切り替え時のみスライドスイッチを操作
・全長(前後輪の軸間距離)を短く、小回りに(*5)
・直進時のスピードアップに、減速比の緩和(*6)


 やはり、バックでの運転には慣れていないようで、ハンドルの“切り返し”を忘れて同じ場所を行ったり来たり、入れやすいフロント部から突っ込んで、どつぼにはまる例も…。
タイムには数倍の開きがありましたが、崖から落ちずに駐車できただけ命拾いしました!


*1 若者の車離れが叫ばれる昨今、自動車のプラモデル製作経験は少ないようですね…。


*2 どの自動車カタログにも逐一「ステアリング形式: ラック&ピニオン式」のように書かれています。もう、「その他に一体何があるんだ!?」っていうくらいに。
 学んだ仕組みに実感が沸きますので、是非、Webカタログを見てみましょう。
できればお使いの車を検索して。スペック中の諸元表にあります。
 <参考> http://www.suzuki.co.jp/car/alto/detail/spec.html


*3 実車でも“チルト・ステアリング”といって、運転者の背丈に合わせてハンドルの上下位置を調整できるようになっているものがあります。
 また、サスペンションにより上下に揺れる車輪へエンジン動力を伝えるドライブシャフトにも使われています。

*4 さらに興味が湧いたら、インターネットで調べてみましょう。問題点もあります。
 <参考> https://ja.wikipedia.org/wiki/%E8%87%AA%E5%9C%A8%E7%B6%99%E6%89%8B

*5 自動車用語で、「ホイールベースが短いので、最小回転半径が小さい」と言います。
 前回(2017年3月)に続き中間教室で見られた、この真っ当なアイデアの体現と効果に驚かされました。

*6 テキストでは1/5(ピニオンギア⇒ギアL)ですが、1/3(ピニオンギア⇒ギアM)等に変えて速くできます。


1.4 <アドバンスプログラミングコース『ロンボ(2)』>



 《下記を参照下さい》
  http://robocobo.sakura.ne.jp/blog/robot/adv1-1809.pdf




1.5 <プロ3年目コース『六脚ロボット(3)』>


 ロボティクスの名に相応しい六脚(カブトムシ型)ロボットの総仕上げに、
先月第4回までの自動シーケンス制御[HexRobot4/RemoteWalk*]をベースに、
  第5回:障害物センシングによる自律歩行制御[HexRobot5/HexCrawler*]
  第6回:与えたデータ通りのモーション再生制御[HexRobot6/HexMotion*]
を足しました。

本ロボットの制御に使用したプログラミング技術は、


現在値目標値を管理し、一次関数で補間することによるサーボモーターの滑らかな制御
・サーボ制御と異なる周期でのタイマー割り込みによるコントローラー読出し
ステートマシン(状態機械)モデルによる歩行モードおよびシーケンス(ステップ)管理
乱数によるランダム分岐制御
モーションデータ二次元配列への格納とアクセス

など、てんこ盛りです。


ソースコードは700行(コメント・空行を除いても450行)を超え、全体像を把握するにも精神力が要ります(*1)。
それを知りたいと思って、ここを読む人はいないし、その必要もありません。
それぞれの技術をもう一度知りたいと思ったときに、テキストやサンプルプログラムが参考になるでしょう。

今は100%理解しなくても、将来、何らかのロボット制御プログラムを書く段になったとき、この経験や考え方が大いに役立つでしょう。

ここでは、ゲーム制作に役立つ(というより必須の)テクニックをピックアップしておきます。


 じゃんけんプログラムを作りたい場合、コンピュータにグー・チョキ・パーをランダムに出させたいですね。
random(3) でランダムに出てくる 0, 1, 2 を対応させます。
サイコロの目なら、random(6) + 1 または random(1, 7)1~6 が出ます。

ここで知っておくべきことは、ランダムと言っても「真にデタラメな順番ではない」という事実です。
プログラム通りのビット演算しかできないCPUに対して、「何か適当な数字を出して!」は難しい注文なのです。
だから、十分ランダムに見えるように、何かしら“最初の数”をこねくり回す関数で“ちゃんと計算して”出します。

全く適当じゃないですね。これを「疑似ランダム」とか「疑似乱数」といいます。
一回限りのゲームならこれで良いのですが、問題は、プログラムを起動する度に、毎回同じ順番で数(グー・チョキ・パー)が出てくるという現象です。
これは、ゲーム機としては致命的と言って憚(はばか)れないでしょう。

 そのために、疑似乱数列生成関数に“シード値”(種となる初期化番号)を与えて、乱数列を変えられるようになっています(*2)。
Arduinoでは randomSeed(シード値) と書き、シード値はlong型整数(-2147483648~2147483647)です。

randomSeed(0)randomSeed(1) では、その後に呼び出される random() が出す数の順番が異なります。
一方で、シード値が同じなら同じ乱数列になることが“保証される”ので、シード値を毎回ランダムに与えないとなりません!

randomSeed( random(100) ) とやっても無駄です。
毎回起動後に ramdom(100) が同じ値を出すので、どうにかしてランダムな数を“拾ってくる”必要があります。

乱数列を生成するのに乱数が要るって、堂々巡りやん!
そう聞こえますね。

 Arduino等の小規模(組み込みシステム用)マイコン環境では、未接続(オープン)のアナログ入力ピンがあれば、そこから読み取ったアナログ値(ノイズ)をシード値に使う手がよく使われます(*3)。

 randomSeed( analogRead(0) );  // 0番ピンがオープンの場合


もしくは、ゲームのスタートボタン等、幸運にも(?)ユーザーの不定な行動タイミングを読み取るチャンスがあるならば、プログラム開始時からの経過時間をミリ秒単位で返す millis() を使う手もあります。

 pinMode(D2, INPUT_PULLUP);  // D2をタッチセンサー入力ピンに使う設定
 while( digitalRead(D2)==LOW );  // D2が押されるまで待つ
 randomSeed( millis() );  // ランダムな経過時間を取得できる

その他、温度(熱雑音)時刻GPS情報などが取得できるシステムでは、それらが使えます。
いずれにせよ、融通の利かない決定論的コンピュータには、カオスに満ちた外界からの情報が新鮮というわけです(*4)。

ならば、最初から analogRead(0) % 3 でじゃんけん、millis() % 6 でサイコロを振ればいいやん!
そう思いますよね。

6通りのサイコロ程度ならそれで十分かもしれませんが、広範囲の乱数を取得するには、分布の一様性(均等性)が問題となり得ます。
例えば、0~999 までの乱数が欲しい場合、analogRead()0~1023 を出すと言っても、
その時の静電的・電磁的条件によって 400~500 に偏るかもしれませんし、
起動と同時にスタートボタンを連打するせっかちな坊やに1000ミリ秒もの時間の揺らぎはありません。


暗号化の鍵データ生成等、セキュリティ用途にはまた別格の品質(不確定性・予測不可能性)が求められますが、ゲームや一般用途なら randomSeed()random() で十分です(*5)。

 もう分かっていると思いますが、プログラムは自分で書き、デバッグに苦労してみないと“絶対に”身に付きません。
何度もプログラミングして、虫(バグ)に「君の思考は相変わらず浅はかだね」と言われ続け、それに冷徹に向き合い、論理的に解決することでしか本当のスキルにならないのが人間の性(さが)です。

 ということで、佐藤の最後の親心で、卒業制作です。
楽しんで、苦しんで、頭脳パワーアップして下さい。発表会に期待します。


*1 何より、他人の書いたプログラムを読み解くのは面白くないし、苦行です。
 かと言って、自分で書いてデバッグするのはもっと大変ですが…。
 少なくとも、強い興味があるか、必要に迫られた時でないとムリですね。

*2 あくまでソフトウェア(ライブラリ)的な実装で、マイコンのハードウェア機能ではありません。

*3 オープン入力ピンは、他の電気ノード(電源等)に対してハイインピーダンス(高抵抗)かつ静電容量が小さいために、周辺の電磁ノイズに影響されて電位が揺らぎやすい。
 「フローティング」ともいう。

*4 量子コンピュータで量子乱数が扱えるその日まで…。

*5 簡易な電子機器(イルミネーション制御等)には random() が十分過ぎて、プログラムメモリが1KBしか無いようなマイコン(AVR ATtiny13等)に占めるコード量が数十%と邪魔な場合、適当な乱数列生成関数を書くこともあります。


2. 今月の課題


 <スタートアップ(全コース)>
  特にありません

 <プライマリーコース>
  - オリジナル図形プリント

 <ベーシックコース>
  - オリジナル課題プリント(3面図のみ/設問なし)
  - 上記授業内容を精読する(概ね3年生以上/低学年は補助の下で)

 <ミドルコース>
  - オリジナル課題プリント(3面図+設問)
  - 上記授業内容を精読する

 <アドバンスプログラミングコース>
  - オリジナル課題プリント(見取図+設問)
  - 上記授業内容を精読する

 <プロ3年目コース>
  - 上記授業内容を精読する(該当テキストページを見ながら)
  - 卒業作品を制作する


3. 今後の授業スケジュール


◆八幡東11/3→11/10へ一週ずれます。

――――――――――【佐藤教室長】――――――――――

[東福間]第1・3土原則
   - 13:30~ ベーシック/プライマリ
   - 15:30~ ミドル
   - 17:30~ アドプロ

 ⇒ 10/6, 20,  11/3, 17,  12/1, 15


[東福間プロ]2018年10月・11月
   - 10:00~11:30 卒業制作・発表

 ⇒ 10/14, 28(卒業制作 進捗報告・相談会),  11/11(発表会)


[中間]第2・4土原則<なかまハーモニーホール>
   - 13:30~ ベーシック/プライマリ
   - 15:30~ ミドル
   - 17:30~ アドプロ

 ⇒10/13 第1回 3F会議室2
  10/27 第2回 3F会議室2
  11/10, 24,  12/8, 22


[小倉北]第1・3日原則<ムーブ>
   - 10:00~ ベーシック/プライマリ
   - 13:00~ ミドル
   - 15:00~ アドプロ/ロボプロ1年目

 ⇒10/ 7 第1回 5F小セミ
  10/21 第2回 5F大セミ
  11/4, 18,  12/2, 16


――――――――――【菅本教室長】――――――――――

[とばた]第2・4土原則<ウェルとばた8F>
   - 13:00~ 全コース(プロを除く)

 ⇒ 10/13, 27,  11/10, 24,  12/8, 22


――――――――――【中野教室長】――――――――――

[八幡東]第1・3土原則<レインボープラザ4F>
   - 13:30~ ベーシック/プライマリ
   - 15:30~ ミドル
   - 17:30~ アドプロ

 ⇒ 10/6, 20,  11/10※, 17,  12/1, 15

 ※原則日11/3がレインボープラザ利用不可の為、一週ずらします。


[小倉南]第2・4日原則<総合農事センター2F>
   - 10:30~ ベーシック/プライマリ
   - 13:00~ ミドル  /アドプロ

 ⇒ 10/14, 28,  11/11, 25,  12/9, 23


4. お知らせ

1) ロボット教室 全国大会 リピート放送
 8/25(土) 東京大学 安田講堂で開催されました全国大会2018の放映です。

 CSキッズステーション特別番組(無料)
 ●10/13(土) 13:30~14:00
 ●10/28(日) 15:00~15:30


2) 8月課題 高得点者  []内は教室と学年

 ◆プライマリ【3名平均 図形4.3】
   5点…伊藤[小倉北1], 末吉[小倉北 年長]

 ◆ベーシック【24名平均 図面2.7+設問3.0=5.7】
  10点…柴田[小倉北3], 橋本[小倉南1]
   9点…下木[八幡東3]
   8点…井窪[中間6], 永瀬[中間4], 森崎[八幡東3], 林田[小倉南1]

 ◆ミドル【20名平均 図面2.4+設問1.6=4.0】
  10点…橋本[小倉南4] →偏差値78!
   9点…なし
   8点…なし
   7点…福政[八幡東4]
   6点…田中[東福間6], 荒木[小倉北4]


東福間・中間・小倉北教室 佐藤 / 八幡東・小倉南教室 中野