sdf
Dependencies: mbed arrc_mbed BNO055 SDFileSystem NK_mbed
main.cpp
- Committer:
- hamohamo
- Date:
- 2021-08-22
- Revision:
- 1:32030d9ba873
- Parent:
- 0:e32543d6e1e4
File content as of revision 1:32030d9ba873:
/*INCLUDE*/ #include "SDFileSystem.h" #include "mbed.h" #include "rotary_inc.hpp" #include "matrix.h" #include "BNO055.h" #include "NK_PID.hpp" #include <cmath> #include <vector> #include "scrp_slave.hpp" ScrpSlave sendpwm(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800); struct pos{ double x; double y; }; /*FUNCTIONS*/ void route_read(); void odmetry(); void move(double vx,double vy,double vw); void getpoint(pos *p,int n); void getvelocity(double *v,int n); /*DECLARATION*/ SDFileSystem sd(PB_15, PB_14, PB_13, PB_2,"sd"); RotaryInc cenc0(PC_10,PC_11,2*M_PI,256,4); RotaryInc cenc1(PC_4,PA_13,2*M_PI,256,4); RotaryInc cenc2(PA_14,PA_15,2*M_PI,256,4); RotaryInc cenc3(PC_2,PC_3,2*M_PI,256,4); RotaryInc senc0(PA_6,PA_7,2*M_PI,256,4); RotaryInc senc1(PA_8,PA_9,2*M_PI,256,4); RotaryInc senc2(PC_0,PC_1,2*M_PI,256,4); RotaryInc senc3(PA_12,PC_5,2*M_PI,256,4); std::vector<double> t_info,x_info,y_info,v_info,theta_info; /* 01 32 */ Nk_pid mot0(0.0067,0.001,0,0.01); Nk_pid mot1(0.0067,0.001,0,0.01); Nk_pid mot2(0.0067,0.001,0,0.01); Nk_pid mot3(0.0067,0.001,0,0.01); BNO055 bno(PB_3, PB_10); Timer LOOPdt; unsigned long long int t; pos a,b,c; double v = 0; double cwv[4]; double swv[4]; double theta = 0; double r = 50.6; double R = 2.0*r; double cR = 322.5; int n = 0; PwmOut asd(PC_6); int main(){ asd = 1; /*SETUP*/ LOOPdt.start(); /* */ mot0.SetLimit(0.5,0.00,-0.5,-0.00); mot1.SetLimit(0.5,0.00,-0.5,-0.00); mot2.SetLimit(0.5,0.00,-0.5,-0.00); mot3.SetLimit(0.5,0.00,-0.5,-0.00); /*0.07*/ //route_read(); odmetry(); /*LOOP*/ wait(3); while(true){ odmetry(); /* if(sqrt( (a.x-c.x)*(a.x-c.x)+(a.y-c.y)*(a.y-c.y) ) < 30){ getpoint(&a,n); getvelocity(&v,n); if(n<x_info.size()) n++; printf("pass\n"); } double theta = atan2(a.y-c.y,a.x-c.x); move(v*cos(theta),v*sin(theta),0);*/ //move(0.0,2000.0,0.0); //motor0.pwmout(0.2); //printf("%lf\n",cwv[0]*r); sendpwm.send1(255, 1 , -0.3 * 100); while(LOOPdt.read_us()-t <= 10*1000/100*50); sendpwm.send1(255, 2 , 0.3 * 100);/* while(LOOPdt.read_us()-t <= 10*1000/100*70); sendpwm.send1(255, 3 , 0.3 * 100); while(LOOPdt.read_us()-t <= 10*1000/100*90); sendpwm.send1(255, 4 , 0.3 * 100);*/ while(LOOPdt.read_us()-t <= 10*1000); t = LOOPdt.read_us(); } } void route_read() { static double x, y, v, theta; wait(1); pc.printf("Hello World!\n"); wait(0.1); FILE *fp; do { fp = fopen("/sd/route.txt", "r"); wait(0.2); } while(fp==NULL); pc.printf("Good!\n"); while(fscanf(fp,"%lf %lf %lf %lf",&x, &y, &v, &theta) != EOF) { pc.printf("%lf %lf %lf %lf\n",x, y, v, theta); x_info.push_back(x); y_info.push_back(y); v_info.push_back(v); theta_info.push_back(theta); } pc.printf("checking...\n"); for(int k=0;k<x_info.size();k++){ pc.printf("%lf %lf %lf %lf\n",x_info[k],y_info[k],v_info[k],theta_info[k]); } fclose(fp); } void odmetry(){ static Matrix<double> Vr(3, 1); static Matrix<double> J(3, 4); static Matrix<double> W(4, 1); static double gyro = 0.0; static double x = 0.0; static double y = 0.0; static double vx = 0.0; static double vy = 0.0; static double sold0 = 0.0, sold1 = 0.0, sold2 = 0.0, sold3 = 0.0; static double cold0 = 0.0, cold1 = 0.0, cold2 = 0.0, cold3 = 0.0; double cor0 = 0.0, cor1 = 0.0, cor2 = 0.0, cor3 = 0.0; double side0 = 0.0, side1 = 0.0, side2 = 0.0, side3 = 0.0; static bool setup = false; if(!setup){ //bno.setmode(OPERATION_MODE_IMUPLUS); bno.reset(); bno.setmode(OPERATION_MODE_IMUPLUS); bno.get_angles(); /*while(fgyro - (bno.euler.yaw * (M_PI / 180.0)) != 0.0){ fgyro = bno.euler.yaw * (M_PI / 180.0); bno.get_angles(); }*/ setup = true; } cor0 = M_PI*cenc0.get()/1024.0; cor1 = M_PI*cenc1.get()/1024.0; cor2 = M_PI*cenc2.get()/1024.0; cor3 = M_PI*cenc3.get()/1024.0; cwv[0] = (cor0-cold0)/0.01; cwv[1] = (cor1-cold1)/0.01; cwv[2] = (cor2-cold2)/0.01; cwv[3] = (cor3-cold3)/0.01; side0 = M_PI*senc0.get()/1024.0; side1 = M_PI*senc1.get()/1024.0; side2 = M_PI*senc2.get()/1024.0; side3 = M_PI*senc3.get()/1024.0; swv[0] = (side0-sold0)/0.01; swv[1] = (side1-sold1)/0.01; swv[2] = (side2-sold2)/0.01; swv[3] = (side3-sold3)/0.01; cold0 = cor0; cold1 = cor1; cold2 = cor2; cold3 = cor3; sold0 = side0; sold1 = side1; sold2 = side2; sold3 = side3; W.set( 4, cwv[0], cwv[1], cwv[2], cwv[3] ); /* W.set( 4, swv[0], swv[1], swv[2], swv[3] );*/ //W.show(); bno.get_angles(); gyro = bno.euler.yaw * (M_PI / 180.0); theta = (2*M_PI-gyro); /* J.set( 12, -sin(-theta + M_PI/4.0), -sin(-theta + M_PI/2.0 + M_PI/4.0), -sin(-theta + M_PI + M_PI/4.0), -sin(-theta + 3.0*M_PI/2.0 + M_PI/4.0), -cos(-theta + M_PI/4.0), -cos(-theta + M_PI/2.0 + M_PI/4.0), -cos(-theta + M_PI + M_PI/4.0), -cos(-theta + 3.0*M_PI/2.0 + M_PI/4.0), 1.0/(2.0*R), 1.0/(2.0*R), 1.0/(2.0*R), 1.0/(2.0*R) ); */ J.set( 12, -sin(-theta - 2*M_PI/4), -sin(-theta + M_PI/2.0 - 2*M_PI/4), -sin(-theta + M_PI - 2*M_PI/4), -sin(-theta + 3.0*M_PI/2.0 - 2*M_PI/4), -cos(-theta - 2*M_PI/4), -cos(-theta + M_PI/2.0 - 2*M_PI/4), -cos(-theta + M_PI - 2*M_PI/4), -cos(-theta + 3.0*M_PI/2.0 - 2*M_PI/4), 1.0/(2.0*R), 1.0/(2.0*R), 1.0/(2.0*R), 1.0/(2.0*R) ); //J.show(); Vr = J*W*(r/2); //Vr.show(); x += ((vx + Vr[0][0]) * 0.01) / 2.0; y += ((vy + Vr[1][0]) * 0.01) / 2.0; vx = Vr[0][0]; vy = Vr[1][0]; c.x = x; c.y = y; pc.printf("x : %lf y : %lf vr : %lf theta : %lf\r\n", x, y, Vr[2][0], theta); //pc.printf("vx : %lf vy : %lf\r\n",Vr[0][0], Vr[1][0]); } void getpoint(pos *p,int n){ p->x = x_info[n]; p->y = y_info[n]; } void getvelocity(double *v,int n){ *v = v_info[n]; } void move(double vx,double vy,double vw){ static double k = sqrt(2.0)/2.0;; static double target[4]; target[0]= vx*k*(sin(theta)-cos(theta)) - vy*k*(sin(theta)+cos(theta)) + cR*vw; target[1]= -vx*k*(sin(theta)+cos(theta)) - vy*k*(sin(theta)-cos(theta)) + cR*vw; target[2]= -vx*k*(sin(theta)-cos(theta)) + vy*k*(sin(theta)+cos(theta)) + cR*vw; target[3]= vx*k*(sin(theta)+cos(theta)) + vy*k*(sin(theta)-cos(theta)) + cR*vw; /* target[1]=(k*vy-k*vx)+cR*vw; target[0]=(k*vx+k*vy)*-1; target[3]=(k*vx-k*vy)+cR*vw; target[2]=(k*vx+k*vy)+cR*vw;*/ mot0.SetParam(cwv[0]*r/100.0,target[0]/100.0); mot1.SetParam(cwv[1]*r/100.0,target[1]/100.0); mot2.SetParam(cwv[2]*r/100.0,target[2]/100.0); mot3.SetParam(cwv[3]*r/100.0,target[3]/100.0); //printf("%lf\n",mot0.GetGain(1.0)); //motor0.pwmout(mot0.GetGain(1.0) sendpwm.send1(255, 1 ,(mot0.GetGain(1.0) * 100)); while(LOOPdt.read_us()-t <= 10*1000/100*40); sendpwm.send1(255, 2 ,(mot1.GetGain(1.0) * 100)); while(LOOPdt.read_us()-t <= 10*1000/100*70); sendpwm.send1(255, 3 ,(mot2.GetGain(1.0) * 100)); while(LOOPdt.read_us()-t <= 10*1000/100*90); sendpwm.send1(255, 4 ,(mot3.GetGain(1.0) * 100)); //printf("%lf,%lf\n",cwv[0]*r,target[0]); }