ホーム » 2010 » 9月

月別アーカイブ: 9月 2010

2010年9月
« 8月   10月 »
 1234
567891011
12131415161718
19202122232425
2627282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

画像処理型

歯みがきロボコンを前にして、学生さんの画像処理型ロボットが少しづつ 動くようになってきました。 ブラシの部分は、学生さんが「キャタピラの部品がほしい」との話でしたが、 近所に売っている所もなかったので、私の方で歯の曲がり具合に応じて 円弧っぽく動くようなものを作ってみました。

画像処理型といっても、処理速度やアルゴリズムの都合で、画面上の数点の 明るさしか取得していないんですけどね…

1009301813_320x240.jpg

構造体の説明

プログラミング応用での後半では、構造体などの複合型とグラフィックスを説明する予定。 特に中間試験までは、構造体・共用体・列挙型といったプログラムのデータ構造の 記述のバリエーションが広がることを目標にする。

構造体の説明といっても、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 と比べればメモリのムダとなる。

この欠点の改善方法として、ヒープと呼ばれる方法がある。

図出典Wikipedia

この方法であれば、N番目のデータの左枝は2*N+1、右枝は2*N+2の位置に存在するため、 ポインタが不要となる。

4EI遠足はふくい健康の森でバーベキュー

授業を少し早目に終えて、昨日のホームルームの続きということで、 遠足の場所決め。最終的には、ふくい健康の森バーベキューということになった。 ルートを確認すると、神明駅からの7Kmが徒歩で一番近いみたい。


大きな地図で見る

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に参加した中学生を対象に工作教室を開催した。

講師には、福井工業大学の小沢先生にお願いし、 私は歯ブラシの取り付けを中心に説明を行った。

1009262346_314x235.jpg

といっても、WROで車体の組み立てやプログラミングは 経験しているし、自分たちで作っていた車体をベースに 動かしたいという思いもあって、こちらの説明の資料が あんまり役に立たない。 このため、コースに合わせた調整が中心となった。

これとは別に、例年参加してくれている家族の方が 試走および調整に来られた。 リモコンの部も含め、興味深い車体で撮影したものを 掲載したいんだけど、作戦もあるでしょうから ひとまず、ナ・イ・ショ。

NXTのモーターの中身

工作教室の中で、小沢先生がNXTのモータの中が見えるようにしたものを見せてくれた。 興味深いので写真をとる。右側のギアには穴が空いており、フォトインタラプタで回転数が 取れるようになっている。

1009262346_304x235.jpg

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の基本車体にブラシを取り付けてみた。

1009221704_240x320.jpg
ローリング方式
1009221702_240x320.jpg
ワイパー方式

小中学生向けの講習会なので、写真だけではダメだろうから、 金曜には取り付けまでの部品のつけ方を1つ1つ写真にとったマニュアルを作ろう。

自律部門工作教室(追記)

明日に工作教室を控え、歯ブラシの取り付け方法の講習会の資料を作った。 基本車体までの作成などの説明は、別途工大の先生が担当なので、 歯ブラシの取り付けのみの資料。 (バドミントンの合宿で夜が暇だったしぃ…) LEGOのマニュアルは、基本組立ての絵が中心で、何をどこに刺すといった文章は 何も書いてないのが基本なので、この資料もそれを見習ってみた。(「文章書くのが面倒くさいんだろう」ってことは言いっこなし) 自宅用の一眼レフが大活躍(^_^;