main
Dependents: 00_yotsuba 200_yotsuba_21 200_yotuba_21_uiChange
robot.cpp
- Committer:
- THtakahiro702286
- Date:
- 2021-03-06
- Revision:
- 15:da88e62863a1
- Parent:
- 13:d61a64c81c16
- Child:
- 16:e3846421554b
File content as of revision 15:da88e62863a1:
#include "robot.h" Robot::Robot() : spin(P, I, D, interval), sgoal(P, I, D, interval), pc(USBTX, USBRX, 115200), shot(kicker), drib(ESCpin) { omni.wheel[2].setRadian(PI/4 * 1); omni.wheel[3].setRadian(PI/4 * 3); omni.wheel[0].setRadian(PI/4 * 5); omni.wheel[1].setRadian(PI/4 * 7); motor[0] = new KohiMD(PA_15); motor[1] = new KohiMD(PA_6); motor[2] = new KohiMD(PA_7); motor[3] = new KohiMD(PB_6); spin.setInputLimits(-180, 180); sgoal.setInputLimits(-180, 180); spin.setOutputLimits(-0.4,0.4); sgoal.setOutputLimits(-0.4,0.4); spin.setBias(0); sgoal.setBias(0); spin.setMode(1); sgoal.setMode(1); spin.setSetPoint(0); sgoal.setSetPoint(0); shot.setkickperiod(2.0); shot.setoutputtime(0.1); drib.setspeed(0.0); startb = 0; } void Robot::start(uint8_t Team, uint8_t Algorithm) { while(1){ printf("%d %d ", (int)sensor_.irVal ,(int)sensor_.ballKeep); spin.setProcessValue(sensor_.angleLimit/*-sensor_.ballAngle*/); spin_power = spin.compute(); // theta = sensor_.ballAngle * ballExtra * PI / 180.0 * ((120-sensor_.ballRange)/240.0) * (fabs(sensor_.ballAngle) > 25.0) ; // theta =30 * sensor_.ballAngle*sensor_.ballAngle * 0.5 * PI / 180.0 / (1.5*sensor_.ballRange + 1); // theta = (sensor_.ballAngle / 180.0) * (sensor_.ballAngle / 180.0) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2; theta = ((sensor_.ballAngle>0) - (sensor_.ballAngle<0)) * (2.0/(2-fabs(sensor_.ballAngle)/180) - 1) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2; printf("%3d %3d %3d %3d\r\n",(int)sensor_.ballRange, (int)sensor_.ballAngle, (int)(theta * 180/PI), (int)(spin_power * 100)); omni.computeCircular(/*0*/1.1*sensor_.ballRange / 100.0,/*0*/PI / 180.0 * sensor_.ballAngle + theta, spin_power); for (int i=0; i<4; i++) { thisSpeed[i] = omni.wheel[i]; } if((fabs(sensor_.ballAngle) < 50 && sensor_.ballRange) || sensor_.ballKeep) dribbleCheck(0.6); else dribbleCheck(0.0); motor[0]->setSpeed(thisSpeed[0]); motor[1]->setSpeed(thisSpeed[1]); motor[2]->setSpeed(-1*thisSpeed[2]); motor[3]->setSpeed(-1*thisSpeed[3]); } // 昔 // while (1) { // startb=1; // spin.setProcessValue(sensor_.angleLimit); // theta = sensor_.ballAngle * ballExtra * PI / 180.0; // spin_power = spin.compute(); // if (/*sensor_.ballKeep*/0) { // /*ボールをつかんでるなら*/ //// drib.setspeed(0.5); // if(Team) // { // /*あおに向かうよ*/ //// /*if(!sensor.bluex)*/ omni.computeCircular(1,0,0/* spin_power*/); //// omni.computeCircular(sensor_.blueRange,PI / 180.0 * sensor_.blueAngle, spin_power); // // } // else // { // /*きいろに向かうよ*/ //// /*if(!sensor.yellowx)*/ omni.computeCircular(1,0,0/* spin_power*/); // } // } // else // /*つかんでないなら*/ // { //// for(int i=0; i<6; i++) pc.printf("%d ",sensor.line[i]); //// pc.printf("\r\n"); // drib.setspeed(0.0); //// omni.computeCircular(sensor_.ballRange, (PI / 180.0) * sensor_.ballAngle + theta, spin_power); // omni.computeCircular(sensor_.ballRange, sensor_.ballAngle, spin_power); // } //// printf("%d ",(int)sensor.ballKeep); // if(sensor_.line[0] || sensor_.line[1]) // { // omni.computeCircular(1,-1*PI/2.0,spin_power); // } // if(sensor_.line[2] || sensor_.line[3]) // { // omni.computeCircular(1,PI/2.0,spin_power); // } // if(sensor_.line[4]) // { // omni.computeCircular(1,0,spin_power); // } // if(sensor_.line[5]) // { // omni.computeCircular(1,PI,spin_power); // } // // if (startb) { // omni2wheel = omni.wheel[2]; // omni3wheel = omni.wheel[3]; //// motor[0]->setSpeed(omni.wheel[0]); //// motor[1]->setSpeed(omni.wheel[1]); //// motor[2]->setSpeed(omni.wheel[2]); //// motor[3]->setSpeed(omni.wheel[3]); //// motor[3]->setSpeed(-omni3wheel); // shot.outPut(); // // } else { // motor[0]->setSpeed(0); // motor[1]->setSpeed(0); // motor[2]->setSpeed(0); // motor[3]->setSpeed(0); // } // } } void Robot::pidtest() { while(1){ spin.setProcessValue(sensor_.angleLimit); spin_power = spin.compute(); omni.computeCircular(0,0,spin_power); if(sensor_.line[0] || sensor_.line[1]) { omni.computeCircular(1,PI/2.0,spin_power); } if(sensor_.line[2] || sensor_.line[3]) { omni.computeCircular(1,-1*PI/2.0,spin_power); } if(sensor_.line[4]) { omni.computeCircular(1,0,spin_power); } if(sensor_.line[5]) { omni.computeCircular(1,PI,spin_power); } for (int i=0; i<4; i++) { thisSpeed[i] = omni.wheel[i]; } motor[0]->setSpeed(thisSpeed[0]); motor[1]->setSpeed(thisSpeed[1]); motor[2]->setSpeed(-1*thisSpeed[2]); motor[3]->setSpeed(-1*thisSpeed[3]); } } void Robot::motorCheck(int motorNumber, float power) { _motorNumber = motorNumber; for(i = 0; i < 4; i++) { if(i == _motorNumber) motor[i]->setSpeed(power); else motor[i]->setSpeed(0); } } void Robot::motorStop(double pwm) { // motorSpeed = 0.5; // printf("%d\r\n", (int)(motorSpeed*10)); for(i=0; i<4; i++) motor[i]->setSpeed(pwm); } void Robot::kickCheck() { shot.outPut(); } void Robot::dribbleCheck(float power) { drib.setspeed(power); } void Robot::moveTest() { while(1){ // printf("%d %d ", (int)sensor_.irVal ,(int)sensor_.ballKeep); spin.setProcessValue(sensor_.angleLimit/*-sensor_.ballAngle*/); if(sensor_.team) sgoal.setProcessValue(-sensor_.blueAngle/*-sensor_.ballAngle*/); else sgoal.setProcessValue(-sensor_.yellowAngle/*-sensor_.ballAngle*/); spin_power = spin.compute(); // theta = sensor_.ballAngle * ballExtra * PI / 180.0 * ((120-sensor_.ballRange)/240.0) * (fabs(sensor_.ballAngle) > 25.0) ; // theta =30 * sensor_.ballAngle*sensor_.ballAngle * 0.5 * PI / 180.0 / (1.5*sensor_.ballRange + 1); // theta = (sensor_.ballAngle / 180.0) * (sensor_.ballAngle / 180.0) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2; // printf("%3d %3d %3d %3d\r\n",(int)sensor_.ballRange, (int)sensor_.ballAngle, (int)(theta * 180/PI), (int)(spin_power * 100)); if(sensor_.line[0] || sensor_.line[1]) { omni.computeCircular(1,PI/2.0,spin_power); lineflag = 1; } if(sensor_.line[2] || sensor_.line[3]) { omni.computeCircular(1,-1*PI/2.0,spin_power); lineflag = 1; } if(sensor_.line[4]) { omni.computeCircular(1,0,spin_power); lineflag = 1; } if(sensor_.line[5]) { omni.computeCircular(1,PI,spin_power); lineflag = 1; } if(lineflag == 0 && !sensor_.ballkeepcount){ theta = ((sensor_.ballAngle>0) - (sensor_.ballAngle<0)) * (2.0/(2-fabs(sensor_.ballAngle)/180) - 1) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2; omni.computeCircular(/*0*/1.1*sensor_.ballRange / 100.0,/*0*/PI / 180.0 * sensor_.ballAngle + theta, spin_power); } else if(sensor_.ballkeepcount) { spin_power = sgoal.compute(); if(sensor_.team) { omni.computeCircular(sensor_.blueRange / 100.0/*0.6*/,sensor_.blueAngle,spin_power); } else { omni.computeCircular(sensor_.yellowRange / 100.0/*0.6*/,sensor_.yellowAngle,spin_power); } if(lineflag) kickCheck(); } lineflag = 0; // printf("r:%d %d l:%d %d b:%d f:%d\r\n",sensor_.line[0],sensor_.line[1],sensor_.line[2],sensor_.line[3],sensor_.line[4],sensor_.line[5]); // printf("%d %d %d %d\r\n",(int)(sensor_.b0),(int)sensor_.tgl1,(int)sensor_.tgl2,(int)sensor_.tgl3); for (int i=0; i<4; i++) { thisSpeed[i] = omni.wheel[i]; } if(sensor_.b0) sensor_.jy.yawcalibrate(); if((fabs(sensor_.ballAngle) < 50 && sensor_.ballRange) || sensor_.ballKeep) dribbleCheck(0.6); else dribbleCheck(0.0); motor[0]->setSpeed(thisSpeed[0]); motor[1]->setSpeed(thisSpeed[1]); motor[2]->setSpeed(-1*thisSpeed[2]); motor[3]->setSpeed(-1*thisSpeed[3]); // thread_sleep_for(40); } }