with class

Dependencies:   ISR_Mini-explorer mbed

Fork of VirtualForces by Georgios Tsamis

MiniExplorerCoimbra.hpp

Committer:
Ludwigfr
Date:
2017-06-09
Revision:
34:c208497dd079
Parent:
33:814bcd7d3cfe
Child:
35:68f9edbb3cff

File content as of revision 34:c208497dd079:

#ifndef MINIEXPLORERCOIMBRA_HPP
#define MINIEXPLORERCOIMBRA_HPP

#include "Map.hpp"
#include "Sonar.hpp"
#include<math.h>


	/*
Robot coordinate system:      World coordinate system:
      ^                 				^
      |x                				|y
   <--R                 				O-->
    y                     				 x
*/

class MiniExplorerCoimbra {
	
	public:
	
	Map map;
	Sonar sonarLeft;
	Sonar sonarFront;
	Sonar sonarRight;
	float speed;
	float radiusWheels;
	float distanceWheels; 
	float khro;
	float ka;
	float kb;
	float kv;
	float kh;

	float rangeForce;
	float attractionConstantForce;
	float repulsionConstantForce;

	MiniExplorerCoimbra(float defaultX, float defaultY, float defaultTheta);

	void setXYTheta(float x, float y, float theta);
	
	//generate a position randomly and makes the robot go there while updating the map
	void randomize_and_map();
	
	//go the the given position while updating the map
	void go_to_point_with_angle(float targetX, float targetY, float targetAngle);
	
	void update_sonar_values(float leftMm,float frontMm,float rightMm);
	
	float get_converted_robot_X_into_world();
	
	float get_converted_robot_Y_into_world();
	
	void do_half_flip();
	
	//Distance computation function
	float dist(float robotX, float robotY, float targetX, float targetY);
	
	float update_angular_speed_wheels_go_to_point_with_angle(float targetX, float targetY, float targetAngle, float dt);
	
	void try_to_reach_target(float targetXWorld,float targetYWorld);
	
	void vff(bool* reached, float targetXWorld, float targetYWorld);
	
	//compute the force on X and Y
	void compute_forceX_and_forceY(float* forceX, float* forceY, float targetXWorld, float targetYWorld);
	
	void update_force(int widthIndice, int heightIndice, float* forceX, float* forceY, float xRobotWorld, float yRobotWorld );
	
	//robotX and robotY are from Odometria, calculate line_a, line_b and line_c
	void calculate_line(float forceX, float forceY, float *line_a, float *line_b, float *line_c);
	
	//currently line_c is not used
	void go_to_line(float line_a, float line_b, float line_c,float targetXWorld, float targetYWorld);
	
	//return 1 if positiv, -1 if negativ
	float sign1(float value);
	
	//return 1 if positiv, 0 if negativ
	int sign2(float value);
	
	/*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 turn_to_target(float angleToTarget);
	
	void print_final_map();
	
	void print_final_map_with_robot_position(float robot_x,float robot_y);
	
	void print_final_map_with_robot_position_and_target(float robot_x,float robot_y,float targetXWorld, float targetYWorld);
};


#endif