doxygen test
main.cpp@0:6a6e78ee4e08, 2022-06-19 (annotated)
- Committer:
- piroro4560
- Date:
- Sun Jun 19 06:45:51 2022 +0000
- Revision:
- 0:6a6e78ee4e08
- Child:
- 1:e6a7e0b92032
doxygen test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
piroro4560 | 0:6a6e78ee4e08 | 1 | /// @file main.cpp |
piroro4560 | 0:6a6e78ee4e08 | 2 | /// @brief ロボカップラジコンのプログラム |
piroro4560 | 0:6a6e78ee4e08 | 3 | /// |
piroro4560 | 0:6a6e78ee4e08 | 4 | /// 右端トグルは速度調整、中央2つでモード切り替えを行う |
piroro4560 | 0:6a6e78ee4e08 | 5 | /// |
piroro4560 | 0:6a6e78ee4e08 | 6 | /// |
piroro4560 | 0:6a6e78ee4e08 | 7 | /// |
piroro4560 | 0:6a6e78ee4e08 | 8 | |
piroro4560 | 0:6a6e78ee4e08 | 9 | //--------操作方法-------- |
piroro4560 | 0:6a6e78ee4e08 | 10 | |
piroro4560 | 0:6a6e78ee4e08 | 11 | |
piroro4560 | 0:6a6e78ee4e08 | 12 | #include "Master.h" |
piroro4560 | 0:6a6e78ee4e08 | 13 | #include "jy901.h" |
piroro4560 | 0:6a6e78ee4e08 | 14 | #include "PID.h" |
piroro4560 | 0:6a6e78ee4e08 | 15 | #include "SerialArduino.h" |
piroro4560 | 0:6a6e78ee4e08 | 16 | |
piroro4560 | 0:6a6e78ee4e08 | 17 | DigitalOut led(LED1); |
piroro4560 | 0:6a6e78ee4e08 | 18 | Master Master;// 出力等の基本クラス |
piroro4560 | 0:6a6e78ee4e08 | 19 | OmniWheel omni(4); |
piroro4560 | 0:6a6e78ee4e08 | 20 | SerialArduino mini(A0, A1, 115200);// Arduinoを用いてPS3コントローラと通信するクラス |
piroro4560 | 0:6a6e78ee4e08 | 21 | JY901 jy(jysda, jyscl); |
piroro4560 | 0:6a6e78ee4e08 | 22 | PID Rotate(6.0, 50.0, 0.0005, 0.01); |
piroro4560 | 0:6a6e78ee4e08 | 23 | Timer Time_Shot; |
piroro4560 | 0:6a6e78ee4e08 | 24 | |
piroro4560 | 0:6a6e78ee4e08 | 25 | void PS3get(bool flag_PS3print); |
piroro4560 | 0:6a6e78ee4e08 | 26 | |
piroro4560 | 0:6a6e78ee4e08 | 27 | uint8_t h1,h2; |
piroro4560 | 0:6a6e78ee4e08 | 28 | bool b[12]= {}; |
piroro4560 | 0:6a6e78ee4e08 | 29 | uint8_t st[4]= {}; |
piroro4560 | 0:6a6e78ee4e08 | 30 | uint8_t tr[2]= {}; |
piroro4560 | 0:6a6e78ee4e08 | 31 | |
piroro4560 | 0:6a6e78ee4e08 | 32 | int main() |
piroro4560 | 0:6a6e78ee4e08 | 33 | { |
piroro4560 | 0:6a6e78ee4e08 | 34 | uint8_t mode=0; |
piroro4560 | 0:6a6e78ee4e08 | 35 | bool EdgeToggle[3]={}, pretoggle[3]={}; |
piroro4560 | 0:6a6e78ee4e08 | 36 | bool flag_Dribble=false, flag_Shot=false, flag_Rotate; |
piroro4560 | 0:6a6e78ee4e08 | 37 | Time_Shot.start(); |
piroro4560 | 0:6a6e78ee4e08 | 38 | |
piroro4560 | 0:6a6e78ee4e08 | 39 | double pwm[4]={}, DribblePower = 0.5; |
piroro4560 | 0:6a6e78ee4e08 | 40 | double Vx=0, Vy=0, Vr=0, Rotate_Power=0, V=0, theta=0; |
piroro4560 | 0:6a6e78ee4e08 | 41 | double rawAngle, angleLimit; |
piroro4560 | 0:6a6e78ee4e08 | 42 | |
piroro4560 | 0:6a6e78ee4e08 | 43 | Master.SetPS3Address(b, tr, st); |
piroro4560 | 0:6a6e78ee4e08 | 44 | jy.calibrateAll(50); |
piroro4560 | 0:6a6e78ee4e08 | 45 | |
piroro4560 | 0:6a6e78ee4e08 | 46 | // DisplayThread.start(Display); |
piroro4560 | 0:6a6e78ee4e08 | 47 | #ifdef RobotNumberIsOne |
piroro4560 | 0:6a6e78ee4e08 | 48 | // 機体ナンバーが 1 |
piroro4560 | 0:6a6e78ee4e08 | 49 | double VxLimit=0.75; // X軸方向ベクトルの最大値 |
piroro4560 | 0:6a6e78ee4e08 | 50 | double VyLimit=0.75; // Y軸方向ベクトルの最大値 |
piroro4560 | 0:6a6e78ee4e08 | 51 | double VrLimit=0.4; // 回転方向ベクトルの最大値 |
piroro4560 | 0:6a6e78ee4e08 | 52 | double Bias_Motor=0.75; // モーター出力値のバイアス |
piroro4560 | 0:6a6e78ee4e08 | 53 | omni.wheel[0].setRadian(PI * 1.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 54 | omni.wheel[1].setRadian(PI * 7.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 55 | omni.wheel[2].setRadian(PI * 5.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 56 | omni.wheel[3].setRadian(PI * 3.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 57 | #else |
piroro4560 | 0:6a6e78ee4e08 | 58 | // 機体ナンバーが 2 |
piroro4560 | 0:6a6e78ee4e08 | 59 | double VxLimit=0.8; // X軸方向ベクトルの最大値 |
piroro4560 | 0:6a6e78ee4e08 | 60 | double VyLimit=0.8; // Y軸方向ベクトルの最大値 |
piroro4560 | 0:6a6e78ee4e08 | 61 | double VrLimit=0.6; // 回転方向ベクトルの最大値 |
piroro4560 | 0:6a6e78ee4e08 | 62 | double Bias_Motor=0.8; // モーター出力値のバイアス |
piroro4560 | 0:6a6e78ee4e08 | 63 | double Bias_DefectiveMD = 0.6; // ダメダメMD補正用バイアス |
piroro4560 | 0:6a6e78ee4e08 | 64 | omni.wheel[0].setRadian(PI * 5.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 65 | omni.wheel[1].setRadian(PI * 7.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 66 | omni.wheel[2].setRadian(PI * 1.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 67 | omni.wheel[3].setRadian(PI * 3.0 / 4.0); |
piroro4560 | 0:6a6e78ee4e08 | 68 | #endif |
piroro4560 | 0:6a6e78ee4e08 | 69 | |
piroro4560 | 0:6a6e78ee4e08 | 70 | Rotate.setInputLimits(-180, 180); |
piroro4560 | 0:6a6e78ee4e08 | 71 | Rotate.setOutputLimits(-1*VrLimit,VrLimit); |
piroro4560 | 0:6a6e78ee4e08 | 72 | Rotate.setBias(0); |
piroro4560 | 0:6a6e78ee4e08 | 73 | Rotate.setMode(1); |
piroro4560 | 0:6a6e78ee4e08 | 74 | Rotate.setSetPoint(0); |
piroro4560 | 0:6a6e78ee4e08 | 75 | |
piroro4560 | 0:6a6e78ee4e08 | 76 | // 以下ループ |
piroro4560 | 0:6a6e78ee4e08 | 77 | while (true) { |
piroro4560 | 0:6a6e78ee4e08 | 78 | if (mini.getState()) { |
piroro4560 | 0:6a6e78ee4e08 | 79 | rawAngle = jy.getZaxisAngle(); |
piroro4560 | 0:6a6e78ee4e08 | 80 | if(rawAngle > 180.0) rawAngle -= 360; |
piroro4560 | 0:6a6e78ee4e08 | 81 | |
piroro4560 | 0:6a6e78ee4e08 | 82 | angleLimit = rawAngle; |
piroro4560 | 0:6a6e78ee4e08 | 83 | Rotate.setProcessValue(angleLimit/*-sensor_.ballAngle*/); |
piroro4560 | 0:6a6e78ee4e08 | 84 | Rotate_Power = Rotate.compute(); |
piroro4560 | 0:6a6e78ee4e08 | 85 | |
piroro4560 | 0:6a6e78ee4e08 | 86 | PS3get(true); |
piroro4560 | 0:6a6e78ee4e08 | 87 | |
piroro4560 | 0:6a6e78ee4e08 | 88 | // printf("angle : %d|power : %d | ", (int)rawAngle, (int)(Rotate_Power*100)); |
piroro4560 | 0:6a6e78ee4e08 | 89 | printf("(Vx,Vy):(%3d,%3d)|theta:%d|angle:%d | ", (int)(Vx*100), (int)(Vy*100), (int)(theta), (int)angleLimit); |
piroro4560 | 0:6a6e78ee4e08 | 90 | |
piroro4560 | 0:6a6e78ee4e08 | 91 | if (fabs(st[2]-128.0) > 50) { |
piroro4560 | 0:6a6e78ee4e08 | 92 | Rotate.setSetPoint(angleLimit); |
piroro4560 | 0:6a6e78ee4e08 | 93 | flag_Rotate = true; |
piroro4560 | 0:6a6e78ee4e08 | 94 | } else { |
piroro4560 | 0:6a6e78ee4e08 | 95 | flag_Rotate = false; |
piroro4560 | 0:6a6e78ee4e08 | 96 | } |
piroro4560 | 0:6a6e78ee4e08 | 97 | |
piroro4560 | 0:6a6e78ee4e08 | 98 | if (b[1]) { |
piroro4560 | 0:6a6e78ee4e08 | 99 | jy.yawcalibrate(); |
piroro4560 | 0:6a6e78ee4e08 | 100 | Rotate.setSetPoint(0); |
piroro4560 | 0:6a6e78ee4e08 | 101 | } |
piroro4560 | 0:6a6e78ee4e08 | 102 | |
piroro4560 | 0:6a6e78ee4e08 | 103 | // モーター出力値の計算 |
piroro4560 | 0:6a6e78ee4e08 | 104 | #ifdef RobotNumberIsOne |
piroro4560 | 0:6a6e78ee4e08 | 105 | // 機体ナンバーが 1 |
piroro4560 | 0:6a6e78ee4e08 | 106 | Vx = ((st[0]-128.0)/128.0) * VxLimit; |
piroro4560 | 0:6a6e78ee4e08 | 107 | Vy = (128.0-st[1])/128.0 * VyLimit; |
piroro4560 | 0:6a6e78ee4e08 | 108 | Vr = -(st[2]-128.0)/128.0 * VrLimit * 0.5; |
piroro4560 | 0:6a6e78ee4e08 | 109 | #else |
piroro4560 | 0:6a6e78ee4e08 | 110 | // 機体ナンバーが 2 |
piroro4560 | 0:6a6e78ee4e08 | 111 | Vx = ((st[0]-128.0)/128.0) * VxLimit; |
piroro4560 | 0:6a6e78ee4e08 | 112 | Vy = (128.0-st[1])/128.0 * VyLimit; |
piroro4560 | 0:6a6e78ee4e08 | 113 | Vr = -(st[2]-128.0)/128.0 * VrLimit * 0.5; |
piroro4560 | 0:6a6e78ee4e08 | 114 | #endif |
piroro4560 | 0:6a6e78ee4e08 | 115 | if (!flag_Rotate) { |
piroro4560 | 0:6a6e78ee4e08 | 116 | Vr = Rotate_Power; |
piroro4560 | 0:6a6e78ee4e08 | 117 | } |
piroro4560 | 0:6a6e78ee4e08 | 118 | |
piroro4560 | 0:6a6e78ee4e08 | 119 | V = hypot(Vx, Vy); |
piroro4560 | 0:6a6e78ee4e08 | 120 | theta = atan2(Vy, Vx); |
piroro4560 | 0:6a6e78ee4e08 | 121 | #ifdef RobotNumberIsOne |
piroro4560 | 0:6a6e78ee4e08 | 122 | omni.computeCircular(V, theta - angleLimit/180.0*PI, Vr); |
piroro4560 | 0:6a6e78ee4e08 | 123 | #else |
piroro4560 | 0:6a6e78ee4e08 | 124 | omni.computeCircular(V, theta - angleLimit/180.0*PI, -Vr); |
piroro4560 | 0:6a6e78ee4e08 | 125 | #endif |
piroro4560 | 0:6a6e78ee4e08 | 126 | |
piroro4560 | 0:6a6e78ee4e08 | 127 | for(int i=0; i < 4; i++) { |
piroro4560 | 0:6a6e78ee4e08 | 128 | if (0) { |
piroro4560 | 0:6a6e78ee4e08 | 129 | if (b[i+4]) { |
piroro4560 | 0:6a6e78ee4e08 | 130 | pwm[i] = 0.5; |
piroro4560 | 0:6a6e78ee4e08 | 131 | // printf("%d ", i); |
piroro4560 | 0:6a6e78ee4e08 | 132 | } else if (b[i+4+4]) { |
piroro4560 | 0:6a6e78ee4e08 | 133 | pwm[i] = -0.5; |
piroro4560 | 0:6a6e78ee4e08 | 134 | } else { |
piroro4560 | 0:6a6e78ee4e08 | 135 | pwm[i] = 0; |
piroro4560 | 0:6a6e78ee4e08 | 136 | } |
piroro4560 | 0:6a6e78ee4e08 | 137 | } else { |
piroro4560 | 0:6a6e78ee4e08 | 138 | pwm[i] = ((double)omni.wheel[i] * Bias_Motor); |
piroro4560 | 0:6a6e78ee4e08 | 139 | } |
piroro4560 | 0:6a6e78ee4e08 | 140 | } |
piroro4560 | 0:6a6e78ee4e08 | 141 | // printf("\r\n"); |
piroro4560 | 0:6a6e78ee4e08 | 142 | |
piroro4560 | 0:6a6e78ee4e08 | 143 | // フラグ処理 |
piroro4560 | 0:6a6e78ee4e08 | 144 | if (b[9]) flag_Dribble = true; |
piroro4560 | 0:6a6e78ee4e08 | 145 | else flag_Dribble = false; |
piroro4560 | 0:6a6e78ee4e08 | 146 | |
piroro4560 | 0:6a6e78ee4e08 | 147 | if (b[8] && (Time_Shot.read_ms() > 1000)) { |
piroro4560 | 0:6a6e78ee4e08 | 148 | flag_Shot = true; |
piroro4560 | 0:6a6e78ee4e08 | 149 | Time_Shot.reset(); |
piroro4560 | 0:6a6e78ee4e08 | 150 | } else { |
piroro4560 | 0:6a6e78ee4e08 | 151 | flag_Shot = false; |
piroro4560 | 0:6a6e78ee4e08 | 152 | } |
piroro4560 | 0:6a6e78ee4e08 | 153 | |
piroro4560 | 0:6a6e78ee4e08 | 154 | // ドリブラー・キッカー |
piroro4560 | 0:6a6e78ee4e08 | 155 | // if (flag_Dribble) esc.setspeed(0.7); |
piroro4560 | 0:6a6e78ee4e08 | 156 | // else esc.setspeed(0.0); |
piroro4560 | 0:6a6e78ee4e08 | 157 | if (flag_Dribble) Master.Dribble(0.7); |
piroro4560 | 0:6a6e78ee4e08 | 158 | else Master.Dribble(0.0); |
piroro4560 | 0:6a6e78ee4e08 | 159 | if (flag_Shot) Master.Shot(); |
piroro4560 | 0:6a6e78ee4e08 | 160 | |
piroro4560 | 0:6a6e78ee4e08 | 161 | // ニュートラル処理 |
piroro4560 | 0:6a6e78ee4e08 | 162 | for (int i=0; i<4; i++) { |
piroro4560 | 0:6a6e78ee4e08 | 163 | if (fabs(pwm[i]) < 0.1) pwm[i] = 0.0; |
piroro4560 | 0:6a6e78ee4e08 | 164 | } |
piroro4560 | 0:6a6e78ee4e08 | 165 | |
piroro4560 | 0:6a6e78ee4e08 | 166 | #ifdef RobotNumberIsOne |
piroro4560 | 0:6a6e78ee4e08 | 167 | Master.SetValueMotor(0, pwm[0]); |
piroro4560 | 0:6a6e78ee4e08 | 168 | Master.SetValueMotor(1, pwm[1]); |
piroro4560 | 0:6a6e78ee4e08 | 169 | Master.SetValueMotor(2, -pwm[2]); |
piroro4560 | 0:6a6e78ee4e08 | 170 | Master.SetValueMotor(3, -pwm[3]); |
piroro4560 | 0:6a6e78ee4e08 | 171 | #else |
piroro4560 | 0:6a6e78ee4e08 | 172 | Master.SetValueMotor(0, pwm[0] * Bias_DefectiveMD); |
piroro4560 | 0:6a6e78ee4e08 | 173 | Master.SetValueMotor(1, pwm[1]); |
piroro4560 | 0:6a6e78ee4e08 | 174 | Master.SetValueMotor(2, pwm[2]); |
piroro4560 | 0:6a6e78ee4e08 | 175 | Master.SetValueMotor(3, pwm[3] * Bias_DefectiveMD); |
piroro4560 | 0:6a6e78ee4e08 | 176 | #endif |
piroro4560 | 0:6a6e78ee4e08 | 177 | } |
piroro4560 | 0:6a6e78ee4e08 | 178 | } |
piroro4560 | 0:6a6e78ee4e08 | 179 | } |
piroro4560 | 0:6a6e78ee4e08 | 180 | |
piroro4560 | 0:6a6e78ee4e08 | 181 | void PS3get(bool flag_PS3print) |
piroro4560 | 0:6a6e78ee4e08 | 182 | { |
piroro4560 | 0:6a6e78ee4e08 | 183 | h1 = mini.getHedder1(); |
piroro4560 | 0:6a6e78ee4e08 | 184 | h2 = mini.getHedder2(); |
piroro4560 | 0:6a6e78ee4e08 | 185 | for(int i=0; i<12; i++) { |
piroro4560 | 0:6a6e78ee4e08 | 186 | b[i] = mini.getButton(i); |
piroro4560 | 0:6a6e78ee4e08 | 187 | } |
piroro4560 | 0:6a6e78ee4e08 | 188 | for(int i=0; i<2; i++) { |
piroro4560 | 0:6a6e78ee4e08 | 189 | tr[i] = mini.getTrigger(i); |
piroro4560 | 0:6a6e78ee4e08 | 190 | } |
piroro4560 | 0:6a6e78ee4e08 | 191 | for(int i=0; i<4; i++) { |
piroro4560 | 0:6a6e78ee4e08 | 192 | st[i] = mini.getStick(i); |
piroro4560 | 0:6a6e78ee4e08 | 193 | } |
piroro4560 | 0:6a6e78ee4e08 | 194 | if (flag_PS3print) { |
piroro4560 | 0:6a6e78ee4e08 | 195 | for(int i=0; i<12; i++) printf("%d ",b[i]); |
piroro4560 | 0:6a6e78ee4e08 | 196 | printf("|"); |
piroro4560 | 0:6a6e78ee4e08 | 197 | for(int i=0; i<2; i++) printf("%3d ",tr[i]); |
piroro4560 | 0:6a6e78ee4e08 | 198 | printf("|"); |
piroro4560 | 0:6a6e78ee4e08 | 199 | for(int i=0; i<4; i++) printf("%3d ",st[i]); |
piroro4560 | 0:6a6e78ee4e08 | 200 | if(mini.getState()) printf("ok"); |
piroro4560 | 0:6a6e78ee4e08 | 201 | else printf("bad"); |
piroro4560 | 0:6a6e78ee4e08 | 202 | printf("\r\n"); |
piroro4560 | 0:6a6e78ee4e08 | 203 | } else { |
piroro4560 | 0:6a6e78ee4e08 | 204 | mini.getState(); |
piroro4560 | 0:6a6e78ee4e08 | 205 | } |
piroro4560 | 0:6a6e78ee4e08 | 206 | } |