画像処理型
歯みがきロボコンを前にして、学生さんの画像処理型ロボットが少しづつ 動くようになってきました。 ブラシの部分は、学生さんが「キャタピラの部品がほしい」との話でしたが、 近所に売っている所もなかったので、私の方で歯の曲がり具合に応じて 円弧っぽく動くようなものを作ってみました。
画像処理型といっても、処理速度やアルゴリズムの都合で、画面上の数点の 明るさしか取得していないんですけどね…

構造体の説明
プログラミング応用での後半では、構造体などの複合型とグラフィックスを説明する予定。 特に中間試験までは、構造体・共用体・列挙型といったプログラムのデータ構造の 記述のバリエーションが広がることを目標にする。
構造体の説明といっても、2年生でも一応習っている内容でもあり、 関連する情報なども交えながら解説を行う。 構造体は、COBOL(Common Business Oriented Language:商用向け言語)での、 複合データを記述する考え方から出ている。 同じように、プログラミング言語では、手続きの構造化などの発展と共に、 構造化プログラミング(Structured Programming)に発展する。 データの構造化・処理の構造化は、データに対する処理の記述から、 オブジェクト指向へと発展していく。
構造体が無かったら、プログラムが発展していくときに、面倒が増えるのかといった話題を 説明したあと、実際の文法の説明を行う。 この中で、タグ名(Person) , 要素名(name,kokugo…) といった用語を解説。
struct Person { char name[ 20 ] ; int kokugo ; int sansu ; int rika ; } ; struct Person saitoh ; strcpy( saitoh.name , "Saitoh" ) ; saitoh.kokugo = 59 ;
途中で、タグ名などで変数名と同じルールといっても通じなかったので、 変数名が [A-Za-z_][A-Za-z0-9_]* (正規表現でかくと)といったものが使用可能 であることを説明する。
複合の型の雰囲気を感じてもらうために、構造体の初期化、構造体の入れ子(nesting)、 同一構造体の一括代入などの説明を行う。
構造体の一括代入などは、ANSI-Cなどでの機能であり、K&Rだとダメ…とかいった、 話題をしたので、ちょっと脱線して、JIS規格とかK&R文法などを紹介する。
2分木とヒープ
前期最後の双方向リストの次ということで、2分木の説明を行う。
最初に2分探索法について説明をして、検索処理速度のオーダーが、 で示されることを復習する。 その後、この方法が配列でランダムアクセスが可能で、a[(l+r)/2] が取り出せる からこそ有効であることを説明する。
これを踏まえ、2分木のイメージ図を示した後、ノード(節)とパス(枝)といった用語を説明し、 構造体の宣言を示してから、この概念を説明する。 ひとまず、処理の理解ということで、データ生成と検索処理までを示す。
struct Tree { int data ; struct Tree* left ; struct Tree* right ; } ; struct Tree* tcons( int x , struct Tree*l , struct Tree*r ) { struct Tree* ans ; ans = (struct Tree*)malloc( sizeof( struct Tree ) ) ; if ( ans != NULL ) { ans->data = x ; ans->left = l ; ans->right = r ; } return ans ; } // データは、0..100の値と仮定し、見つからなかったら負 int find( struct Tree* p , int key ) { while( p != NULL ) { if ( p->data == key ) return key ; else if ( p->data > key ) p = p->left ; else p = p->right ; } return -1 ; } void main() { struct Tree* top = tcons( 50 , tcons( 24 , NULL , NULL ) , tcons( 76 , NULL , NULL ) ) ; printf( "%d\n" , find( top , 20 ) ) ; }
この2分木構造では、木の段数がM段あって、木が左右均一であれば、 全データ件数は、 の関係から、
を満たし、処理時間は、
で示される。
ヒープ
2分木の欠点を考えると、データ1件につき、左右のポインタが必要であることから、 32bit コンピュータであれば、sizeof( struct Tree ) は12byte となり、単純な配列1件=4byte と比べればメモリのムダとなる。
この欠点の改善方法として、ヒープと呼ばれる方法がある。

この方法であれば、N番目のデータの左枝は2*N+1、右枝は2*N+2の位置に存在するため、 ポインタが不要となる。
4EI 遠足未体験
今日は、後期の最初の授業ということで、授業前に短いホームルーム時間がとられていた。 まずは、インターンシップ後の提出物や、高専祭の週の保護者面談の希望日程調査の 提出物を回収。4EIは後期実験のガイダンスとなった。
実験ガイダンスが予定より早く終わったので、残りの時間でホームルームの続きを行った。 この際、クラス役員の選挙と、11月の3年工場見学旅行中に行われる遠足を検討してもらった。 ただこの際に、なかなか行先アイデアが出てこない。1,2,3年の時の経験を踏まえれば、 もう少しアイデアが出てくるかと思ったら、担任クラスは色々と不可避なトラブルで、 クラスでのネタがいろいろとつぶれている。
1年生では、4月の新入生オリエンテーションが能登沖地震で、宿泊研修なし。 1年生の遠足は台風で中止。 昨年の3年では、新型インフルエンザで工場見学旅行が延期&3月実施。 みごとなまでにクラス・レクリエーション系で、運が無い。
ということで、遠足の行先決めで、発展的意見がでず議論が発散するので、 希望の行先を考えてくるという宿題にて、一旦ホームルームを終了とした。
データベース・ガイダンス&導入説明
5年後期のデータベース(選択)の授業の最初ということで、 シラバスやガイダンスといった説明の後、データベースの利便性の導入を説明した。
最初に、JABEEで学習・教育目標を決めているけど、本科学生の学習・教育目標が 不明確ということで、本科の内容を少し変更された。特に4,5年生は、 本科学生かつJABEE対象ということで、2つの学習・教育目標(言い回しが微妙に違うだけ) が記載されている。
授業の方針などを話した後、データベースの利便性を説明するために、 1行1件可変長データでは、while+fscanf+if+処理では、シーケンシャルしかできず、 O(N)にしかならない話をする。速度向上のためには、2分探索などが必要であり、 ランダムアクセス機能が重要であることなどを説明する。 データベースシステムを使わない場合、ランダムアクセスをどのようにするかということで、 fseek+freadなどのC言語の関数を説明する。(参考:昨年度の初回内容)
しかしながら、fseek+freadでランダムアクセスのできる処理が書けたとしても、 以下のような問題が残っている。これらの問題が行ないようにするために、 データベースシステムを使わずにプログラムを書こうと思ったら、 プログラマーには大変な負担となる。
- OSが落ちた場合に処理が中途半端にならない原子性(Atomicity)
- データがあってはいけない値にならない整合性(Consistency)
- マルチタスクで複数の問い合わせがあった場合の、排他制御の重要性(Isolation)
- データが消失しない耐久性(Durability)
自律部門ビギナーの部の工作教室
歯みがきロボットコンテストの自律部門のビギナーの部の 参加者対象ということで、 WROに参加した中学生を対象に工作教室を開催した。
講師には、福井工業大学の小沢先生にお願いし、 私は歯ブラシの取り付けを中心に説明を行った。

といっても、WROで車体の組み立てやプログラミングは 経験しているし、自分たちで作っていた車体をベースに 動かしたいという思いもあって、こちらの説明の資料が あんまり役に立たない。 このため、コースに合わせた調整が中心となった。
これとは別に、例年参加してくれている家族の方が 試走および調整に来られた。 リモコンの部も含め、興味深い車体で撮影したものを 掲載したいんだけど、作戦もあるでしょうから ひとまず、ナ・イ・ショ。
NXTのモーターの中身
工作教室の中で、小沢先生がNXTのモータの中が見えるようにしたものを見せてくれた。 興味深いので写真をとる。右側のギアには穴が空いており、フォトインタラプタで回転数が 取れるようになっている。

ROBOLAB
講習会では、プログラムの作成はROBOLABを使っていた。 うちの高専では、NXTソフトウェアを使っており、 ちょっと使い方のインタフェースが違うので、中学生のROBOLABのプログラムは、 横で見ていててよく解らない。 工大の方の動きの説明でのデモを見ていると、ROBOLABの方がループの周回速度は 早そうな雰囲気(1光センサーのライントレースでの頭の振り方がスムーズ)。
NXTソフトウェアでは、「moveの1つのアイコンで2モータへの速度指定ができる」という点では、 解りやすいと思う。しかし、ROBOLABでは、1つのモータ速度指定の定数を、 複数の処理アイコンに接続できるので、便利そう。 あえて言うなら、最近のNXT2.0であれば、35000円の中に、 NXTソフトウェア2.0が含まれている点がお勧めかも。
2010年9月26日(第183回)
スタジオお休みにつき収録でお送りしました!
- IT研究会共同ブログ構想について
LEGO基本ライントレース車体の高速化
LEGO MindStorms NXTのライントレース処理で実験を行った。 プログラムはNXTソフトウェア2.0で記述した。 光センサーが1個しかない場合、白黒の境界に沿って車体をすすめることになるが、 「黒なら左折、白なら右折」の処理だと、 左右に車体を振りながらで余り速い動きにはならない。 NXTソフトウェアのブロック記述ではループ1周の速度も遅いため、 高速移動のために直進性を高めてモータ速度を上げると、 半径30cmほどのカーブでさえ曲がりきれない。 色々と条件を変えてみたけど、安定して半径20cm程を曲がるには、
for(;;) { // 実際はNXTソフトウェアのブロック if ( 光センサ==黒 ) 左前進0%,右前進30% ; else 左前進30%,右前進0% ; }
といったプログラムで、移動を高速化するのは難しい。

NXTソフトウェアでは状態遷移図は辛い…
NXTソフトウェアのループ周期で高速化しようとすると、 連続して黒or白なら高速カーブ、白黒が交互に変化するときは直進性を高めて左右にカーブという処理といった処理がしたくなってきた。 理想的には、状態遷移図で速度制御したいけど、 大人気なくC言語で書くのも気が引けるし、ROBOLABで1万円かけるのもイヤとなると、 状態遷移図的なコードも書きにくい。 色々と試し、以下のようなコードとしてみたら、それなりに高速化ができた。
# 直進時に速度 (30+0)/2 = 15% ⇒ 速度 (30%+50%)/4 = 20%
for(;;) { if ( 光センサ==黒 ) { 左前進0%,右前進30% ; if ( 光センサ==黒 ) 左前進0%,右前進100% ; else 左前進50%,右前進0% ; } else { 左前進30%,右前進0% ; if ( 光センサ==黒 ) 左前進0%,右前進50% ; else 左前進100%,右前進0% ; } }

NXT基本車体にブラシの取付け方法
歯みがきロボコンの自律ビギナー部門のための講習会が開催されるので、 NXTの基本車体にブラシを取り付けてみた。
![]() ローリング方式 |
![]() ワイパー方式 |
小中学生向けの講習会なので、写真だけではダメだろうから、 金曜には取り付けまでの部品のつけ方を1つ1つ写真にとったマニュアルを作ろう。
自律部門工作教室(追記)
明日に工作教室を控え、歯ブラシの取り付け方法の講習会の資料を作った。 基本車体までの作成などの説明は、別途工大の先生が担当なので、 歯ブラシの取り付けのみの資料。 (バドミントンの合宿で夜が暇だったしぃ…) LEGOのマニュアルは、基本組立ての絵が中心で、何をどこに刺すといった文章は 何も書いてないのが基本なので、この資料もそれを見習ってみた。(「文章書くのが面倒くさいんだろう」ってことは言いっこなし) 自宅用の一眼レフが大活躍(^_^;