プログラミングの楽しさ2007/09/03 23:50

画面コピーです。
 ロボちゃんがほぼ完成したので、ビジュアルCLIKE言語の習得に励んでいる。
 大きな構造のプログラムを作る場合には、モジュール化がやりやすい。
 Main→Behavior1→Procedure1→Procedure2→Procedure3と階層構造となっている。
 実行領域は、Behavior1が中心で、サブルーチンとして、Procedure1~3までが呼び出されるしかけ。
 Procedure1は、音声の方向を探知してその方向にロボット本体を向ける
 Procedure2は、視覚領域を規定して、そのプロット領域から物体の動きを察知し、方向を探知、告げる。
 Procedure3は、超音波センサーによる物体接近を探知して、「さわらないで下さい!」と発生させるモジュールである。
 プログラムづくりは、今から23年前にシンクレアZX81で最初に簡易ベーシックプログラムを始めて、PC9801の時期には、QWICKBASICで構造化したプログラムを作成して、MS-DOSのEXEファイルにコンパイルして、更にバッチファイルを作成して、輸入通関実績のデータの統計表を作成する等の職務に活用していたが、ウインドウズ時代に入って、市販のアプリケーション以外に使わなくなり、やめていた。マクロとかもあんまり興味を持たなかった。
 佛教大学の修士論文を04年に提出したが、その際に源氏物語全文をテキストファイルに入力して、文章心理学と統計学の技術を応用して分析を試みたが、その際に、必要データを抽出する為に、BASICW32でテキストファイルの加工・分析ソフトを作成したが、作業時間の著しい短縮に貢献した。
 しかし、プログラムを作成して、その通りにロボットが動作する感激は、最初にプログラムを作成した時に共通するものであり、久しぶりにプログラムの楽しさを味わっている。
 以下は、モジュール化されたロボットの感情表現のプログラムのソースコードである。
/**
*
* @author
* @version 1.0
*/

#include "c-like.h"
#include "robot.h"


counter Counter1 = new(counter);

declare( behavior(Behavior1) );

void Procedure1();
void Procedure2();
void Procedure3();

define( behavior(Main))
{
set(Counter1,1);
while (get(Counter1) < 10)
{
inc(Counter1,1);
lcd_write_int(1,1,get(Counter1));
start(Behavior1);
}
set(Counter1,1);
}

define( behavior(Behavior1) )
{
lcd_write_string(1,1,"Hello!");
Procedure1();
Procedure2();
Procedure3();
led_off(LED_ALL);
}

void Procedure1()
{
sound_follower(true);
lcd_clear();
lcd_write_string(1,1,"pr1 sound dirction");
local(sound_dir) = wait_for (sound_dir, update);
switch (local(sound_dir))
{
case SOUND_DIR_BACK:
break;

case SOUND_DIR_LEFT:
rotate(-50);
left_arm_r(15);
head_pan_r(-1);
head_pan_r(-1);
led_on(LED_YELLOW_LEFT);
head_pan_r(1);
left_arm_r(-15);
rotate(50);
break;

case SOUND_DIR_CLEFT:
break;

case SOUND_DIR_CENTER:
head_tilt_r(1);
head_tilt_r(-1);
led_blink(LED_YELLOW);
break;

case SOUND_DIR_CRIGHT:
break;

case SOUND_DIR_RIGHT:
right_arm_r(15);
head_pan_r(1);
head_pan_r(1);
led_on(LED_YELLOW_RIGHT);
head_pan_r(-1);
right_arm_r(-15);
break;

default:
rotate(50);
left_arm_r(1);
left_arm_r(-1);
right_arm_r(1);
right_arm_r(1);
left_tool(true);
left_tool(false);
rotate(-50);
break;

}
sound_follower(false);
lcd_clear();
}

void Procedure2()
{
lcd_clear();
vision_follower(true);
set_tracking_color(254,167,146,30);
lcd_write_string(1,1,"pr2 visual direction");
led_on(LED_YELLOW_RIGHT);
led_on(LED_YELLOW_LEFT);
led_on(LED_GREEN);
local(vision) = wait_for (vision, update);
switch (get_tracking_area(local(vision)))
{
case TOP_LEFT:
left_arm_r(15);
left_arm_r(-15);
head_pan_r(-1);
head_pan_r(-1);
led_blink(LED_YELLOW);
led_off(LED_ALL);
head_pan_r(1);
head_pan_r(1);
say_phrase(139);
say_phrase(23);
break;

case TOP:
head_tilt_r(1);
led_blink(LED_YELLOW);
led_blink(LED_YELLOW);
led_off(LED_ALL);
led_blink(LED_GREEN_RIGHT);
break;

case TOP_RIGHT:
right_arm_r(15);
right_arm_r(-15);
head_pan_r(1);
head_pan_r(1);
led_blink(LED_YELLOW);
led_off(LED_ALL);
head_pan_r(-1);
head_pan_r(-1);
say_phrase(139);
say_phrase(24);
break;

case LEFT:
left_arm_r(15);
left_arm_r(-15);
head_pan_r(-1);
head_pan_r(-1);
led_blink(LED_YELLOW);
led_off(LED_ALL);
head_pan_r(1);
head_pan_r(1);
say_phrase(139);
say_phrase(23);
break;

case CENTER:
head_tilt_r(1);
head_tilt_r(-1);
led_blink(LED_YELLOW);
led_blink(LED_YELLOW);
led_off(LED_ALL);
led_blink(LED_GREEN_RIGHT);
break;

case RIGHT:
right_arm_r(15);
right_arm_r(-15);
head_pan_r(1);
head_pan_r(1);
led_blink(LED_YELLOW);
led_off(LED_ALL);
head_pan_r(-1);
head_pan_r(-1);
say_phrase(139);
say_phrase(24);
break;

case BOTTOM_LEFT:
right_arm_r(15);
right_arm_r(-15);
head_pan_r(1);
head_pan_r(1);
led_blink(LED_YELLOW);
led_off(LED_ALL);
head_pan_r(-1);
head_pan_r(-1);
say_phrase(139);
say_phrase(24);
break;

case BOTTOM:
head_tilt_r(-1);
led_blink(LED_YELLOW);
led_blink(LED_YELLOW);
led_off(LED_ALL);
led_blink(LED_GREEN_RIGHT);
break;

case BOTTOM_RIGHT:
right_arm_r(15);
right_arm_r(-15);
head_pan_r(1);
head_pan_r(1);
led_blink(LED_YELLOW);
led_off(LED_ALL);
head_pan_r(-1);
head_pan_r(-1);
say_phrase(139);
say_phrase(24);
break;

default:
led_blink(LED_YELLOW);
head_tilt_r(1);
head_tilt_r(-1);
led_blink(LED_YELLOW);
led_off(LED_ALL);
break;

}
vision_follower(false);
lcd_clear();
}

void Procedure3()
{
lcd_clear();
lcd_write_string(1,1,"pr3 usound");
local(proximity) = wait_for (proximity, max_change);
say_phrase(99);
say_temperature();
}

コメント

トラックバック