自律協調分散

自律協調分散システム

自律協調分散とは
LEGO MINDSTORMSを用いて自律協調分散システムを作る。
現在はそれを複数台使い音楽を再生し伴奏もするシステムを作成しようとしている。


12/15
論文:音楽レコーダーのアルゴリズム

1.リーダー選挙
  音楽を合唱するので指揮者となるリーダーを決める。
  条件としてすべてのRCXは同じプログラムのため、どのRCXも
  リーダーになる可能性がある。これを実現するために0~1000の乱数sを用いる。

  例としてRCX3台を使用し無限ループで乱数sを発生させる。もし乱数sが200と
  なった場合、そのRCXがリーダーとなる。
(ここではRCX1がリーダーになったとする)
  リーダーになったRCX1は、まだ乱数sを発生させているRCX2・3の無限ループを
  停止させる。(メッセージ送受信機能を用いる)止められたRCX2・3は最後に
  発生させた乱数をsにストックさせる。


2.リーダー以外の役割決め(ベース・アルト・ソプラノ)
  メロディを良くするために伴奏としてベース・アルト・ソプラノ使用する。
  リーダー選挙同様、役割を事前に決めてしまうことはできないので、
  ストックさせたsの数値を使用する。このsの数値が低い順番にベース・
  アルト・ソプラノとする。
  ここで問題があり構造上RCX同士のデータ転送・比較ができない。
  そこでRCX2・3には乱数s*1秒待機させることにする。
  2台のRCXが待機している間、RCX1はメッセージ(このメッセージを
  受信したらベースになってくれという命令)を送り続けている。このメッセージは、
  他のRCXから「ベースを担当します!」というメッセージが送られてくるまで、
  送り続ける。
  そしてRCX2・3のどちらか(乱数sが小さな方)が先に待機時間を
  終えることになる。(RCX2とする)するとRCX2はRCX1からの
  メッセージを受信し、ベースを担当することになる。そしてすぐにRCX2は
  RCX1にメッセージを送る。(「ベースを担当します!」というメッセージ)
  ここからは同じ方法でRCX1はアルトメッセージを「アルトを担当します!」と
  いうメッセージを受信するまで、送信し続ける。
  何秒か経つとRCX3の待機時間も終わり、アルトメッセージを受け、
  担当決定メッセージを送信して、すべてのRCXの役割が決定することになる。

3.同時に音楽データを読み取るためRCX同士の同期を行う
  RCX2・3の役割が決定した後、RCX1はRCX4があるかもしれない
  ということで最大乱数1000の待機時間が終えるまでソプラノ命令を送っている。
  反応がなければ自動で役割命令を終えることになる。
  この時点ですべてのRCXには差ができてしまうので同期が必要になる。
  同期をとる方法として、確実にいえる事はRCX1が一番最後になっているということ。
  ベース・アルトを担当するRCX2・3は担当が決まった後、RCX1からの
  同期メッセージが送られてくるまで待機させておく。
  そして最高待機時間を終えたRCX1がRCX2・3に同期メッセージを送れば
  RCX1・2・3は同じタイミングになるので、同時に音楽データの読み取りを
  行う準備が完了する。

ここまでをプログラムを使って説明

for(;;){ /* 無限ループ
     s=Random(1000);        /* 乱数を発生させ変数sに代入
     if(s==200) {           /* 乱数が200と一致 :リーダー
        y=1;             /* リーダーは変数yに1を変数codeには5を代入
        code=5;
       break;
     }
     if(Message()==9){     /* リーダーからの無限ループ終了命令(9を受信)
           y=2;            /* リーダー以外は変数yに2を代入
           break;
     }
   }

  if(y==1) {    /* ここからはリーダーのプログラム
     ClearMessage();
    for(i=1; i<=20; i++) {SendMessage(9);} /* 無限ループ終了命令
     Wait(30);
     for(j=1; j<=500; j++){     /* 役割メッセージの限界送信時間の設定
          ClearMessage();
        for(i=1; i<=7; i++) {SendMessage(n);} /* 役割の送信 n=1=ベース,2=アルト
          Wait(10);
        if(Message()==8) n++;  /* 担当決定メッセージを受信したらn+1
     }
     ClearMessage();
     for(i=0; i<=2; i++){SendMessage(7);}  /* データ読みの前の同期
  }

  if(y==2) {       /* ここからはリーダー以外のRCXのプログラム
     for(i=1; i<=s; i++) { Wait(10); }  /* 待機時間
     ClearMessage();
     until(Message() != 0);             /* メッセージnを受信
     code=Message();     /* メッセージnをcodeに代入、code=1=ベース、2=アルト
     for(i=1; i<=30; i++) {SendMessage(8);} /* 担当決定メッセージの送信
     ClearMessage();
     until(Message()==7);      /* 同期メッセージ7を受信するまで待機
  }













(大まかな流れ)

平成十九年度 卒業論文
自律協調分散システム

目次
第一部 序章 
  • 目的(きっかけ)
  • NQC

第二部 自律協調分散システム
  • はじめに
第1章「」
  ・「」
  ・まとめ

第三部 NQCの仕様説明
  • NQCの概要
第1章 NQCの基本プログラム
  • 「」
  • 「」
  • まとめ
第2章 応用プログラム
  • 「」
  • 「」
  • まとめ
第3章 通信プログラム
  • 「」
  • まとめ
第4章 同期プログラム
  • 「」
  • まとめ

第四部 自律協調分散システムのアルゴリズム
  • 自律協調分散システムの条件
      ・
      ・
      ・
  • アルゴリズム
  • まとめ

第五部 考察・まとめ
  • 考察
  • まとめ(今後の課題)

  • 参照文献
  • 付録(NQCの手引き、プログラム)


(詳細)
第一部 序章(はじめに)
  • 目的(きっかけ)
  • 簡単な自律協調分散システムの説明
  • LegoMindStorms の説明
  • NQC (Bricx CC)の説明

第二部 自律協調分散システム
  • はじめに
  • 自律協調分散システムの具体的な説明
(プレゼンに似たもの)

第三部 NQCの仕様解説
  • NQCの概要
  • NQCの基本プログラム
 ・for
  ・if else 
 ・while
 ・switch
 ・モーター制御
 ・光・タッチセンサー
  • NQCの応用プログラム
 ・タスク
 ・音楽
 ・通信
  • NQCの同期プログラム
 ・通信を使った同期方法を説明

第四部 音楽レコーダーのアルゴリズム
  • 音楽レコーダの仕様解説
 ・伴奏の説明
 ・全体の流れを説明(流れ図)
  • システム条件
 ・すべてのRCXを平等にするため、同一のプログラムを使用
 ・音楽を合唱するため指揮者となるリーダーを選出
 ・どのRCXでもリーダー・ベース・アルト・ソプラノを担当できる
 ・同一の読み取りのデータ
 ・データ読み取り後、リーダーが同期を取り再生
 ・リーダーが不在となった場合、再度リーダー選出を行う。
  • 部分的なプログラムを使用したアルゴリズムの説明

第五部 考察・まとめ
  • 考察
  • まとめ(今後の課題)

参考文献
  • 伊藤 正美
  • 市川 惇信 :「自律分散宣言」
  • 須田 信英

  • 長田 正  :「自律分散をめざすロボットシステム」
  •  森 欣司 :「自律分散システム入門」
  • 伊藤 宏司 :「知の創発」

付録(NQCの手引き・プログラム)
参考サイト:http://yakushi.shinshu-u.ac.jp/robotics/?NQC%C6%FE%CC%E7




プログラム

12/7


※引き継ぎプログラム

1207 始〜終+引継ぎPG




int a=0,a1=0,a2=0,a3=0,a4=0,c1=0,c2=0,c3=0,c4=0,
   f1=0,f2=0,f3=0,f4=0,g1=0,g2=0,g3=0,g4=0;
int j=0,c=0,f=0,g=0,n=1,i,k,s,z,code,d=0,x=0,y=0;

sub finish()
{
  switch(code) {
       case(1): z=0;
                if(c>=f && c>=g) z=1;
                if(f>c && f>=g)  z=2;
                if(g>c && g>f )  z=3;
                for(i=1; i<=4; i++){
                  switch(z){
                    case 1: PlayTone(131,70); break;
                    case 2: PlayTone(175,70); break;
                    case 3: PlayTone(196,70); break;
                    default : break;
                  }

                }
                break;

       case(2):  z=0;
                 if(c>=f && c>=g) z=1;
                 if(f>c && f>=g)  z=2;
                 if(g>c && g>f )  z=3;
                 for(i=1; i<=4; i++){
                   switch(z){
                      case 1: PlayTone(330,70); break;
                      case 2: PlayTone(440,70); break;
                      case 3: PlayTone(494,70); break;
                      default : break;
                    }

                 }
                 break;

       case(3):   z=0;
                  if(c>=f && c>=g) z=1;
                  if(f>c && f>=g)  z=2;
                  if(g>c && g>f )  z=3;
                  for(i=1; i<=4; i++){
                     switch(z){
                       case 1: PlayTone(784,70); break;
                       case 2: PlayTone(1047,70);break;
                       case 3: PlayTone(1175,70);break;
                       default : break;
                     }

                   }
                   break;

       case(5):    for(i=1; i<=4; i++){
                      OnFwd(OUT_A);
                      x=d/1000;
                      switch(x) {
                        case(1): PlayTone(1047,52);Wait(25);break;
                        case(2): PlayTone(1175,52);Wait(25);break;
                        case(3): PlayTone(1319,52);Wait(25);break;
                        case(4): PlayTone(1397,52);Wait(25);break;
                        case(5): PlayTone(1568,52);Wait(25);break;
                        case(6): PlayTone(1760,52);Wait(25);break;
                        case(7): PlayTone(1976,52);Wait(25);break;
                        case(8): PlayTone(2093,52);Wait(25);break;
                        default: break;
                       }
                       d=d%1000;
                       if(d==0) break;
                       d=d*10;

                    }
                    break;

       default:  break;
  }
}



sub data()
{
  for(i=1; i<=4; i++){
        for(j=1; j<=30; j++)   {OnFwd(OUT_A);}

        if(i==0) {
             if(SENSOR_1 > 43 && SENSOR_2 > 43 && SENSOR_3 > 43) 
		{a=1; c+=2; f+=1;}
             if(SENSOR_1 > 43 && SENSOR_2 > 43 && SENSOR_3 < 43)
		{a=2; f+=1; g+=1;}
             if(SENSOR_1 > 43 && SENSOR_2 < 43 && SENSOR_3 > 43) 
		{a=3; c+=1;}
             if(SENSOR_1 > 43 && SENSOR_2 < 43 && SENSOR_3 < 43) 
		{a=4; f+=2;}
             if(SENSOR_1 < 43 && SENSOR_2 > 43 && SENSOR_3 > 43) 
		{a=5; c+=1; g+=2;}
             if(SENSOR_1 < 43 && SENSOR_2 > 43 && SENSOR_3 < 43) 
		{a=6; f+=1;}
             if(SENSOR_1 < 43 && SENSOR_2 < 43 && SENSOR_3 > 43) 
		{a=7; g+=2;}
             if(SENSOR_1 < 43 && SENSOR_2 < 43 && SENSOR_3 < 43) 
		{a=8; c+=1; f+=1;}
             Off(OUT_A);
             PlaySound(1);
        }

        else{
             if(SENSOR_1 > 43 && SENSOR_2 > 43 && SENSOR_3 > 43)
                     {  a*=10; a+=1; c+=2; f+=1; }
             if(SENSOR_1 > 43 && SENSOR_2 > 43 && SENSOR_3 < 43)
                     {  a*=10; a+=2; f+=1; g+=1; }
             if(SENSOR_1 > 43 && SENSOR_2 < 43 && SENSOR_3 > 43)
                     {  a*=10; a+=3; c+=1; }
             if(SENSOR_1 > 43 && SENSOR_2 < 43 && SENSOR_3 < 43)
                     {  a*=10; a+=4; f+=2; }
             if(SENSOR_1 < 43 && SENSOR_2 > 43 && SENSOR_3 > 43)
                     { a*=10;  a+=5; c+=1; g+=2; }
             if(SENSOR_1 < 43 && SENSOR_2 > 43 && SENSOR_3 < 43)
                     {  a*=10; a+=6; f+=1; }
             if(SENSOR_1 < 43 && SENSOR_2 < 43 && SENSOR_3 > 43)
                     {  a*=10; a+=7; g+=2; }
             if(SENSOR_1 < 43 && SENSOR_2 < 43 && SENSOR_3 < 43)
                     {  a*=10; a+=8; c+=1; f+=1; }
             Off(OUT_A);
             PlaySound(1);
        }Wait(400);
  }
}



task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  SetSensor(SENSOR_3,SENSOR_LIGHT);
  
  ClearMessage();
  for(;;){
     s=Random(1000);
     Wait(5);
     if(s==500) {
           y=1;
           code=5;
           OnFwd(OUT_A);
           break;
     }
     if(Message()==9){
           y=2;
           break;
     }
   }

  if(y==1) {
     ClearMessage();
     for(i=1; i<=20; i++) {SendMessage(9);}
     Wait(30);
     for(j=1; j<=500; j++){
          ClearMessage();
          for(i=1; i<=7; i++) {SendMessage(n);}
          Wait(10);
          if(Message()==8) n++;
     }
     ClearMessage();
     for(i=0; i<=2; i++){SendMessage(7);}
     Off(OUT_A);
  }

  if(y==2) {
     for(i=1; i<=s; i++) { Wait(10); }
     ClearMessage();
     until(Message() != 0);
     code=Message();
     for(i=1; i<=30; i++) {SendMessage(8);}
     ClearMessage();
     until(Message()==7);
     Off(OUT_A);
     }

  Wait(500);
  for(k=1; k<=4; k++) {
     a=0; c=0; f=0; g=0;
     switch(k) {
        case(1): data(); a1=a; c1=c; f1=f; g1=g; break;
        case(2): data(); a2=a; c2=c; f2=f; g2=g; break;
        case(3): data(); a3=a; c3=c; f3=f; g3=g; break;
        case(4): data(); a4=a; c4=c; f4=f; g4=g; break;
        default: break;
      }
  }
  Wait(300);
  PlaySound(2);
  Wait(500);
  
  if(code==5) {
       ClearMessage();
       for(i=1; i<=200; i++) {SendMessage(6);}
  }

  else {
     ClearMessage();
     for(i=1;i<=10; i++) {Wait(1);}
     if(Message() != 6) {
         ClearMessage();
         for(i=1; i<=s; i++) { Wait(10);}
         if(Message() == 0) {
             code=5;
             ClearMessage();
             for(i=1; i<=300; i++) {
                 for(j=1; j<=7; j++) {SendMessage(1);}
                 Wait(10);
             }
         }
     }
  }

  if(code==5) {
     OnFwd(OUT_A);
     ClearMessage();
     for(i=1; i<=2; i++){SendMessage(2);}
  }

  else{
     ClearMessage();
     until(Message()==2);
  }

  for(k=1; k<=4; k++){
     d=0; c=0; f=0; g=0;
     Wait(60);
     switch(k){
        case(1): d=a1; c=c1; f=f1; g=g1; finish(); break;
        case(2): d=a2; c=c2; f=f2; g=g2; finish(); break;
        case(3): d=a3; c=c3; f=f3; g=g3; finish(); break;
        case(4): d=a4; c=c4; f=f4; g=g4; finish(); break;
        default: break;
      }
     }
     Off(OUT_A);
     Wait(1000);
}
最終更新:2007年12月15日 16:24
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。