![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
All the lab works are here!
Dependencies: ISR_Mini-explorer mbed
Fork of VirtualForces by
main.cpp
- Committer:
- AurelienBernier
- Date:
- 2017-03-24
- Revision:
- 5:dea05b8f30d0
- Parent:
- 4:8c56c3ba6e54
- Child:
- 6:afde4b08166b
File content as of revision 5:dea05b8f30d0:
#include "mbed.h" #include "robot.h" // Initializes the robot. This include should be used in all main.cpp! #include "math.h" float dist(float robot_x, float robot_y, float target_x, float target_y); //Timeout time; int main(){ initRobot(); //Initializing the robot pc.baud(9600); // baud for the pc communication //Target example x,y values float target_x=46.8, target_y=78.6, target_angle=0; float alpha; //angle error float rho; //distance from target float beta; //float k_linear=10, k_angular=200; float kRho=1, ka=8, kb=-2; float linear, angular, angular_left, angular_right; float dt=0.5; float temp; //Diameter of a wheel and distance between the 2 float r=3.25, b=7.2; int speed=999; // Max speed at beggining of movement //Resetting coordinates before moving theta=0; X=0; Y=0; alpha = atan2((target_y-Y),(target_x-X))-theta; alpha = atan(sin(alpha)/cos(alpha)); rho = dist(X, Y, target_x, target_y); beta = -alpha-theta+target_angle; do { pc.printf("\n\n\r entered while"); //Updating X,Y and theta with the odometry values Odometria(); alpha = atan2((target_y-Y),(target_x-X))-theta; alpha = atan(sin(alpha)/cos(alpha)); rho = dist(X, Y, target_x, target_y); //beta = -alpha-theta; beta = -alpha-theta+target_angle; //Computing angle error and distance towards the target value rho += dt*(-kRho*cos(alpha)*rho); temp = alpha; alpha += dt*(kRho*sin(alpha)-ka*alpha-kb*b); b += dt*(-kRho*sin(temp)); pc.printf("\n\r rho=%f", rho); //Computing linear and angular velocities if(alpha>=-1.5708 && alpha<=1.5708){ linear=kRho*rho; angular=ka*alpha+kb*beta; } else{ linear=-kRho*rho; angular=-ka*alpha-kb*beta; } angular_left=(linear-0.5*b*angular)/r; angular_right=(linear+0.5*b*angular)/r; //Slowing down at the end for more precision if (rho<25) { speed = rho*30; } //Normalize speed for motors if(angular_left>angular_right) { angular_right=speed*angular_right/angular_left; angular_left=speed; } else { angular_left=speed*angular_left/angular_right; angular_right=speed; } pc.printf("\n\r X=%f", X); pc.printf("\n\r Y=%f", Y); //Updating motor velocities leftMotor(1,angular_left); rightMotor(1,angular_right); wait(dt); } while(rho>1); //Stop at the end leftMotor(1,0); rightMotor(1,0); pc.printf("\n\r %f -- arrived!", rho); } //Distance computation function float dist(float robot_x, float robot_y, float target_x, float target_y){ return sqrt(pow(target_y-robot_y,2) + pow(target_x-robot_x,2)); } /*static double diffclock(clock_t clock1,clock_t clock2) { double diffticks=clock1-clock2; double diffms=(diffticks)/(CLOCKS_PER_SEC/1000); return diffms; }*/