doxygen test
Diff: main.cpp
- Revision:
- 0:6a6e78ee4e08
- Child:
- 1:e6a7e0b92032
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jun 19 06:45:51 2022 +0000 @@ -0,0 +1,206 @@ +/// @file main.cpp +/// @brief ロボカップラジコンのプログラム +/// +/// 右端トグルは速度調整、中央2つでモード切り替えを行う +/// +/// +/// + +//--------操作方法-------- + + +#include "Master.h" +#include "jy901.h" +#include "PID.h" +#include "SerialArduino.h" + +DigitalOut led(LED1); +Master Master;// 出力等の基本クラス +OmniWheel omni(4); +SerialArduino mini(A0, A1, 115200);// Arduinoを用いてPS3コントローラと通信するクラス +JY901 jy(jysda, jyscl); +PID Rotate(6.0, 50.0, 0.0005, 0.01); +Timer Time_Shot; + +void PS3get(bool flag_PS3print); + +uint8_t h1,h2; +bool b[12]= {}; +uint8_t st[4]= {}; +uint8_t tr[2]= {}; + +int main() +{ + uint8_t mode=0; + bool EdgeToggle[3]={}, pretoggle[3]={}; + bool flag_Dribble=false, flag_Shot=false, flag_Rotate; + Time_Shot.start(); + + double pwm[4]={}, DribblePower = 0.5; + double Vx=0, Vy=0, Vr=0, Rotate_Power=0, V=0, theta=0; + double rawAngle, angleLimit; + + Master.SetPS3Address(b, tr, st); + jy.calibrateAll(50); + +// DisplayThread.start(Display); +#ifdef RobotNumberIsOne +// 機体ナンバーが 1 + double VxLimit=0.75; // X軸方向ベクトルの最大値 + double VyLimit=0.75; // Y軸方向ベクトルの最大値 + double VrLimit=0.4; // 回転方向ベクトルの最大値 + double Bias_Motor=0.75; // モーター出力値のバイアス + omni.wheel[0].setRadian(PI * 1.0 / 4.0); + omni.wheel[1].setRadian(PI * 7.0 / 4.0); + omni.wheel[2].setRadian(PI * 5.0 / 4.0); + omni.wheel[3].setRadian(PI * 3.0 / 4.0); +#else +// 機体ナンバーが 2 + double VxLimit=0.8; // X軸方向ベクトルの最大値 + double VyLimit=0.8; // Y軸方向ベクトルの最大値 + double VrLimit=0.6; // 回転方向ベクトルの最大値 + double Bias_Motor=0.8; // モーター出力値のバイアス + double Bias_DefectiveMD = 0.6; // ダメダメMD補正用バイアス + omni.wheel[0].setRadian(PI * 5.0 / 4.0); + omni.wheel[1].setRadian(PI * 7.0 / 4.0); + omni.wheel[2].setRadian(PI * 1.0 / 4.0); + omni.wheel[3].setRadian(PI * 3.0 / 4.0); +#endif + + Rotate.setInputLimits(-180, 180); + Rotate.setOutputLimits(-1*VrLimit,VrLimit); + Rotate.setBias(0); + Rotate.setMode(1); + Rotate.setSetPoint(0); + +// 以下ループ + while (true) { + if (mini.getState()) { + rawAngle = jy.getZaxisAngle(); + if(rawAngle > 180.0) rawAngle -= 360; + + angleLimit = rawAngle; + Rotate.setProcessValue(angleLimit/*-sensor_.ballAngle*/); + Rotate_Power = Rotate.compute(); + + PS3get(true); + + // printf("angle : %d|power : %d | ", (int)rawAngle, (int)(Rotate_Power*100)); + printf("(Vx,Vy):(%3d,%3d)|theta:%d|angle:%d | ", (int)(Vx*100), (int)(Vy*100), (int)(theta), (int)angleLimit); + + if (fabs(st[2]-128.0) > 50) { + Rotate.setSetPoint(angleLimit); + flag_Rotate = true; + } else { + flag_Rotate = false; + } + + if (b[1]) { + jy.yawcalibrate(); + Rotate.setSetPoint(0); + } + + // モーター出力値の計算 +#ifdef RobotNumberIsOne + // 機体ナンバーが 1 + Vx = ((st[0]-128.0)/128.0) * VxLimit; + Vy = (128.0-st[1])/128.0 * VyLimit; + Vr = -(st[2]-128.0)/128.0 * VrLimit * 0.5; +#else + // 機体ナンバーが 2 + Vx = ((st[0]-128.0)/128.0) * VxLimit; + Vy = (128.0-st[1])/128.0 * VyLimit; + Vr = -(st[2]-128.0)/128.0 * VrLimit * 0.5; +#endif + if (!flag_Rotate) { + Vr = Rotate_Power; + } + + V = hypot(Vx, Vy); + theta = atan2(Vy, Vx); +#ifdef RobotNumberIsOne + omni.computeCircular(V, theta - angleLimit/180.0*PI, Vr); +#else + omni.computeCircular(V, theta - angleLimit/180.0*PI, -Vr); +#endif + + for(int i=0; i < 4; i++) { + if (0) { + if (b[i+4]) { + pwm[i] = 0.5; + // printf("%d ", i); + } else if (b[i+4+4]) { + pwm[i] = -0.5; + } else { + pwm[i] = 0; + } + } else { + pwm[i] = ((double)omni.wheel[i] * Bias_Motor); + } + } + // printf("\r\n"); + + // フラグ処理 + if (b[9]) flag_Dribble = true; + else flag_Dribble = false; + + if (b[8] && (Time_Shot.read_ms() > 1000)) { + flag_Shot = true; + Time_Shot.reset(); + } else { + flag_Shot = false; + } + + // ドリブラー・キッカー + // if (flag_Dribble) esc.setspeed(0.7); + // else esc.setspeed(0.0); + if (flag_Dribble) Master.Dribble(0.7); + else Master.Dribble(0.0); + if (flag_Shot) Master.Shot(); + + // ニュートラル処理 + for (int i=0; i<4; i++) { + if (fabs(pwm[i]) < 0.1) pwm[i] = 0.0; + } + +#ifdef RobotNumberIsOne + Master.SetValueMotor(0, pwm[0]); + Master.SetValueMotor(1, pwm[1]); + Master.SetValueMotor(2, -pwm[2]); + Master.SetValueMotor(3, -pwm[3]); +#else + Master.SetValueMotor(0, pwm[0] * Bias_DefectiveMD); + Master.SetValueMotor(1, pwm[1]); + Master.SetValueMotor(2, pwm[2]); + Master.SetValueMotor(3, pwm[3] * Bias_DefectiveMD); +#endif + } + } +} + +void PS3get(bool flag_PS3print) +{ + h1 = mini.getHedder1(); + h2 = mini.getHedder2(); + for(int i=0; i<12; i++) { + b[i] = mini.getButton(i); + } + for(int i=0; i<2; i++) { + tr[i] = mini.getTrigger(i); + } + for(int i=0; i<4; i++) { + st[i] = mini.getStick(i); + } + if (flag_PS3print) { + for(int i=0; i<12; i++) printf("%d ",b[i]); + printf("|"); + for(int i=0; i<2; i++) printf("%3d ",tr[i]); + printf("|"); + for(int i=0; i<4; i++) printf("%3d ",st[i]); + if(mini.getState()) printf("ok"); + else printf("bad"); + printf("\r\n"); + } else { + mini.getState(); + } +} \ No newline at end of file