[[2009a]]

*目次 [#i268889c]
#contents
*課題 [#o9dbc396]
**課題2:黒い線に沿って動くロボット † [#xe0c86ff]
各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい) 
~2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む 
~3,最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む (紙パックはコース外に押し出してよい)
ただし、

速さと正確さを追求すること 
コースを3周したら自動的に止まること
余力のあるチームはさらに以下の機能を追加せよ。

交差点で2台のロボットが遭遇した場合には後から交差点入ったロボットが、一時停止してもう一方のロボットが行き過ぎるのを待つこと 
前方にあるもう一台のロボットに接触した場合には停止して距離が十分離れるのを待つこと
注意:コースラインの幅は15〜25mm*くらい*としてますが,あまり太くしない限り制限はしていません.ちなみに過去のロボコンコースレイアウトは25mm幅で制作してきました.
~~ロボティクス入門ゼミTop / 2009a / 練習問題 / 課題2より抜粋~

*ロボット [#xe0e2b26]
**コンセプト [#fdc2eaa4]
**製作過程 [#s9e87b96]
**車体 [#kc26b6fa]
#ref(front.png)
~前から見たらこんな感じです。シンプルなルックス!
#ref(back.png)
~フロントにいろんな部品を付けたためフロントが重くなりすぎて前かがみになってしまったので、前後のバランスをよくするために、リアにバラストの役割でタイヤ2つをつけたのです!!
**足回り [#yc6bd90c]
**タッチセンサー [#j25473b7]
#ref(touch.png)
~紙パックやほかの障害物に反応しやすいようにするために取り付け位置を試行錯誤しました。
#ref(light.png)
**はさむor運ぶ!? [#ec16b4e4]
--[[2009a/A7/課題2左/robot]]
*課題への取り組み [#m58c9ede]
**コース紹介 [#i9a0b015]
当初、Hauntは鈴鹿サーキットをもとにコースレイアウトを行ったが、途中で挫折…
~Fe2+に任すもいまいちの出来にリナ様もご立腹。。悩んだ結果、コースが完成!
~なんと…所要時間3時間!!!交差点は4つ!!!!!
#ref(course1.png)

**課題の選択 [#i565a5d5]
今回Hauntは課題2-2、Fe2+は課題2-1に取り組んだ。
**紙パックの対処方法 [#t686d42e]
***Haunt [#se850cab]
***Fe2+ [#h24f797a]

--[[2009a/A7/課題2左/kadai]]
*プログラム [#qa7573b1]
--[[2009a/A7/課題2左/Haunt]]
--[[2009a/A7/課題2左/nitetu]]

***Hauntのプログラム [#cb187384]
 #define T 40
 #define Run_time 200
 #define a OUT_A                   
 #define c OUT_C                  
 #define s1 SENSOR_1
 #define s2 SENSOR_2
 #define s3 SENSOR_3
 int flag = 0;
 int t = 0;
 #define fwd(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define rev(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define w(t) Wait(t);
 task main()
 {
 SetSensor(SENSOR_2,SENSOR_TOUCH); 
 start light;                      
 while(true){
 if((s2 == 1)&&(FastTimer(0)<400)){
 stop light;
 fwd(100);
 OnFwd(OUT_A);
 OnRev(OUT_C);
 Wait(160);
 rev(50);
 OnFwd(c);
 OnRev(a);
 w(100);
 rev(20)
 start light;
 }
 else{ 
 if(SENSOR_2 == 1){               
 stop light;
 ClearTimer(0);                       
 Off(OUT_A+OUT_C);Wait(50);        
 OnRev(OUT_A+OUT_C); Wait(100);   
 Off(OUT_A+OUT_C);Wait(50);        
 start light;
 }                      
 }
 }
 }
 task light()
 {
 OnFwd(OUT_A+OUT_C);                              
 SetSensor(s1,SENSOR_LIGHT);  
 SetSensor(s3,SENSOR_LIGHT);
 ClearTimer(0);
 while(flag < 9){      
 if(s1>T){                    
 if(s3>T){
 OnFwd(c);
 OnFwd(a);
               }
 else{
 if(s1>T){                    
 OnFwd(a);
 OnRev(c);
 Wait(5);
 Off(OUT_C+OUT_A);
               }
     }
               }
 else{
 if(s3>T){                   
 OnFwd(c);
 OnRev(a);
 Wait(5);
 Off(a+c);
               }
 else{
 flag++;
 Off(a);                      
 Off(c);
 Wait(100);
 OnFwd(c);
 OnFwd(a);
 Wait(30);
     }
               }
      }
 while (true) {if (s1 < T) {
 if(s3 < T){
 Off(a + c);
 Wait(50);
 OnFwd(a+c);
                 }
 else {
 Off(a); 
 OnFwd(c);
      }
   }
               }
 }


***Fe2+のプログラム [#j381207a]
 #define T 40
 #define Run_time 200
 #define a OUT_A                   
 #define c OUT_C                  
 #define s1 SENSOR_1
 #define s2 SENSOR_2
 #define s3 SENSOR_3
 int flag = 0;
 #define fwd(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define rev(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define w(t) Wait(t);
 task main()
 {
 SetSensor(SENSOR_2,SENSOR_TOUCH); 
 start light;                      
 while(true){
 if((s2 == 1)&&(FastTimer(0)<400)){
 stop light;
 rev(50);
 OnFwd(a);
 OnRev(c);
 w(45);
 fwd(65);
 OnFwd(c);
 OnRev(a);
 w(25);
 fwd(20);
 start light;}
 else{ 
 if(SENSOR_2 == 1){               
 stop light;
 ClearTimer(0);                       
 Off(OUT_A+OUT_C);Wait(50);        
 OnRev(OUT_A+OUT_C); Wait(100);   
 Off(OUT_A+OUT_C);Wait(50);        
 start light;
 }                      
 }
 }
 }
 task light()
 {
 OnFwd(OUT_A+OUT_C);                              
 SetSensor(s1,SENSOR_LIGHT);  
 SetSensor(s3,SENSOR_LIGHT);
 ClearTimer(0);
 while(flag < 13){      
 if(s1>T){                    
 if(s3>T){
 OnFwd(c);
 OnFwd(a);
               }
 else{
 if(s1>T){                    
 OnFwd(a);
 OnRev(c);
 Wait(5);
 Off(OUT_C+OUT_A);
               }
     }
               }
 else{
 if(s3>T){                   
 OnFwd(c);
 OnRev(a);
 Wait(5);
 Off(a+c);
               }
 else{
 Off(a);                      
 Off(c);
 Wait(100);
 flag++;
 OnFwd(c);
 OnFwd(a);
 Wait(50);
     }
               }
      }
 while (true) {if (s1 < T) {
 if(s3 < T){
 Off(a + c);
 Wait(50);
 OnFwd(a+c);
                 }
 else {
 Off(a); 
 OnFwd(c);
      }
   }
               }
 }

*まとめ [#u54360ab]
**Haunt [#g5bc9be4]
今回は、前回の反省を活かして早くからスタートして最初はうまくいっていたのですが、途中から2人ともほかのゼミ等で忙しく時間をかけることが出来ずに最終的に強引に形にして、完成としてしまいました。したがって改善の余地はまだまだあるとおもいます。しかし、今回の課題でも多くのことを学びました。Fe2+も言っているように自分の思う通りにロボットが動かない時に、プログラムが悪いのか、ロボットが悪いのかという判断を下すということです。ただこの過程に至るには、あるコンセプトのもとにある程度の形を作ってからです。この過程をすぐにやってしまって、そこからは妥協せずに自分のめざす動きにむけて微調整していく。この部分に多くの時間をかけれるようにしていかねばなりません。
**Fe2+ [#ne3037dd]
[[2009a/A7/課題2左#Haunt]]
[[Fe2+]]
今回ロボット制作で一番苦労したことは、プログラムでした。ロボットの組み方をプログラムで補おうとしたところ、プログラムが複雑になってしまい失敗でした。むしろロボットの少しの改良でプログラムは何倍も簡単になったと思います。次からはプログラムだけでなく、ロボットの仕組みのほうも率先的に改造してみたい思います。


*コメント [#dc0565bf]
- ロボットとプログラムの説明が良くできています。プログラムに、ンデント(ifなどの階層ごとに行う字下げ)を入れてもらうと、見やすいです。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。  -- [[こさか]] &new{2009-07-02 (木) 22:42:54};
- ×「ンデント」 → ○「インデント」 です…すみません -- [[こさか]] &new{2009-07-02 (木) 22:56:03};
-プログラムにもう少し詳しい説明がほしいです。流れをわかりやすくするためにフローチャートを使ったり、図などを使わないとわかりにくいところがいくつかあります。

if((s2 == 1)&&(FastTimer(0)<400)){ //もしセンサー2が反応してすぐ4秒以内にまたセンサー2が反応したら (牛乳パックと認識して)  

等々です。-- [[FI]] &new{2009-07-03 (金) 05:15:28};

#comment
コメントをお願いします。
CENTER:Today&counter(today);
CENTER:Yesterday&counter(yesterday);
CENTER:All&counter(all);


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS