RobocupSSLのメイン基板白mbedのプログラム

Dependencies:   mbed

Rootsロボット mainプログラム

~ Robocup SSL(小型車輪リーグ)ロボット ~


Robocup SSLとは


●試合構成
Robocup小型ロボットリーグ(Small Size League)は,直径180[mm],高さ150[mm]以内のサイズのロボット6台が1チームとなり,オレンジ色のゴルフボールを使ってサッカー競技を行う自立型ロボットコンテストである. フィールドの上には2台のWebカメラが設置され,フィールド上のロボットとボールを撮影する.Visionサーバは,フィールドの画像データよりロボットとボールの座標データを算出し,LANを用い各チームのAI用PCに送信する.Webカメラの撮影速度は,60[fps]である.レフリーボックスは,ファウルやフリーキック,スローインなどの審判の判定を入力し,LANを通じて各チームのAI用PCに送信する.それぞれのチームのAI用PCは,ロボットとボールの座標,審判の判定を元にロボットの移動,キックなどの作戦を決定し,無線によってロボットに指令を送信する. 700


ロボット機能紹介


●オムニホイールによる方向転換不要の全方位移動

オムニホイールは,自由に回転可能なローラをホイールの外周上に配置した車輪である.ローラの回転により,車輪の回転と垂直の方向に駆動力を発することはできないが移動は可能となる.各車輪の角速度を調整することによって全方向への移動を可能にする.
400

●ドリブルバーのバックスピンによるボール保持

●電磁力を利用したキッカー

●キッカーの電磁力エネルギーを充電する充電回路

●ロボット情報が一目でわかるLCD

Revision:
21:d18c2dfaaba4
Parent:
20:354ed2681d0a
Child:
22:653b40db5a60
--- a/mode/operation_check/operation_check.cpp	Mon May 29 16:45:16 2017 +0000
+++ b/mode/operation_check/operation_check.cpp	Tue May 30 13:56:15 2017 +0000
@@ -34,7 +34,9 @@
  charge_flag(0),
  kick_flag(0),
  power(0),
- ball(0)
+ ball(0),
+ vel_value(0),
+ vel_angle(0)
 {    
 }
  
@@ -45,25 +47,30 @@
         case SELECT:
         selectCheckMode();
         viewSelect();
+        resetValue();
         break;
         
         case WHEEL: 
-        sprintf(str,"WHEEL");
+        //sprintf(str,"WHEEL");
+        checkWheel();
         checkBack();
         break;
         
         case DRIBBLE: 
         sprintf(str,"DRIBBLE");
+        checkDribble();
         checkBack();
         break;
         
         case STR_KICK: 
         sprintf(str,"STR_KICK");
+        checkStrKick();
         checkBack();
         break;
         
         case CHIP_KICK: 
         sprintf(str,"CHO_KICK");
+        checkChpKick();
         checkBack();
         break;
         
@@ -71,6 +78,15 @@
         sprintf(str,"ERROR");
         break;  
     }
+    
+    if(InterfaceManager::ball_sensor == 0)
+    {
+        InterfaceManager::LED = 0;
+    }
+    else if(InterfaceManager::ball_sensor == 1)
+    {   
+        InterfaceManager::LED = 1;
+    }
 //    //充電:左
 //    //強制放電:下
 //    //キック:上  
@@ -286,3 +302,176 @@
     }
 
 }
+
+void OperationCheck::checkWheel(void)
+{
+    switch(InterfaceManager::button.getButtonStatus(CROSS_RIGHT))
+    {
+        case SINGLE_CLICK:
+        vel_angle += 10;
+        break;
+        
+        case DOUBLE_CLICK:
+        vel_angle -= 10;
+        break;
+        default:
+        
+        break;
+    }
+    
+    if(vel_angle < 0)
+    {
+        vel_angle = 360;
+    }
+    if(vel_angle > 360)
+    {
+        vel_angle = 0;
+    }    
+
+    switch(InterfaceManager::button.getButtonStatus(CROSS_LEFT))
+    {
+        case SINGLE_CLICK:
+        vel_value += 10;
+        break;
+        
+        case DOUBLE_CLICK:
+        vel_value -= 10;
+        break;
+        default:
+        
+        break;
+    }
+    
+    if(vel_angle < -100)
+    {
+        vel_angle = 0;
+    }
+    if(vel_angle > 100)
+    {
+        vel_angle = 0;
+    }  
+
+    if(InterfaceManager::button.getButtonStatus(CROSS_DOWN))
+    {
+        wheel.setVelocity(vel_value,vel_angle,0);
+    }  
+    else
+    {
+       wheel.setVelocity(0,0,0);
+    } 
+    
+    sprintf(str,"V:%d\nA:%d",vel_value,vel_angle);
+       
+    
+}
+void OperationCheck::checkDribble(void)
+{
+    switch(InterfaceManager::button.getButtonStatus(CROSS_RIGHT))
+    {
+        case SINGLE_CLICK:
+        power += 1;
+        break;
+        
+        case DOUBLE_CLICK:
+        power -= 1;
+        break;
+        default:
+        
+        break;
+    }
+    
+    if(power < 0)
+    {
+        power = 15;
+    }
+    if(power > 15)
+    {
+        power = 0;
+    }     
+
+    if(InterfaceManager::button.getButtonStatus(CROSS_DOWN))
+    {
+        dribble.setdribble(1,power);
+    }  
+    else
+    {
+       dribble.setdribble(0,0);
+    } 
+    
+     
+    
+    sprintf(str,"DRIBBLE\nPOWER:%d",power); 
+      
+}
+void OperationCheck::checkStrKick(void)
+{
+    switch(InterfaceManager::button.getButtonStatus(CROSS_RIGHT))
+    {
+        case SINGLE_CLICK:
+        power += 1;
+        break;
+        
+        case DOUBLE_CLICK:
+        power -= 1;
+        break;
+        default:
+        
+        break;
+    }
+    
+    if(power < 0)
+    {
+        power = 15;
+    }
+    if(power > 15)
+    {
+        power = 0;
+    }    
+
+    switch(InterfaceManager::button.getButtonStatus(CROSS_LEFT))
+    {
+        case SINGLE_CLICK:
+        charge_flag = 1;
+        break;
+        
+        case DOUBLE_CLICK:
+        charge_flag = 0;
+        break;
+        default:
+        
+        break;
+    }
+    
+    if(StatusManager::is_kicking == 1)
+    {
+        charge_flag = 0;
+        kick_flag   = 0;
+    }
+    kicker.setCharge(charge_flag); 
+
+    if(InterfaceManager::button.getButtonStatus(CROSS_DOWN))
+    {
+       kick_flag = 1;
+    }  
+    else
+    {
+       kick_flag = 0;
+    } 
+    kicker.setKick(kick_flag,0,power);
+    kicker.forceFireKick();
+    
+    sprintf(str,"C:%dF:%d\nPOWER:%d",charge_flag,StatusManager::charge_end,power);  
+}
+void OperationCheck::checkChpKick(void)
+{
+    
+}
+
+void OperationCheck::resetValue(void)
+{
+    vel_value = 0;
+    vel_angle = 0;
+    power = 0;
+    charge_flag = 0;
+    kick_flag = 0;
+}
\ No newline at end of file