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
main.cpp@35:b1b00cfaa163, 2019-09-22 (annotated)
- Committer:
- alt0710
- Date:
- Sun Sep 22 10:23:42 2019 +0000
- Revision:
- 35:b1b00cfaa163
- Parent:
- 33:13efae0ae6f4
2019JapanOpenSoft
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alt0710 | 0:d4b98dbcb767 | 1 | #include "mbed.h" |
alt0710 | 4:8c6f6b687303 | 2 | #include "mode.h" |
alt0710 | 0:d4b98dbcb767 | 3 | #include "interface_manager.h" |
alt0710 | 3:6f87cbec2ae8 | 4 | #include "status_manager.h" |
alt0710 | 3:6f87cbec2ae8 | 5 | #include "parameter_manager.h" |
alt0710 | 24:37a074e767c8 | 6 | #include "fail_safe.h" |
alt0710 | 24:37a074e767c8 | 7 | #include "filter.h" |
alt0710 | 24:37a074e767c8 | 8 | #include "pid.h" |
alt0710 | 24:37a074e767c8 | 9 | |
alt0710 | 35:b1b00cfaa163 | 10 | //2019年JapanOpenソフト |
alt0710 | 35:b1b00cfaa163 | 11 | |
alt0710 | 24:37a074e767c8 | 12 | Timer t; |
alt0710 | 24:37a074e767c8 | 13 | LPF DribMot_Current(0.8); |
alt0710 | 24:37a074e767c8 | 14 | PID DribMot_PID(1.0,0.1,0.0,40.0,0.0); |
alt0710 | 0:d4b98dbcb767 | 15 | |
alt0710 | 0:d4b98dbcb767 | 16 | int main() { |
alt0710 | 0:d4b98dbcb767 | 17 | init_interface(); |
alt0710 | 3:6f87cbec2ae8 | 18 | init_status(); |
alt0710 | 4:8c6f6b687303 | 19 | |
alt0710 | 31:7b003082f31d | 20 | ParameterManager::machine_id = 3; |
alt0710 | 3:6f87cbec2ae8 | 21 | |
alt0710 | 7:1f1bdb4e4f33 | 22 | ActMode actmode; |
alt0710 | 23:0bb032ef1880 | 23 | ParameterManager::raw_data.machine_id = ParameterManager::machine_id; |
alt0710 | 23:0bb032ef1880 | 24 | ParameterManager::raw_data.vphasor_value_of_machine = 0; |
alt0710 | 23:0bb032ef1880 | 25 | ParameterManager::raw_data.vphasor_angle_of_machine = 0; |
alt0710 | 23:0bb032ef1880 | 26 | ParameterManager::raw_data.vw_of_machine = 127; |
alt0710 | 23:0bb032ef1880 | 27 | ParameterManager::raw_data.actions_of_machine = 0; |
alt0710 | 23:0bb032ef1880 | 28 | ParameterManager::raw_data.power = 0; |
alt0710 | 2:ba11cc8540d3 | 29 | |
alt0710 | 23:0bb032ef1880 | 30 | ParameterManager::machine_data.v_mm_per_sec = 0; //MAX:4m/s |
alt0710 | 23:0bb032ef1880 | 31 | ParameterManager::machine_data.angle_degree = 0; |
alt0710 | 23:0bb032ef1880 | 32 | ParameterManager::machine_data.vw_mrad_per_sec = 0; |
alt0710 | 33:13efae0ae6f4 | 33 | #ifndef ON_INDICATER |
alt0710 | 24:37a074e767c8 | 34 | InterfaceManager::i2c.readIDMsg(); |
alt0710 | 33:13efae0ae6f4 | 35 | #endif |
alt0710 | 24:37a074e767c8 | 36 | |
alt0710 | 0:d4b98dbcb767 | 37 | while(1) { |
alt0710 | 30:8ee22331bfaf | 38 | if(StatusManager::ball == 1) |
alt0710 | 17:e5e7b19dd707 | 39 | { |
alt0710 | 17:e5e7b19dd707 | 40 | InterfaceManager::LED = 1; |
alt0710 | 17:e5e7b19dd707 | 41 | } |
alt0710 | 17:e5e7b19dd707 | 42 | else |
alt0710 | 17:e5e7b19dd707 | 43 | { |
alt0710 | 17:e5e7b19dd707 | 44 | InterfaceManager::LED = 0; |
alt0710 | 17:e5e7b19dd707 | 45 | } |
alt0710 | 24:37a074e767c8 | 46 | |
alt0710 | 25:15f75825fc36 | 47 | actmode.run(); |
alt0710 | 33:13efae0ae6f4 | 48 | #if defined(MAIN_BORD_Ver_4) || defined(MAIN_BORD_Ver_5) |
alt0710 | 33:13efae0ae6f4 | 49 | //StatusManager::motTrqData.MotTrq_short = (short)DribMot_Current.getLPF_Out( (double)InterfaceManager::batVoltage.read_u16()); //*(float)3.3 * 1000) ; //[mNm] |
alt0710 | 32:718efbf4dc8a | 50 | StatusManager::dribbleMotor_current = (float)DribMot_Current.getLPF_Out( ((double)InterfaceManager::dribbleMotor_current.read() - (double)0.4841) * (double)3.3 * (double)9.091 ); |
alt0710 | 25:15f75825fc36 | 51 | //StatusManager::dribbleMotor_current = DribMot_Current.getLPF_Out( InterfaceManager::dribbleMotor_current.read()); |
alt0710 | 25:15f75825fc36 | 52 | |
alt0710 | 24:37a074e767c8 | 53 | StatusManager::req_dribbleMotor_PID = DribMot_PID.getPID_Out( StatusManager::req_dribbleMotor_current , StatusManager::dribbleMotor_current); |
alt0710 | 30:8ee22331bfaf | 54 | // 指示0の時Duty出力を0にする 0.1Aは最低指示0.133以下であれば良い |
alt0710 | 30:8ee22331bfaf | 55 | if(StatusManager::req_dribbleMotor_current < (float)0.1) |
alt0710 | 30:8ee22331bfaf | 56 | { |
alt0710 | 30:8ee22331bfaf | 57 | StatusManager::req_dribbleMotor_PID = 0.0; |
alt0710 | 30:8ee22331bfaf | 58 | } |
alt0710 | 30:8ee22331bfaf | 59 | |
alt0710 | 24:37a074e767c8 | 60 | if( StatusManager::dribbleMotor_current > (float)JDG_TH_OVERCUR_DIRBMOT ) |
alt0710 | 24:37a074e767c8 | 61 | { |
alt0710 | 24:37a074e767c8 | 62 | StatusManager::dribbleMot_OvrCur = 1; |
alt0710 | 24:37a074e767c8 | 63 | InterfaceManager::dribbleMotor.write((float)1.0 ); |
alt0710 | 24:37a074e767c8 | 64 | } |
alt0710 | 24:37a074e767c8 | 65 | else |
alt0710 | 24:37a074e767c8 | 66 | { |
alt0710 | 24:37a074e767c8 | 67 | StatusManager::dribbleMot_OvrCur = 0; |
alt0710 | 24:37a074e767c8 | 68 | InterfaceManager::dribbleMotor.write((float)1.0 - StatusManager::req_dribbleMotor_PID * (float)0.01 ); |
alt0710 | 24:37a074e767c8 | 69 | } |
alt0710 | 25:15f75825fc36 | 70 | #endif |
alt0710 | 35:b1b00cfaa163 | 71 | |
alt0710 | 24:37a074e767c8 | 72 | |
alt0710 | 0:d4b98dbcb767 | 73 | } |
alt0710 | 0:d4b98dbcb767 | 74 | } |