with class
Dependencies: ISR_Mini-explorer mbed
Fork of VirtualForces by
Diff: MiniExplorerCoimbra.cpp
- Revision:
- 35:68f9edbb3cff
- Parent:
- 34:c208497dd079
- Child:
- 37:b4c45e43ad29
--- a/MiniExplorerCoimbra.cpp Fri Jun 09 14:30:21 2017 +0000 +++ b/MiniExplorerCoimbra.cpp Sun Jun 11 22:40:37 2017 +0000 @@ -3,14 +3,14 @@ #define PI 3.14159 -MiniExplorerCoimbra::MiniExplorerCoimbra(float defaultX, float defaultY, float defaultTheta):map(200,200,20,20),sonarLeft(10*PI/36,-4,4),sonarFront(0,0,5),sonarRight(-10*PI/36,4,4){ +MiniExplorerCoimbra::MiniExplorerCoimbra(float defaultXWorld, float defaultYWorld, float defaultThetaWorld):map(200,200,20,20),sonarLeft(10*PI/36,-4,4),sonarFront(0,0,5),sonarRight(-10*PI/36,4,4){ i2c1.frequency(100000); initRobot(); //Initializing the robot pc.baud(9600); // baud for the pc communication measure_always_on();//TODO check if needed - this->setXYTheta(defaultX,defaultY,defaultTheta); + this->setXYThetaAndXYThetaWorld(defaultXWorld,defaultYWorld,defaultThetaWorld); this->radiusWheels=3.25; this->distanceWheels=7.2; @@ -25,10 +25,26 @@ this->repulsionConstantForce=1; } -void MiniExplorerCoimbra::setXYTheta(float x, float y, float theta){ - X=x; - Y=y; - theta=theta; +void MiniExplorerCoimbra::setXYThetaAndXYThetaWorld(float defaultXWorld, float defaultYWorld, float defaultThetaWorld){ + this->xWorld=defaultXWorld; + this->yWorld=defaultYWorld; + this->thetaWorld=defaultThetaWorld; + X=defaultYWorld; + Y=-defaultXWorld; + if(defaultThetaWorld < -PI/2) + theta=PI/2+PI-defaultThetaWorld; + else + theta=defaultThetaWorld-PI/2; +} + +void MiniExplorerCoimbra::myOdometria(){ + Odometria(); + this->xWorld=-Y; + this->yWorld=X; + if(theta >PI/2) + this->thetaWorld=-PI+(theta-PI/2); + else + this->thetaWorld=theta+PI/2; } //generate a position randomly and makes the robot go there while updating the map @@ -44,21 +60,21 @@ if(signOfY < 1) signOfY=-1; - float targetX = movementOnX*signOfX; - float targetY = movementOnY*signOfY; - float targetAngle = 2*((float)(rand()%31416)-15708)/10000.0; - this->go_to_point_with_angle(targetX, targetY, targetAngle); + float targetXWorld = movementOnX*signOfX; + float targetYWorld = movementOnY*signOfY; + float targetAngleWorld = 2*((float)(rand()%31416)-15708)/10000.0; + this->go_to_point_with_angle(targetXWorld, targetYWorld, targetAngleWorld); } -//go the the given position while updating the map -void MiniExplorerCoimbra::go_to_point_with_angle(float targetX, float targetY, float targetAngle) { - bool keep_going=true; +//move of targetXWorld and targetYWorld ending in a targetAngleWorld +void MiniExplorerCoimbra::go_to_point_with_angle(float targetXWorld, float targetYWorld, float targetAngleWorld) { + bool keepGoing=true; float leftMm; float frontMm; float rightMm; float dt; Timer t; - float d2; + float distanceToTarget; do { //Timer stuff dt = t.read(); @@ -66,7 +82,7 @@ t.start(); //Updating X,Y and theta with the odometry values - Odometria(); + this->myOdometria(); leftMm = get_distance_left_sensor(); frontMm = get_distance_front_sensor(); rightMm = get_distance_right_sensor(); @@ -77,102 +93,56 @@ rightMotor(1,0); this->update_sonar_values(leftMm, frontMm, rightMm); //TODO Giorgos maybe you can also test the do_half_flip() function - Odometria(); + this->myOdometria(); //do a flip TODO - keep_going=false; + keepGoing=false; this->do_half_flip(); }else{ //if not in danger zone continue as usual this->update_sonar_values(leftMm, frontMm, rightMm); //Updating motor velocities - d2=this->update_angular_speed_wheels_go_to_point_with_angle(targetX,targetY,targetAngle,dt); + distanceToTarget=this->update_angular_speed_wheels_go_to_point_with_angle(targetXWorld,targetYWorld,targetAngleWorld,dt); wait(0.2); //Timer stuff t.stop(); - pc.printf("\n\r dist to target= %f",d2); + pc.printf("\n\r dist to target= %f",distanceToTarget); } - } while(d2>1 && (abs(targetAngle-theta)>0.01) && keep_going); + } while(distanceToTarget>1 && (abs(targetAngleWorld-this->thetaWorld)>0.01) && keepGoing); //Stop at the end leftMotor(1,0); rightMotor(1,0); } -void MiniExplorerCoimbra::update_sonar_values(float leftMm,float frontMm,float rightMm){ - float xWorldCell; - float yWorldCell; - float xRobotWorld=this->get_converted_robot_X_into_world(); - float yRobotWorld=this->get_converted_robot_Y_into_world(); - for(int i=0;i<this->map.nbCellWidth;i++){ - for(int j=0;j<this->map.nbCellHeight;j++){ - xWorldCell=this->map.cell_width_coordinate_to_world(i); - yWorldCell=this->map.cell_height_coordinate_to_world(j); - //compute_probability_t(float distanceObstacleDetected, float x, float y, float[2] robotCoordinatesInWorld) - this->map.update_cell_value(i,j,this->sonarRight.compute_probability_t(rightMm,xWorldCell,yWorldCell,xRobotWorld,yRobotWorld,theta)); - this->map.update_cell_value(i,j,this->sonarLeft.compute_probability_t(leftMm,xWorldCell,yWorldCell,xRobotWorld,yWorldCell,theta)); - this->map.update_cell_value(i,j,this->sonarFront.compute_probability_t(frontMm,xWorldCell,yWorldCell,xRobotWorld,yWorldCell,theta)); - - } - } -} - -float MiniExplorerCoimbra::get_converted_robot_X_into_world(){ - //x world coordinate - return this->map.nbCellWidth*this->map.sizeCellWidth-Y; -} - -float MiniExplorerCoimbra::get_converted_robot_Y_into_world(){ - //y worldcoordinate - return X; -} - -void MiniExplorerCoimbra::do_half_flip(){ - Odometria(); - float theta_plus_h_pi=theta+PI/2;//theta is between -PI and PI - if(theta_plus_h_pi > PI) - theta_plus_h_pi=-(2*PI-theta_plus_h_pi); - leftMotor(0,100); - rightMotor(1,100); - while(abs(theta_plus_h_pi-theta)>0.05){ - Odometria(); - // pc.printf("\n\r diff=%f", abs(theta_plus_pi-theta)); - } - leftMotor(1,0); - rightMotor(1,0); -} - -//Distance computation function -float MiniExplorerCoimbra::dist(float robotX, float robotY, float targetX, float targetY){ - //pc.printf("%f, %f, %f, %f",robotX,robotY,targetX,targetY); - return sqrt(pow(targetY-robotY,2) + pow(targetX-robotX,2)); -} - -float MiniExplorerCoimbra::update_angular_speed_wheels_go_to_point_with_angle(float targetX, float targetY, float targetAngle, float dt){ +float MiniExplorerCoimbra::update_angular_speed_wheels_go_to_point_with_angle(float targetXWorld, float targetYWorld, float targetAngleWorld, float dt){ //compute_angles_and_distance - float alpha = atan2((targetY-Y),(targetX-X))-theta; - alpha = atan(sin(alpha)/cos(alpha)); - float rho = this->dist(X, Y, targetX, targetY); - float d2 = rho; - float beta = -alpha-theta+targetAngle; + //atan2 take the deplacement on x and the deplacement on y as parameters + float angleToPoint = atan2((targetYWorld-this->yWorld),(targetXWorld-this->xWorld))-this->thetaWorld; + angleToPoint = atan(sin(angleToPoint)/cos(angleToPoint)); + //rho is the distance to the point of arrival + float rho = dist(targetXWorld,targetYWorld,this->xWorld,this->yWorld); + float distanceToTarget = rho; + //TODO check that + float beta = targetAngleWorld-angleToPoint-this->thetaWorld; //Computing angle error and distance towards the target value - rho += dt*(-this->khro*cos(alpha)*rho); - float temp = alpha; - alpha += dt*(this->khro*sin(alpha)-this->ka*alpha-this->kb*beta); + rho += dt*(-this->khro*cos(angleToPoint)*rho); + float temp = angleToPoint; + angleToPoint += dt*(this->khro*sin(angleToPoint)-this->ka*angleToPoint-this->kb*beta); beta += dt*(-this->khro*sin(temp)); //Computing linear and angular velocities float linear; float angular; - if(alpha>=-1.5708 && alpha<=1.5708){ + if(angleToPoint>=-1.5708 && angleToPoint<=1.5708){ linear=this->khro*rho; - angular=this->ka*alpha+this->kb*beta; + angular=this->ka*angleToPoint+this->kb*beta; } else{ linear=-this->khro*rho; - angular=-this->ka*alpha-this->kb*beta; + angular=-this->ka*angleToPoint-this->kb*beta; } float angular_left=(linear-0.5*this->distanceWheels*angular)/this->radiusWheels; float angular_right=(linear+0.5*this->distanceWheels*angular)/this->radiusWheels; @@ -190,12 +160,39 @@ leftMotor(1,angular_left); rightMotor(1,angular_right); - return d2; + return distanceToTarget; } +void MiniExplorerCoimbra::update_sonar_values(float leftMm,float frontMm,float rightMm){ + float xWorldCell; + float yWorldCell; + for(int i=0;i<this->map.nbCellWidth;i++){ + for(int j=0;j<this->map.nbCellHeight;j++){ + xWorldCell=this->map.cell_width_coordinate_to_world(i); + yWorldCell=this->map.cell_height_coordinate_to_world(j); + //compute_probability_t(float distanceObstacleDetected, float x, float y, float[2] robotCoordinatesInWorld) + this->map.update_cell_value(i,j,this->sonarRight.compute_probability_t(rightMm,xWorldCell,yWorldCell,this->xWorld,this->yWorld,theta)); + this->map.update_cell_value(i,j,this->sonarLeft.compute_probability_t(leftMm,xWorldCell,yWorldCell,this->xWorld,yWorldCell,theta)); + this->map.update_cell_value(i,j,this->sonarFront.compute_probability_t(frontMm,xWorldCell,yWorldCell,this->xWorld,yWorldCell,theta)); + + } + } +} + +//Distance computation function +float MiniExplorerCoimbra::dist(float x1, float y1, float x2, float y2){ + return sqrt(pow(y2-y1,2) + pow(x2-x1,2)); +} + +//use virtual force field void MiniExplorerCoimbra::try_to_reach_target(float targetXWorld,float targetYWorld){ //atan2 gives the angle beetween PI and -PI - float angleToTarget=atan2(targetXWorld,targetYWorld); + this->myOdometria(); + /* + float deplacementOnXWorld=targetXWorld-this->xWorld; + float deplacementOnYWorld=targetYWorld-this->yWorld; + */ + float angleToTarget=atan2(targetXWorld-this->xWorld,targetYWorld-this->yWorld); turn_to_target(angleToTarget); bool reached=false; int print=0; @@ -205,15 +202,7 @@ if(print==10){ leftMotor(1,0); rightMotor(1,0); - /* - pc.printf("\r\n theta=%f", theta); - pc.printf("\r\n IN ORTHO:"); - pc.printf("\r\n X Robot=%f", this->get_converted_robot_X_into_world()); - pc.printf("\r\n Y Robot=%f", this->get_converted_robot_Y_into_world()); - pc.printf("\r\n X Target=%f", targetXWorld); - pc.printf("\r\n Y Target=%f", targetYWorld); - */ - this->print_final_map_with_robot_position_and_target(X,Y,targetXWorld,targetYWorld); + this->print_final_map_with_robot_position_and_target(targetXWorld,targetYWorld); print=0; }else print+=1; @@ -230,10 +219,10 @@ float line_b; float line_c; //Updating X,Y and theta with the odometry values - float forceX=0; - float forceY=0; + float forceXWorld=0; + float forceYWorld=0; //we update the odometrie - Odometria(); + this->myOdometria(); //we check the sensors float leftMm = get_distance_left_sensor(); float frontMm = get_distance_front_sensor(); @@ -241,64 +230,58 @@ //update the probabilities values this->update_sonar_values(leftMm, frontMm, rightMm); //we compute the force on X and Y - this->compute_forceX_and_forceY(&forceX, &forceY,targetXWorld,targetYWorld); + this->compute_forceX_and_forceY(&forceXWorld, &forceYWorld,targetXWorld,targetYWorld); //we compute a new ine - this->calculate_line(forceX, forceY, &line_a,&line_b,&line_c); + this->calculate_line(forceXWorld, forceYWorld, &line_a,&line_b,&line_c); //Updating motor velocities this->go_to_line(line_a,line_b,line_c,targetXWorld,targetYWorld); //wait(0.1); - Odometria(); - if(dist(this->get_converted_robot_X_into_world(),this->get_converted_robot_Y_into_world(),targetXWorld,targetYWorld)<10) + this->myOdometria(); + if(dist(this->xWorld,this->yWorld,targetXWorld,targetYWorld)<10) *reached=true; } //compute the force on X and Y -void MiniExplorerCoimbra::compute_forceX_and_forceY(float* forceX, float* forceY, float targetXWorld, float targetYWorld){ - float xRobotWorld=this->get_converted_robot_X_into_world(); - float yRobotWorld=this->get_converted_robot_Y_into_world(); - +void MiniExplorerCoimbra::compute_forceX_and_forceY(float* forceXWorld, float* forceYWorld, float targetXWorld, float targetYWorld){ float forceRepulsionComputedX=0; float forceRepulsionComputedY=0; //for each cell of the map we compute a force of repulsion for(int i=0;i<this->map.nbCellWidth;i++){ for(int j=0;j<this->map.nbCellHeight;j++){ - this->update_force(i,j,&forceRepulsionComputedX,&forceRepulsionComputedY,xRobotWorld,yRobotWorld); + this->update_force(i,j,&forceRepulsionComputedX,&forceRepulsionComputedY); } } //update with attraction force - *forceX=+forceRepulsionComputedX; - *forceY=+forceRepulsionComputedY; - float distanceTargetRobot=sqrt(pow(targetXWorld-xRobotWorld,2)+pow(targetYWorld-yRobotWorld,2)); + *forceXWorld=+forceRepulsionComputedX; + *forceYWorld=+forceRepulsionComputedY; + float distanceTargetRobot=sqrt(pow(targetXWorld-this->xWorld,2)+pow(targetYWorld-this->yWorld,2)); if(distanceTargetRobot != 0){ - *forceX-=this->attractionConstantForce*(targetXWorld-xRobotWorld)/distanceTargetRobot; - *forceY-=this->attractionConstantForce*(targetYWorld-yRobotWorld)/distanceTargetRobot; + *forceXWorld-=this->attractionConstantForce*(targetXWorld-this->xWorld)/distanceTargetRobot; + *forceYWorld-=this->attractionConstantForce*(targetYWorld-this->yWorld)/distanceTargetRobot; } - float amplitude=sqrt(pow(*forceX,2)+pow(*forceY,2)); + float amplitude=sqrt(pow(*forceXWorld,2)+pow(*forceYWorld,2)); if(amplitude!=0){//avoid division by 0 if forceX and forceY == 0 - *forceX=*forceX/amplitude; - *forceY=*forceY/amplitude; + *forceXWorld=*forceXWorld/amplitude; + *forceYWorld=*forceYWorld/amplitude; } } -void MiniExplorerCoimbra::update_force(int widthIndice, int heightIndice, float* forceX, float* forceY, float xRobotWorld, float yRobotWorld ){ +void MiniExplorerCoimbra::update_force(int widthIndice, int heightIndice, float* forceRepulsionComputedX, float* forceRepulsionComputedY ){ //get the coordonate of the map and the robot in the ortonormal space float xWorldCell=this->map.cell_width_coordinate_to_world(widthIndice); float yWorldCell=this->map.cell_height_coordinate_to_world(heightIndice); - //compute the distance beetween the cell and the robot - float distanceCellToRobot=sqrt(pow(xWorldCell-xRobotWorld,2)+pow(yWorldCell-yRobotWorld,2)); + float distanceCellToRobot=sqrt(pow(xWorldCell-this->xWorld,2)+pow(yWorldCell-this->yWorld,2)); //check if the cell is in range if(distanceCellToRobot <= this->rangeForce) { float probaCell=this->map.get_proba_cell(widthIndice,heightIndice); - float xForceComputed=this->repulsionConstantForce*probaCell*(xWorldCell-xRobotWorld)/pow(distanceCellToRobot,3); - float yForceComputed=this->repulsionConstantForce*probaCell*(yWorldCell-yRobotWorld)/pow(distanceCellToRobot,3); - *forceX+=xForceComputed; - *forceY+=yForceComputed; + *forceRepulsionComputedX+=this->repulsionConstantForce*probaCell*(xWorldCell-this->xWorld)/pow(distanceCellToRobot,3); + *forceRepulsionComputedY+=this->repulsionConstantForce*probaCell*(yWorldCell-this->yWorld)/pow(distanceCellToRobot,3); } } -//robotX and robotY are from Odometria, calculate line_a, line_b and line_c +//robotX and robotY are from this->myOdometria(), calculate line_a, line_b and line_c void MiniExplorerCoimbra::calculate_line(float forceX, float forceY, float *line_a, float *line_b, float *line_c){ /* in the teachers maths it is @@ -309,7 +292,7 @@ because a*x+b*y+c=0 a impact the vertical and b the horizontal and he has to put them like this because - Robot space: orthonormal space: + Robot space: World space: ^ ^ |x |y <- R O -> @@ -319,7 +302,7 @@ *line_a=forceX; *line_b=forceY; //because the line computed always pass by the robot center we dont need lince_c - //*line_c=forceX*yRobotWorld+forceY*xRobotWorld; + //*line_c=forceX*this->yWorld+forceY*this->xWorld; *line_c=0; } @@ -330,41 +313,23 @@ float linear; float angular; - bool direction=true; + //atan2 use the deplacement on X and the deplacement on Y + float angleToTarget=atan2(targetXWorld-this->xWorld,targetYWorld-this->yWorld); + bool aligned=false; + + //this condition is passed if the target is in the same direction as the robot orientation + if((angleToTarget>0 && this->thetaWorld > 0) || (angleToTarget<0 && this->thetaWorld <0)) + aligned=true; - //take as parameter how much the robot is supposed to move on x and y (world) - float angleToTarget=atan2(targetXWorld-this->get_converted_robot_X_into_world(),targetYWorld-this->get_converted_robot_Y_into_world()); - bool inFront=true; - if(angleToTarget < 0)//the target is in front - inFront=false; - - if(theta > 0){ - //the robot is oriented to the left - if(theta > PI/2){ - //the robot is oriented lower left - if(inFront) - direction=false;//robot and target not oriented the same way - }else{ - //the robot is oriented upper left - if(!inFront) - direction=false;//robot and target not oriented the same way - } - }else{ - //the robot is oriented to the right - if(theta < -PI/2){ - //the robot is oriented lower right - if(inFront) - direction=false;//robot and target not oriented the same way - }else{ - //the robot is oriented upper right - if(!inFront) - direction=false;//robot and target not oriented the same way - } - } - //pc.printf("\r\n Target is in front"); - + //line angle is beetween pi/2 and -pi/2 + /* + ax+by+c=0 (here c==0) + y=x*-a/b + if a*b > 0, the robot is going down + if a*b <0, the robot is going up + */ if(line_b!=0){ - if(!direction) + if(!aligned) lineAngle=atan(-line_a/line_b); else lineAngle=atan(line_a/-line_b); @@ -374,7 +339,7 @@ } //Computing angle error - angleError = lineAngle-theta; + angleError = lineAngle-this->thetaWorld;//TODO that I m not sure angleError = atan(sin(angleError)/cos(angleError)); //Calculating velocities @@ -397,28 +362,12 @@ rightMotor(this->sign2(angularRight),abs(angularRight)); } -//return 1 if positiv, -1 if negativ -float MiniExplorerCoimbra::sign1(float value){ - if(value>=0) - return 1; - else - return -1; -} - -//return 1 if positiv, 0 if negativ -int MiniExplorerCoimbra::sign2(float value){ - if(value>=0) - return 1; - else - return 0; -} - /*angleToTarget is obtained through atan2 so it s: < 0 if the angle is bettween PI and 2pi on a trigo circle > 0 if it is between 0 and PI */ void MiniExplorerCoimbra::turn_to_target(float angleToTarget){ - Odometria(); + this->myOdometria(); float theta_plus_h_pi=theta+PI/2;//theta is between -PI and PI if(theta_plus_h_pi > PI) theta_plus_h_pi=-(2*PI-theta_plus_h_pi); @@ -430,7 +379,7 @@ rightMotor(0,1); } while(abs(angleToTarget-theta_plus_h_pi)>0.05){ - Odometria(); + this->myOdometria(); theta_plus_h_pi=theta+PI/2;//theta is between -PI and PI if(theta_plus_h_pi > PI) theta_plus_h_pi=-(2*PI-theta_plus_h_pi); @@ -440,31 +389,23 @@ rightMotor(1,0); } +void MiniExplorerCoimbra::do_half_flip(){ + this->myOdometria(); + float theta_plus_h_pi=theta+PI/2;//theta is between -PI and PI + if(theta_plus_h_pi > PI) + theta_plus_h_pi=-(2*PI-theta_plus_h_pi); + leftMotor(0,100); + rightMotor(1,100); + while(abs(theta_plus_h_pi-theta)>0.05){ + this->myOdometria(); + // pc.printf("\n\r diff=%f", abs(theta_plus_pi-theta)); + } + leftMotor(1,0); + rightMotor(1,0); +} -/* -//x and y passed are TargetNotMap -float get_error_angles(float x, float y,float theta){ - float angleBeetweenRobotAndTarget=atan2(y,x); - if(y > 0){ - if(angleBeetweenRobotAndTarget < PI/2)//up right - angleBeetweenRobotAndTarget=-PI/2+angleBeetweenRobotAndTarget; - else//up right - angleBeetweenRobotAndTarget=angleBeetweenRobotAndTarget-PI/2; - }else{ - if(angleBeetweenRobotAndTarget > -PI/2)//lower right - angleBeetweenRobotAndTarget=angleBeetweenRobotAndTarget-PI/2; - else//lower left - angleBeetweenRobotAndTarget=2*PI+angleBeetweenRobotAndTarget-PI/2; - } - return angleBeetweenRobotAndTarget-theta; -} -*/ - - -void MiniExplorerCoimbra::print_final_map_with_robot_position(float robot_x,float robot_y) { +void MiniExplorerCoimbra::print_final_map_with_robot_position() { float currProba; - float Xrobot=this->map.robot_x_coordinate_in_world(robot_x,robot_y); - float Yrobot=this->map.robot_y_coordinate_in_world(robot_x,robot_y); float heightIndiceInOrthonormal; float widthIndiceInOrthonormal; @@ -480,7 +421,7 @@ for (int x= 0; x<this->map.nbCellWidth; x++) { heightIndiceInOrthonormal=this->map.cell_height_coordinate_to_world(y); widthIndiceInOrthonormal=this->map.cell_width_coordinate_to_world(x); - if(Yrobot >= (heightIndiceInOrthonormal+heightMalus) && Yrobot <= (heightIndiceInOrthonormal+heightBonus) && Xrobot >= (widthIndiceInOrthonormal+widthMalus) && Xrobot <= (widthIndiceInOrthonormal+widthBonus)) + if(this->yWorld >= (heightIndiceInOrthonormal+heightMalus) && this->yWorld <= (heightIndiceInOrthonormal+heightBonus) && this->xWorld >= (widthIndiceInOrthonormal+widthMalus) && this->xWorld <= (widthIndiceInOrthonormal+widthBonus)) pc.printf(" R "); else{ currProba=this->map.log_to_proba(this->map.cellsLogValues[x][y]); @@ -498,10 +439,8 @@ } } -void MiniExplorerCoimbra::print_final_map_with_robot_position_and_target(float robot_x,float robot_y,float targetXWorld, float targetYWorld) { +void MiniExplorerCoimbra::print_final_map_with_robot_position_and_target(float targetXWorld, float targetYWorld) { float currProba; - float Xrobot=this->map.robot_x_coordinate_in_world(robot_x,robot_y); - float Yrobot=this->map.robot_y_coordinate_in_world(robot_x,robot_y); float heightIndiceInOrthonormal; float widthIndiceInOrthonormal; @@ -517,7 +456,7 @@ for (int x= 0; x<this->map.nbCellWidth; x++) { heightIndiceInOrthonormal=this->map.cell_height_coordinate_to_world(y); widthIndiceInOrthonormal=this->map.cell_width_coordinate_to_world(x); - if(Yrobot >= (heightIndiceInOrthonormal+heightMalus) && Yrobot <= (heightIndiceInOrthonormal+heightBonus) && Xrobot >= (widthIndiceInOrthonormal+widthMalus) && Xrobot <= (widthIndiceInOrthonormal+widthBonus)) + if(this->yWorld >= (heightIndiceInOrthonormal+heightMalus) && this->yWorld <= (heightIndiceInOrthonormal+heightBonus) && this->xWorld >= (widthIndiceInOrthonormal+widthMalus) && this->xWorld <= (widthIndiceInOrthonormal+widthBonus)) pc.printf(" R "); else{ if(targetYWorld >= (heightIndiceInOrthonormal+heightMalus) && targetYWorld <= (heightIndiceInOrthonormal+heightBonus) && targetXWorld >= (widthIndiceInOrthonormal+widthMalus) && targetXWorld <= (widthIndiceInOrthonormal+widthBonus)) @@ -557,3 +496,49 @@ pc.printf("\n\r"); } } + +//return 1 if positiv, -1 if negativ +float MiniExplorerCoimbra::sign1(float value){ + if(value>=0) + return 1; + else + return -1; +} + +//return 1 if positiv, 0 if negativ +int MiniExplorerCoimbra::sign2(float value){ + if(value>=0) + return 1; + else + return 0; +} + +/*UNUSED +float MiniExplorerCoimbra::get_converted_robot_X_into_world(){ + //x world coordinate + return this->map.nbCellWidth*this->map.sizeCellWidth-Y; +} + +float MiniExplorerCoimbra::get_converted_robot_Y_into_world(){ + //y worldcoordinate + return X; +} + + +//x and y passed are TargetNotMap +float get_error_angles(float x, float y,float theta){ + float angleBeetweenRobotAndTarget=atan2(y,x); + if(y > 0){ + if(angleBeetweenRobotAndTarget < PI/2)//up right + angleBeetweenRobotAndTarget=-PI/2+angleBeetweenRobotAndTarget; + else//up right + angleBeetweenRobotAndTarget=angleBeetweenRobotAndTarget-PI/2; + }else{ + if(angleBeetweenRobotAndTarget > -PI/2)//lower right + angleBeetweenRobotAndTarget=angleBeetweenRobotAndTarget-PI/2; + else//lower left + angleBeetweenRobotAndTarget=2*PI+angleBeetweenRobotAndTarget-PI/2; + } + return angleBeetweenRobotAndTarget-theta; +} +*/ \ No newline at end of file