RobocupSSLのメイン基板白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は,ロボットとボールの座標,審判の判定を元にロボットの移動,キックなどの作戦を決定し,無線によってロボットに指令を送信する.
ロボット機能紹介
●オムニホイールによる方向転換不要の全方位移動
オムニホイールは,自由に回転可能なローラをホイールの外周上に配置した車輪である.ローラの回転により,車輪の回転と垂直の方向に駆動力を発することはできないが移動は可能となる.各車輪の角速度を調整することによって全方向への移動を可能にする.
●ドリブルバーのバックスピンによるボール保持
●電磁力を利用したキッカー
●キッカーの電磁力エネルギーを充電する充電回路
●ロボット情報が一目でわかるLCD
Diff: mode/operation_check/operation_check.cpp
- Revision:
- 20:354ed2681d0a
- Parent:
- 19:0bbd90be9aa3
- Child:
- 21:d18c2dfaaba4
diff -r 0bbd90be9aa3 -r 354ed2681d0a mode/operation_check/operation_check.cpp --- a/mode/operation_check/operation_check.cpp Sat May 06 06:43:37 2017 +0000 +++ b/mode/operation_check/operation_check.cpp Mon May 29 16:45:16 2017 +0000 @@ -28,7 +28,9 @@ //メンバ変数の初期化は、定義順(Warningになる) OperationCheck::OperationCheck() -:sideSW_num(0), +:checkMode(SELECT), + button_count(0), + sideSW_num(0), charge_flag(0), kick_flag(0), power(0), @@ -38,65 +40,178 @@ void OperationCheck::run(void) { - //充電:左 - //強制放電:下 - //キック:上 - /* ***************** 充電 ******************************* */ - if(InterfaceManager::button.getButtonStatus(CROSS_LEFT)) + switch(checkMode) { - charge_flag = 1; + case SELECT: + selectCheckMode(); + viewSelect(); + break; + + case WHEEL: + sprintf(str,"WHEEL"); + checkBack(); + break; + + case DRIBBLE: + sprintf(str,"DRIBBLE"); + checkBack(); + break; + + case STR_KICK: + sprintf(str,"STR_KICK"); + checkBack(); + break; + + case CHIP_KICK: + sprintf(str,"CHO_KICK"); + checkBack(); + break; + + default: + sprintf(str,"ERROR"); + break; } - if(StatusManager::is_kicking == 1) +// //充電:左 +// //強制放電:下 +// //キック:上 +// /* ***************** 充電 ******************************* */ +// if(InterfaceManager::button.getButtonStatus(CROSS_LEFT)) +// { +// charge_flag = 1; +// } +// if(StatusManager::is_kicking == 1) +// { +// charge_flag = 0; +// kick_flag = 0; +// } +// +// /* ***************** キック ******************************* */ +// if(InterfaceManager::button.getButtonStatus(CROSS_UP)) +// { +// kick_flag = 1; +// } +// +// /* ***************** 威力 ******************************* */ +// if(InterfaceManager::button.getButtonStatus(CROSS_RIGHT)) +// { +// power++; +// if(power > 15) +// { +// power = 0; +// } +// } +// +// if(InterfaceManager::button.getButtonStatus(CROSS_DOWN)) +// { +// dribble.setdribble(1, power); +// } +// else +// { +// dribble.setdribble(0, 0); +// } +// +// if(InterfaceManager::ball_sensor) +// { +// ball = 1; +// } +// else +// { +// ball = 0; +// } +// /* ***************** 強制放電 ***************************** */ +//// kicker.setCharge(charge_flag); +//// kicker.setKick(kick_flag, STRAIGHT, power); +//// kicker.forceFireKick(); +// +// //createLcdData(); +// sprintf(str,"F:%dP:%d\nB:%dK:%d",charge_flag,power,ball,kick_flag); +// //sprintf(str,"Hello"); + InterfaceManager::i2c.setLCDMsg(str,sizeof(str)); + +} + +void OperationCheck::selectCheckMode(void) +{ + if(InterfaceManager::button.getButtonStatus(CROSS_RIGHT)) { - charge_flag = 0; - kick_flag = 0; + button_count++; } - /* ***************** キック ******************************* */ - if(InterfaceManager::button.getButtonStatus(CROSS_UP)) + if(InterfaceManager::button.getButtonStatus(CROSS_LEFT)) { - kick_flag = 1; + button_count--; + } + + if(button_count > 3) + { + button_count = 0; + } + if(button_count < 0) + { + button_count = 3; } - /* ***************** 威力 ******************************* */ - if(InterfaceManager::button.getButtonStatus(CROSS_RIGHT)) + if(InterfaceManager::button.getButtonStatus(CROSS_UP)) { - power++; - if(power > 15) + switch(button_count) { - power = 0; + case 0: + checkMode = WHEEL; + break; + + case 1: + checkMode = DRIBBLE; + break; + + case 2: + checkMode = STR_KICK; + break; + + case 3: + checkMode = CHIP_KICK; + break; + + default: + checkMode = SELECT; + break; } } + +} - if(InterfaceManager::button.getButtonStatus(CROSS_DOWN)) - { - dribble.setdribble(1, power); - } - else +void OperationCheck::viewSelect(void) +{ + switch(button_count) { - dribble.setdribble(0, 0); + case 0: + sprintf(str,"CHECK\nWHEEL"); + break; + + case 1: + sprintf(str,"CHECK\nDRIBBLE"); + break; + + case 2: + sprintf(str,"CHECK\nSTR_KICK"); + break; + + case 3: + sprintf(str,"CHECK\nCHP_KICK"); + break; + + default: + sprintf(str,"ERROR"); + break; + } +} + +void OperationCheck::checkBack(void) +{ + if(InterfaceManager::button.getButtonStatus(CROSS_UP)) + { + checkMode = SELECT; } - if(InterfaceManager::ball_sensor) - { - ball = 1; - } - else - { - ball = 0; - } - /* ***************** 強制放電 ***************************** */ -// kicker.setCharge(charge_flag); -// -// -// kicker.setKick(kick_flag, STRAIGHT, power); -// kicker.forceFireKick(); - - //createLcdData(); - sprintf(str,"P:%d\nBall:%d",power,ball); - //sprintf(str,"Hello"); - InterfaceManager::i2c.setLCDMsg(str,sizeof(str)); - } void OperationCheck::createLcdData(void)