From 3822cfc78c14d153b9e65a0749a4900cb25eabdd Mon Sep 17 00:00:00 2001
From: Farid Alijani <farid.alijani@student.lut.fi>
Date: Thu, 21 Apr 2016 21:54:40 +0200
Subject: [PATCH] PID controller modified

---
 .../CamMark/camtomar/include/VisionControl.h  |  38 +-
 .../CamMark/camtomar/include/VisionControl.h~ |  41 +--
 .../CamMark/camtomar/src/VisionControl.cpp    | 339 ++++--------------
 .../CamMark/camtomar/src/VisionControl.cpp~   |  21 +-
 .../CamMark/camtomar/src/run_vis_cont.cpp     |   8 +-
 .../CamMark/camtomar/src/run_vis_cont.cpp~    |   8 +-
 .../Machine_Learning/Practice/Q_Learning      | Bin 14442 -> 14443 bytes
 .../Machine_Learning/Practice/Q_learning.cpp  |  10 +-
 .../Machine_Learning/Practice/Q_learning.cpp~ |  14 +-
 MobileRobot/Machine_Learning/Practice/iANDj   | Bin 0 -> 9425 bytes
 .../Practice/iANDj_publishe.cpp               |  67 ++++
 .../Practice/iANDj_publishe.cpp~              |  67 ++++
 12 files changed, 248 insertions(+), 365 deletions(-)
 create mode 100755 MobileRobot/Machine_Learning/Practice/iANDj
 create mode 100644 MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp
 create mode 100644 MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp~

diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h
index 0adcc11b..48e600a4 100644
--- a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h
+++ b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h
@@ -36,7 +36,7 @@ using namespace cv;
 using namespace aruco;
 using namespace std;
 
-class VisCont
+class PID4Docking
 {
 private:
 
@@ -98,9 +98,9 @@ private:
         
 public:
 
-  VisCont();
+  PID4Docking();
     
-  ~VisCont();
+  ~PID4Docking();
   
   Mat getCurrentImage();
 
@@ -159,42 +159,10 @@ public:
         static double control_signalYAW;
         // ---- CONTROLL PARAMETERS ------ //
         
-	        
-	// ---- Q_LEARNING PARAMETERS ------ //
-
 	static double x_new,y_new,theta_new; 	// inp (y,theta)
 	static const double y_up,y_dwn,theta_up,theta_dwn;
 	static double Kp_y,Ki_y,Kd_y; 		// actions (Kp,Ki,Kd)
 	
-	static int R_indx_i, R_indx_j, P_indx_i, P_indx_j;
-
-
-	static const int row, col;
-	static double gamma;
-	static double alpha;
-	static double R_step;
-	
-	static double R[7][7];
-	static double Q[7][7];
-
-	static double Q_curr_state,Q_next_state;
-	static double reward;
-	static int counter;
-	static int Time_Reward;
-	static double sample;
-
-	void Q_Learning(double y, double theta);
-	void print_Q();
-
-	void print_R();
-
-	// ---- Q_LEARNING PARAMETERS ------ //
-
-
-	// ---- TIMER PARAMETERS ------ //
-	static int msec,sec,min,hr;
-	// ---- TIMER PARAMETERS ------ //
-
 	static double docking_counter;
 	static double dock_started,dock_finished,docking_duration;
 	
diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~ b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~
index 20512a5a..79669717 100644
--- a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~
+++ b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~
@@ -36,7 +36,7 @@ using namespace cv;
 using namespace aruco;
 using namespace std;
 
-class VisCont
+class PID4Docking
 {
 private:
 
@@ -98,9 +98,9 @@ private:
         
 public:
 
-  VisCont();
+  PID4Docking();
     
-  ~VisCont();
+  ~PID4Docking();
   
   Mat getCurrentImage();
 
@@ -159,42 +159,10 @@ public:
         static double control_signalYAW;
         // ---- CONTROLL PARAMETERS ------ //
         
-	        
-	// ---- Q_LEARNING PARAMETERS ------ //
-
 	static double x_new,y_new,theta_new; 	// inp (y,theta)
 	static const double y_up,y_dwn,theta_up,theta_dwn;
 	static double Kp_y,Ki_y,Kd_y; 		// actions (Kp,Ki,Kd)
 	
-	static int R_indx_i, R_indx_j, P_indx_i, P_indx_j;
-
-
-	static const int row, col;
-	static double gamma;
-	static double alpha;
-	static double R_step;
-	
-	static double R[7][7];
-	static double Q[7][7];
-
-	static double Q_curr_state,Q_next_state;
-	static double reward;
-	static int counter;
-	static int Time_Reward;
-	static double sample;
-
-	void Q_Learning(double y, double theta);
-	void print_Q();
-
-	void print_R();
-
-	// ---- Q_LEARNING PARAMETERS ------ //
-
-
-	// ---- TIMER PARAMETERS ------ //
-	static int msec,sec,min,hr;
-	// ---- TIMER PARAMETERS ------ //
-
 	static double docking_counter;
 	static double dock_started,dock_finished,docking_duration;
 	
@@ -204,10 +172,9 @@ public:
 	static double Py_eps,Pz_eps,A_eps;
 	static double x_thresh_undock,y_thresh_undock,theta_thresh_undock;
 	static double rand_X_SM,rand_A_esp,rand_Y_esp;
-	static double speed_reducer;
+	static double speed_reducer_X,speed_reducer_Y,speed_reducer_theta;
 
         double marpose[6];
         double camPose[6];
         static const double RefPose[4];
         
-};
diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp
index 34650155..94c0e546 100644
--- a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp
+++ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp
@@ -42,140 +42,113 @@
 
 #include<VisionControl.h>
 
+
+
 using namespace cv;
 using namespace aruco;
 using namespace std;
 
-float VisCont::TheMarkerSize = .1; // Default marker size
+float PID4Docking::TheMarkerSize = .1; // Default marker size
 
-int VisCont::Thresh1_min = 10;
-int VisCont::Thresh2_min = 10;
+int PID4Docking::Thresh1_min = 10;
+int PID4Docking::Thresh2_min = 10;
 
-int VisCont::Thresh1_max = 300;
-int VisCont::Thresh2_max = 300;
+int PID4Docking::Thresh1_max = 300;
+int PID4Docking::Thresh2_max = 300;
 
-const string VisCont::trackbarWindowName = "Trackbars";
+const string PID4Docking::trackbarWindowName = "Trackbars";
 
-int VisCont::ThePyrDownLevel = 0;
+int PID4Docking::ThePyrDownLevel = 0;
 
-bool VisCont::update_images = true;
+bool PID4Docking::update_images = true;
 
-bool VisCont::found = false;
-bool VisCont::Go2RandomPose = false;
+bool PID4Docking::found = false;
+bool PID4Docking::Go2RandomPose = false;
 
-int VisCont::ThresParam1 = 0;
-int VisCont::ThresParam2 = 0;
+int PID4Docking::ThresParam1 = 0;
+int PID4Docking::ThresParam2 = 0;
 
 // ---- CONTROLL PARAMETERS ------ //
-double VisCont::prev_errorX, VisCont::curr_errorX, VisCont::int_errorX, VisCont::diffX;
+double PID4Docking::prev_errorX, PID4Docking::curr_errorX, PID4Docking::int_errorX, PID4Docking::diffX;
 
-double VisCont::p_termX = 0;
-double VisCont::i_termX = 0;
-double VisCont::d_termX = 0;
+double PID4Docking::p_termX = 0;
+double PID4Docking::i_termX = 0;
+double PID4Docking::d_termX = 0;
 
-double VisCont::prev_errorY, VisCont::curr_errorY, VisCont::int_errorY, VisCont::diffY;
+double PID4Docking::prev_errorY, PID4Docking::curr_errorY, PID4Docking::int_errorY, PID4Docking::diffY;
 
-double VisCont::p_termY = 0;
-double VisCont::i_termY = 0;
-double VisCont::d_termY = 0;
+double PID4Docking::p_termY = 0;
+double PID4Docking::i_termY = 0;
+double PID4Docking::d_termY = 0;
 
-double VisCont::prev_errorYAW,VisCont::curr_errorYAW,VisCont::int_errorYAW,VisCont::diffYAW;
+double PID4Docking::prev_errorYAW,PID4Docking::curr_errorYAW,PID4Docking::int_errorYAW,PID4Docking::diffYAW;
 
-double VisCont::p_termYAW = 0;
-double VisCont::i_termYAW = 0;
-double VisCont::d_termYAW = 0;
+double PID4Docking::p_termYAW = 0;
+double PID4Docking::i_termYAW = 0;
+double PID4Docking::d_termYAW = 0;
 
-double VisCont::control_signalX, VisCont::control_signalY, VisCont::control_signalYAW;
+double PID4Docking::control_signalX, PID4Docking::control_signalY, PID4Docking::control_signalYAW;
 // ---- CONTROLL PARAMETERS ------ //
 
 
 // ---- Ref. Values for Android Camera ---- //
-//const double VisCont::RefPose[4] = {-.0957, 0.00638817 /* Y_ref*/ ,  0.308857 /* X_ref*/ , 0.17 /* theta_ref*/}; 
+//const double PID4Docking::RefPose[4] = {-.0957, 0.00638817 /* Y_ref*/ ,  0.308857 /* X_ref*/ , 0.17 /* theta_ref*/}; 
 
 
 // ---- Ref. Values for Logitech Camera ---- //
-const double VisCont::RefPose[4] = {-.0957, -0.0271482 /* Y_ref*/ ,  0.266214 /* X_ref*/ , -0.535344 /* theta_ref*/}; 
-
+const double PID4Docking::RefPose[4] = {-.0957, -0.0295876 /* Y_ref*/ ,  0.218695 /* X_ref*/ , -0.637745 /* theta_ref*/}; 
 
 // ----------------  PID gains---------------- //
-double VisCont::Kp_y = .7; //.7
-double VisCont::Ki_y = .005;//.005
-double VisCont::Kd_y = .2;
+double PID4Docking::Kp_y = .7; //.7
+double PID4Docking::Ki_y = .001;//.005
+double PID4Docking::Kd_y = .2;
 
-double VisCont::Kp_theta = .1 * Kp_y; // .08 * Kp_y
-double VisCont::Ki_theta = .07 * Ki_y;
-double VisCont::Kd_theta = .00005 * Kd_y;
+double PID4Docking::Kp_theta = .2 * Kp_y;
+double PID4Docking::Ki_theta = .6 * Ki_y; // .07 * Ki_y
+double PID4Docking::Kd_theta = .00005 * Kd_y;
 // ----------------  PID gains---------------- //
 
 
-double VisCont::TT_S,VisCont::TT_E;
+double PID4Docking::TT_S,PID4Docking::TT_E;
 // random pose initialized
-const double VisCont::y_up = .3; 
-const double VisCont::y_dwn = -.1; 
-
-const double VisCont::theta_dwn = -.7 /*-RefPose[3]*/; 
-const double VisCont::theta_up = .7 /*RefPose[3]*/;
-
-double VisCont::x_new,VisCont::y_new,VisCont::theta_new;
-
-// ----------------  Q_LEARNING PARAMETERS ---------------- //
-
-double VisCont::gamma = .8;
-double VisCont::alpha = .1;
-double VisCont::R_step = 200;
+const double PID4Docking::y_up = .3; 
+const double PID4Docking::y_dwn = -.1; 
 
-const int VisCont::row = 5/*(y_up - y_dwn) * 10000*/;
-const int VisCont::col = 5/*(theta_up - theta_dwn) * 1000*/;
+const double PID4Docking::theta_dwn = -.7 /*-RefPose[3]*/; 
+const double PID4Docking::theta_up = .7 /*RefPose[3]*/;
 
-double VisCont::Q[7][7] = {0};
-double VisCont::R[7][7] = {0};
+double PID4Docking::x_new,PID4Docking::y_new,PID4Docking::theta_new;
 
-double VisCont::Q_next_state;
 
-int VisCont::counter = 1;
-int VisCont::Time_Reward;
-double VisCont::sample;
+double PID4Docking::dock_started,PID4Docking::dock_finished,PID4Docking::docking_duration;
+double PID4Docking::zeroMax = .0000000000000000001;
+double PID4Docking::zeroMin = -.0000000000000000001;
 
-int VisCont::R_indx_i = 0;
-int VisCont::R_indx_j = 2;
-
-int VisCont::P_indx_i = 1;
-int VisCont::P_indx_j = 1;
-// ----------------  Q_LEARNING PARAMETERS ---------------- //
-
-double VisCont::dock_started,VisCont::dock_finished,VisCont::docking_duration;
-double VisCont::zeroMax = .0000000000000000001;
-double VisCont::zeroMin = -.0000000000000000001;
-
-double VisCont::speed_reducer_X = 1;
-double VisCont::speed_reducer_Y = 1;
-double VisCont::speed_reducer_theta = 1;
+double PID4Docking::speed_reducer_X = 1;
+double PID4Docking::speed_reducer_Y = 1;
+double PID4Docking::speed_reducer_theta = 1;
 
 // ------ offsets X, Y, theta for Docking ---------
-double VisCont::Pz_eps = .001;
-double VisCont::Py_eps = .005;
-double VisCont::A_eps = (CV_PI/180) * 6; // 1 deg.
+double PID4Docking::Pz_eps = .001;
+double PID4Docking::Py_eps = .002;
+double PID4Docking::A_eps = (CV_PI/180) * 1; // 1 deg.
 
-double VisCont::safety_margin_X = .2; // safety margin X axis in docking process : 12 cm
+double PID4Docking::safety_margin_X = .15; // safety margin X axis in docking process : 18 cm
 
 // ------ offsets X, Y, theta for Undocking ---------
-double VisCont::x_thresh_undock = .02;
-double VisCont::y_thresh_undock = .015;
-double VisCont::theta_thresh_undock = (CV_PI/180) * 3;
+double PID4Docking::x_thresh_undock = .02;
+double PID4Docking::y_thresh_undock = .015;
+double PID4Docking::theta_thresh_undock = (CV_PI/180) * 3;
 
 
-double VisCont::docking_counter = 1;
+double PID4Docking::docking_counter = 1;
 
-VisCont::VisCont()
+PID4Docking::PID4Docking()
 {	
 	keepMoving = true;    
     
 	/* initialize random seed: */
-  	//srand (time(NULL));
-
-
-	R[R_indx_i][R_indx_j] = 50; // reward
-        R[P_indx_i][P_indx_j] = -60; // punishment
+  	srand (time(NULL));
 
 	x_rand_SM = RefPose[2] + .55; // 55 cm spreading domain in the x-axis while moving towards the random pose
 
@@ -183,25 +156,25 @@ VisCont::VisCont()
     	MarPose_pub = node_vis.advertise<geometry_msgs::PoseStamped>("/marker_pose", 100);
     	commandPub = node_cont.advertise<geometry_msgs::Twist>("/base_controller/command",1);
     
-    	MarPose_Sub = node_vis.subscribe("/marker_pose",1,&VisCont::camCB,this);
+    	MarPose_Sub = node_vis.subscribe("/marker_pose",1,&PID4Docking::camCB,this);
 }
 
-  VisCont::~VisCont()
+  PID4Docking::~PID4Docking()
   {
 	
   }
-  Mat VisCont::getCurrentImage() 
+  Mat PID4Docking::getCurrentImage() 
   {
         return img;
   }
 
-void VisCont::cvTackBarEvents(int value,void* ptr)
+void PID4Docking::cvTackBarEvents(int value,void* ptr)
 {
-    VisCont* ic = (VisCont*)(ptr);
+    PID4Docking* ic = (PID4Docking*)(ptr);
     ic-> myhandler(value);
 }
 
-void VisCont::myhandler(int value)
+void PID4Docking::myhandler(int value)
 {
         if (Thresh1_min<3) Thresh1_min=3;
     
@@ -227,14 +200,14 @@ void VisCont::myhandler(int value)
     //imshow("INPUT IMAGE",TheInputImageCopy);
     //imshow("THRESHOLD IMAGE",MDetector.getThresholdedImage());
 }
-void VisCont::createTrackbars()
+void PID4Docking::createTrackbars()
 {    
 	namedWindow(trackbarWindowName, 0);
 	createTrackbar("ThresParam 1", trackbarWindowName, &Thresh1_min, Thresh1_max, cvTackBarEvents, this);
 	createTrackbar("ThresParam 2", trackbarWindowName, &Thresh2_min, Thresh2_max, cvTackBarEvents, this);
 	
 }
-void VisCont::imageCb(const sensor_msgs::ImageConstPtr& msg)
+void PID4Docking::imageCb(const sensor_msgs::ImageConstPtr& msg)
 {
     cv_bridge::CvImagePtr cv_ptr;
     try
@@ -249,7 +222,7 @@ void VisCont::imageCb(const sensor_msgs::ImageConstPtr& msg)
     img = cv_ptr->image;
     
 }
-bool VisCont::readArguments ( int argc,char **argv )
+bool PID4Docking::readArguments ( int argc,char **argv )
 {
     if (argc<2) {
         cerr<< "Invalid number of arguments!\n" <<endl;
@@ -266,7 +239,7 @@ bool VisCont::readArguments ( int argc,char **argv )
     return true;
 }
 
-void VisCont::ProgStart(int argc,char** argv)
+void PID4Docking::ProgStart(int argc,char** argv)
 {
 	// Show images, press "SPACE" to diable image
         // rendering to save CPU time
@@ -357,10 +330,10 @@ if (TheVideoCapturer.retrieve(TheInputImage))
 			x_t = TheMarkers[0].Tvec.at<Vec3f>(0,0)[1];
 			z_t = TheMarkers[0].Tvec.at<Vec3f>(0,0)[2];
 		
-			cv::Mat R(3,3,cv::DataType<float>::type);
+			Mat R(3,3,cv::DataType<float>::type);
 
 			// You need to apply cv::Rodrigues() in order to obatain angles wrt to camera coords
-			cv::Rodrigues(TheMarkers[0].Rvec,R);
+			Rodrigues(TheMarkers[0].Rvec,R);
 
                                 // ----------- Euler angle -----------------//
                                 float roll1 = -asin(R.at<float>(2,0));
@@ -459,15 +432,13 @@ if (key == ' ')
 }
 
 		ros::spinOnce();
-		//rate.sleep();
-TT_E = ros::Time::now().toSec();
-ROS_INFO_STREAM("start = "<< TT_S << " , end = " << TT_E << " , duration = " << (TT_E - TT_S) <<" \n");
-
-	}
 		
+		TT_E = ros::Time::now().toSec();
+		ROS_INFO_STREAM(" visualization while loop duration = " << (TT_E - TT_S) <<" \n");
 
+	}
 }
-void VisCont::camCB(const geometry_msgs::PoseStamped::ConstPtr& CamFB) // subscriber
+void PID4Docking::camCB(const geometry_msgs::PoseStamped::ConstPtr& CamFB) // subscriber
 {
 camPose[0] = CamFB->pose.position.x; // not important!!!
 camPose[1] = CamFB->pose.position.y; // y pose
@@ -539,9 +510,6 @@ camPose[3] = CamFB->pose.orientation.x; //  theta orientation
 		}else
         	{
                 	Controller(RefPose[2], camPose[2], RefPose[1], camPose[1], RefPose[3], camPose[3],.1);
-			//Q_Learning(camPose[1],camPose[3]); // performing Q_Learning...
-			//print_R();
-
 		}
 	} else
 	{
@@ -550,7 +518,7 @@ camPose[3] = CamFB->pose.orientation.x; //  theta orientation
 	}
 }
 
-void VisCont::Controller(double RefX, double MarPoseX, double RefY, double MarPoseY, double RefYAW, double MarPoseYAW, double dt)
+void PID4Docking::Controller(double RefX, double MarPoseX, double RefY, double MarPoseY, double RefYAW, double MarPoseYAW, double dt)
 {
 	ROS_INFO_STREAM("--------------------- Controller started ----------------------\n "); 
         
@@ -659,11 +627,10 @@ void VisCont::Controller(double RefX, double MarPoseX, double RefY, double MarPo
 	//ROS_INFO_STREAM("Control signalYAW = "<< control_signalYAW <<". \n");
 	ROS_INFO_STREAM(" ---------------------- Controller ended ----------------------- \n");	
 	
-	//dock(-control_signalX, control_signalY, control_signalYAW);
 	dock(control_signalX, control_signalY, control_signalYAW);
 }
 
-void VisCont::dock(double VelX, double VelY, double omegaZ)
+void PID4Docking::dock(double VelX, double VelY, double omegaZ)
 {
         ROS_INFO(".... REAL .... !");
         geometry_msgs::Twist msg;
@@ -677,7 +644,7 @@ void VisCont::dock(double VelX, double VelY, double omegaZ)
 	ROS_INFO_STREAM(" Current speed of robot: \n" << msg << ".\n");
 }
 
-void VisCont::move2docking(double VelX_est, double VelY_est, double omegaZ_est)
+void PID4Docking::move2docking(double VelX_est, double VelY_est, double omegaZ_est)
 {
 	
         ROS_INFO_STREAM(" Zmar = " << camPose[2] << " m. \n");
@@ -709,7 +676,7 @@ void VisCont::move2docking(double VelX_est, double VelY_est, double omegaZ_est)
 }
 // ---- Controller part -------- END ------
 
-void VisCont::GenerateRandomVal()
+void PID4Docking::GenerateRandomVal()
 {
 
 	// ---------------- PID gains ------------------
@@ -724,7 +691,7 @@ void VisCont::GenerateRandomVal()
 	theta_new = ((double) rand() / (RAND_MAX)) * (theta_up - theta_dwn) + theta_dwn; // will be used for Q_Learning
 }
 
-void VisCont::RandomPose(double X_rand, double Y_rand, double theta_rand)
+void PID4Docking::RandomPose(double X_rand, double Y_rand, double theta_rand)
 {
 	ROS_INFO_STREAM(" Xr = " << X_rand << ", Yr = " << Y_rand << ", Thetar = " << theta_rand << " rad ~ " << theta_rand * (180/CV_PI) << " deg\n");
 	ROS_INFO_STREAM(" -------------------------------------------------------------- \n");
@@ -827,153 +794,3 @@ geometry_msgs::Twist msg_new;
 commandPub.publish(msg_new);
 	
 }
-
-void VisCont::Q_Learning(double y, double theta)
-{
-
-/*	while ( iterations <= it_ ) 
-        {       
-                if (user_action == 1 && y_new != 0) // North
-                {
-                        reward = R[y_new][theta_new];
-                        Q_next_state = Q[y_new - 1][theta_new];
-                        
-                        sample = reward + gamma * Q_next_state;
-                        Q[y_new][theta_new] = ((1 - alpha) * Q[y_new][theta_new]) + (alpha * sample);
-                        Q_curr_state = Q_next_state;
-                        i--;
-                        counter++;
-                } else if (user_action == 1 && y_new == 0) // North
-                {
-                        cout << "You can't go further up!\n";
-                } else if (user_action == 3 && i < (row - 1)) // South, i < row
-                {
-                        reward = R[y_new][theta_new];
-                        Q_next_state = Q[y_new + 1][theta_new];
-
-
-
-                        
-                        sample = reward + gamma * Q_next_state;
-                        Q[y_new][theta_new] = ((1 - alpha) * Q[y_new][theta_new]) + (alpha * sample);
-                        Q_curr_state = Q_next_state;
-                        i++;
-                        counter++;
-                } else if (user_action == 3 && y_new >= (row - 1)) // South
-                {
-                        cout << "You can't go further down!\n";
-                } else if (user_action == 2 && theta_new < (col - 1)) // East
-                {
-                        reward = R[y_new][theta_new];
-                        Q_next_state = Q[i][j + 1];
-                        
-                        sample = reward + gamma * Q_next_state;
-                        Q[y_new][theta_new] = ((1 - alpha) * Q[y_new][theta_new]) + (alpha * sample);
-                        Q_curr_state = Q_next_state;
-                        j++;
-                        counter++;
-                } else if (user_action == 2 && j >= (col - 1)) // East, j > col
-                {
-                        cout << "You can't go further right!\n";
-                } else if (user_action == 4 && j != 0 ) // West
-                {
-                        reward = R[y_new][theta_new];
-                        Q_next_state = Q[y_new][theta_new - 1];
-                        
-                        sample = reward + gamma * Q_next_state;
-                        Q[y_new][theta_new] = ((1 - alpha) * Q[y_new][theta_new]) + (alpha * sample);
-                        Q_curr_state = Q_next_state;
-                        j--;
-                        counter++;
-                } else if (user_action == 4 && theta_new == 0) // West, j = 1
-                {
-                        cout << "You can't go further left!\n";
-                } else
-                {
-                        cout << "\nGenerating random pose in grid for 1st. time!\n";
-                        generate_rand();
-                }
-                
-                // + Reward
-                if (y_new == R_indx_i && theta_new == R_indx_j)
-                {
-                        Time_Reward = -counter;
-                        cout << " Time Reward = "<< Time_Reward << "\n";
-                        
-                        if(abs(Time_Reward) <= R_step)
-                        {
-                                
-                                cout << "\n Goal is achieved <= " << R_step << " time steps\n";
-                                reward = R[y_new][theta_new];
-                                Q_next_state = 0;
-                        
-                                sample = reward + gamma * Q_next_state;
-                                Q[y_new][theta_new] = ((1 - alpha) * Q[y_new][theta_new]) + (alpha * sample);
-                        } else
-                        {
-                                cout << "\n Goal is achieved > " << R_step << " time steps => time_punishment\n";
-                                reward = -1; // ???
-                                Q_next_state = 0;
-                        
-                                sample = reward + gamma * Q_next_state;
-                                Q[y_new][theta_new] = ((1 - alpha) * Q[y_new][theta_new]) + (alpha * sample);
-                        }
-                        
-                        counter = 0;  
-                } else if (y_new == P_indx_i && theta_new == P_indx_j) // (-) Reward => Punishment
-                {
-                           cout << "\n Failed to achieve a goal! \n";
-                                
-                                reward = R[y_new][theta_new];
-                                Q_next_state = 0;
-                        
-                                sample = reward + gamma * Q_next_state;
-                                Q[y_new][theta_new] = ((1 - alpha) * Q[y_new][theta_new]) + (alpha * sample);  
-                }
-                
-                cout << "\n Q_value = " << Q_curr_state << " , actions N(1), E(2), S(3), W(4) : ";
-                user_action = ((double) rand() / (RAND_MAX)) * (5 - 1) + 1; // Generating random user_action  
-                printf(" ramdom user action = %i \n",user_action);
-                //cin >> user_action;
-          }*/
-}
-
-
-void VisCont::print_R()
-{
-         cout << " R = \n";
-        for(int i = 0; i <= (row - 1); i++)
-        {
-                for(int j = 0; j <= (col - 1); j++)
-                {
-                        cout << setw(col - 1) << R[i][j];
-			if(j < col - 1)
-			{
-				cout << " , ";
-			}
-		} // j
-                cout << "\n";
-        } // i
-        cout << "\n";
-}
-
-
-void VisCont::print_Q()
-{
-         cout << " Q = \n";
-        for(int i = 0; i <= (row - 1); i++)
-        {
-                for(int j = 0; j <= (col - 1); j++)
-                {
-                        cout << setw(col - 1) << Q[i][j];
-			if(j < col - 1)
-			{
-				cout << " , ";
-			}
-		} // j
-                cout << "\n";
-        } // i
-        cout << "\n";
-}
-
-
diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~
index 9d8c3410..34650155 100644
--- a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~
+++ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~
@@ -98,12 +98,12 @@ const double VisCont::RefPose[4] = {-.0957, -0.0271482 /* Y_ref*/ ,  0.266214 /*
 
 
 // ----------------  PID gains---------------- //
-double VisCont::Kp_y = .5; //.6
-double VisCont::Ki_y = .05;
-double VisCont::Kd_y = .3;
+double VisCont::Kp_y = .7; //.7
+double VisCont::Ki_y = .005;//.005
+double VisCont::Kd_y = .2;
 
 double VisCont::Kp_theta = .1 * Kp_y; // .08 * Kp_y
-double VisCont::Ki_theta = .002 * Ki_y;
+double VisCont::Ki_theta = .07 * Ki_y;
 double VisCont::Kd_theta = .00005 * Kd_y;
 // ----------------  PID gains---------------- //
 
@@ -153,10 +153,10 @@ double VisCont::speed_reducer_theta = 1;
 
 // ------ offsets X, Y, theta for Docking ---------
 double VisCont::Pz_eps = .001;
-double VisCont::Py_eps = .004;
+double VisCont::Py_eps = .005;
 double VisCont::A_eps = (CV_PI/180) * 6; // 1 deg.
 
-double VisCont::safety_margin_X = .18; // safety margin X axis in docking process : 12 cm
+double VisCont::safety_margin_X = .2; // safety margin X axis in docking process : 12 cm
 
 // ------ offsets X, Y, theta for Undocking ---------
 double VisCont::x_thresh_undock = .02;
@@ -533,7 +533,7 @@ camPose[3] = CamFB->pose.orientation.x; //  theta orientation
 				)
 			{
 				ROS_INFO("y & theta fixed successfully, MOVING STRAIGHT AHEAD ... \n");
-				speed_reducer_X = .1;
+				speed_reducer_X = .08;
 				Controller(RefPose[2], camPose[2], RefPose[1], RefPose[1], RefPose[3], RefPose[3],.1);
 			}
 		}else
@@ -571,10 +571,10 @@ void VisCont::Controller(double RefX, double MarPoseX, double RefY, double MarPo
         	// control signal
         	control_signalX = p_termX + i_termX + d_termX;
         	prev_errorX = curr_errorX;*/
-		control_signalX = speed_reducer_X * 0.08;        
+		control_signalX = speed_reducer_X * 0.1;        
         } else
 	{
-		control_signalX = 1e-4;	
+		control_signalX = 5e-5;	
 	}
         // -----------------Y--------------------- // 
 	 
@@ -613,7 +613,8 @@ void VisCont::Controller(double RefX, double MarPoseX, double RefY, double MarPo
 	{
 		control_signalY = 0;	
 	}
-        // -------------------YAW--------------------------//
+        
+	// -------------------YAW--------------------------//
        if(abs(abs(RefYAW) - abs(MarPoseYAW)) > A_eps)
 	{	
 		// e(t) = setpoint - actual value;
diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp b/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp
index 6c52b0ba..fbdef348 100644
--- a/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp
+++ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp
@@ -5,12 +5,8 @@ int main(int argc, char** argv)
 {
       ros::init(argc, argv, "aruco_tf_publisher");
         
-        VisCont imgConv;
-        imgConv.ProgStart(argc,argv);
-	
-	
+        PID4Docking controller;
+        controller.ProgStart(argc,argv);
 
         return 0;
-
-
 }
diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp~ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp~
index 6c52b0ba..98e8f518 100644
--- a/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp~
+++ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/run_vis_cont.cpp~
@@ -5,12 +5,12 @@ int main(int argc, char** argv)
 {
       ros::init(argc, argv, "aruco_tf_publisher");
         
-        VisCont imgConv;
-        imgConv.ProgStart(argc,argv);
+        PID4Docking controller;
+        controller.ProgStart(argc,argv);
 	
+/*PID4Docking cont;
+cont.ContStart();*/
 	
 
         return 0;
-
-
 }
diff --git a/MobileRobot/Machine_Learning/Practice/Q_Learning b/MobileRobot/Machine_Learning/Practice/Q_Learning
index 0d0d3255a39c1b2f6342705481ca0d3e9dd01f59..63742263fbc07be2b1b8928dd5f6787fced58998 100755
GIT binary patch
delta 290
zcmaD=@Va0_3zNvixP(<J*lPts6Xt#0{bWmn;D&_C%`=!Ds4<@2T&Y>jAu7lq#bBV8
zzyJaqAcBE`;lkvPhT@D*CMz0=OMYNxU;wFMP==`KV1y|8G&#^noRMp?ps_fk?Bqrx
zaY=a=1_l9!kN-2Era{y(FsMx4Xe2JF&jK<>l3|Jh#2gl=w8i9yM&gn-EDQ`n47?1#
zMI6B5XTc-`g9pfb$tbAFOQ3q8k_?F;S;lo>^1$RmV{yi#n>&qfF)IYd=cQJZ#21$&
fmZUPoM;V%AI{LX}#RnASr<5kA7L`qIGJgR8393aS

delta 289
zcmaD|@Ty=#3zJCFmnV$dOw&c8gBT~L9#Odc^$U0I<{3;6)EG}~uGFmN5EWwJWtb}F
zzyJbVj3APM;o9VnhT@EmCo39>OTK4jU=U=GVqj2C084g2)qI>BXe7?aIa$zHoKa?S
zqmj6z918=30K>=s8EO!fVC4)949b%?8i`Blv4G5xWSF7=k!68On@@gdBra*q!oUD>
z$!`&eOU^=N-9hF{MnX+q0@VwZWJmzXGOh)a`zIF~i!&bC+-ZD^Sw23>&^SFcFSRJK
dBsIP$F)yWzAuv8KwW1`xxFoS8b#k-$3jk#&M8*IB

diff --git a/MobileRobot/Machine_Learning/Practice/Q_learning.cpp b/MobileRobot/Machine_Learning/Practice/Q_learning.cpp
index 1e1d2a7d..850990ed 100644
--- a/MobileRobot/Machine_Learning/Practice/Q_learning.cpp
+++ b/MobileRobot/Machine_Learning/Practice/Q_learning.cpp
@@ -39,7 +39,7 @@ double sample;
 
 void print_R();
 void print_Q();
-void generate_rand();
+void iANDj_Generator();
 
 int main()
 {
@@ -115,7 +115,7 @@ int main()
                 } else
                 {
                         cout << "\nGenerating random pose in grid for 1st. time!\n";
-                        generate_rand();
+                        iANDj_Generator();
                 }
                 
                 // + Reward
@@ -145,7 +145,7 @@ int main()
                         
                         counter = 0;
                         print_Q();
-                        generate_rand();
+                        iANDj_Generator();
                         iterations++;    
                 } else if (i == P_indx_i && j == P_indx_j) // - Reward => Punishment
                 {
@@ -158,7 +158,7 @@ int main()
                                 Q[i][j] = ((1 - alpha) * Q[i][j]) + (alpha * sample);
                                 
                                 print_Q();
-                                generate_rand();
+                                iANDj_Generator();
                                 iterations++;
                                 //Goal = true;     
                 }
@@ -206,7 +206,7 @@ void print_Q()
         cout << "\n";
 }
 
-void generate_rand()
+void iANDj_Generator()
 {
         // Generate Random Pose for current state (position)
         
diff --git a/MobileRobot/Machine_Learning/Practice/Q_learning.cpp~ b/MobileRobot/Machine_Learning/Practice/Q_learning.cpp~
index 4ed5d34d..d67d1189 100644
--- a/MobileRobot/Machine_Learning/Practice/Q_learning.cpp~
+++ b/MobileRobot/Machine_Learning/Practice/Q_learning.cpp~
@@ -27,8 +27,8 @@ double Q_curr_state = Q[i][j];
 
 double reward;
 
-int R_indx_i = row - row;
-int R_indx_j = .5 * col;
+int R_indx_i = 5/*row - row*/;
+int R_indx_j = 3/*.5 * col*/;
 
 int P_indx_i = row - 2;
 int P_indx_j = col - 1;
@@ -39,7 +39,7 @@ double sample;
 
 void print_R();
 void print_Q();
-void generate_rand();
+void iANDj_Producer();
 
 int main()
 {
@@ -115,7 +115,7 @@ int main()
                 } else
                 {
                         cout << "\nGenerating random pose in grid for 1st. time!\n";
-                        generate_rand();
+                        iANDj_Producer();
                 }
                 
                 // + Reward
@@ -145,7 +145,7 @@ int main()
                         
                         counter = 0;
                         print_Q();
-                        generate_rand();
+                        iANDj_Producer();
                         iterations++;    
                 } else if (i == P_indx_i && j == P_indx_j) // - Reward => Punishment
                 {
@@ -158,7 +158,7 @@ int main()
                                 Q[i][j] = ((1 - alpha) * Q[i][j]) + (alpha * sample);
                                 
                                 print_Q();
-                                generate_rand();
+                                iANDj_Producer();
                                 iterations++;
                                 //Goal = true;     
                 }
@@ -206,7 +206,7 @@ void print_Q()
         cout << "\n";
 }
 
-void generate_rand()
+void iANDj_Producer()
 {
         // Generate Random Pose for current state (position)
         
diff --git a/MobileRobot/Machine_Learning/Practice/iANDj b/MobileRobot/Machine_Learning/Practice/iANDj
new file mode 100755
index 0000000000000000000000000000000000000000..8d9a6c4c77a9d0c73d53f74f81a235afbeaf7bcd
GIT binary patch
literal 9425
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%0A^o6nI8gY(><9ItLHZ@2`qAw}=ig^w
z0FQCQ^uy{=*my8(+!vah;PD4@7pVP?Y(H$A=m9^-6`1i2vmZvkMe{$b9rFUJKLBD3
zoP_Cv(cjSYTR_KiET9gAm7g#JVESPEKhQJ@^FL@L03??I)t>-Mm>@wcW2B6XpuQ6W
z1G+sh{aR3cFbWh_AU2E!O*_Es28qM)B&hvdFojSFG%k1y8qJAdl?l*>=?_rl#=yWJ
z$H2e<8X<)FA671b+IQIOk5B{~!%&GPiEckc6?T%Dfsp}LA0w*(jZDJoSyXXm23Y-x
zD$WA07g5Do;q@J=I2*hkLltLdfYnc^;v5XHdIwdUlL1zrpo(+B+s~-t-0*$^syGh=
ztXxMG=VgGE*Qnxr@csp=I6nidd_@%(fX}0#iVHHp%0pCfA$U25DlW_bE5A_1MHpb^
z5~{c;1FXD36&HigBcY0m!^e?P#U&VE`5skVk^z>VQN<DS1*qbn)*!M7ByTb?@G|^?
z)~hgCP`+bf`1l{jhtZ(+A|nH4IDqmoBLikQSb)nP%y4i8kH+&dD6qp?Fc2G}!Rn<L
zHV8q+(_#533o5<?Dh|u16;N{~pqYcq{h;;?$o&k^c|3@%3=9*&<_j{+;6ZiIe6TpC
z`$6+Qpm2Kt?N7tZIS6iVVTK!MjDwLuiUBmf22u<2*JG&r?{Pxxg^&yk!r*d~pCJZX
zU&HEkX{dMtnz%9}Xf}eE0oK2V^@B~o>M_#~Xw)7wGlrg?qrnctO#gXcb1>6wIU{IZ
z3^N@zF=C&$n!yON6%+!fcs&mB<6v=Kh6~VehLz>lVd7}%_8!<hsAhwBZ*hn-GC|x4
z8psBzgQY8WCXhQZ%Nbs<I7lTbHo_quh(kOZY_BAP2edwh*;@)#4;qn0wqX`j99ay+
zz7IABQSQOg$vY;{Toz`${06I+WJo}>7c?OcnrA!!&0jEcn3y5q1DX&3*#{ekl!S_d
zrUyXcF!xJ?#F-=+K!eF3aTwMBi;FOTCQo2uAlj4}6wbU1py?S9AJpCl(XPxO_kaAK
z0d*%x41@zg<}gSx96@tuFjV~ms5nS12uDE0(anhmn<L2(0W}}y{#2-V0GfCn)SaOD
zBape^u~X0-G*}!<y_TGqlM|1aV`WG#Dk&~0O-s{DW{8h>4)G6)_wfu40ZqNeyP)vA
zoROqb^5fHU@{<yC;=w}*@rk7s49WSq1v#lDsVRD9rpAU0Ac^?QlnM~fm;o{(ky4tQ
zTM4tr)z1ZNja!hTuWLMv2eJmnM%V%#uK?SU>FDQ@6<<)Al#^MUk*b$mPyn9L^|6SL
z&&&r8io{2m7{-I<T}v{P<3S>si8+~7i6xo&dGU#PDe)<(#U(|h$zZ-gCTKp`$G9lJ
zoFP8S$2d7ZhaukG$KT1(CqBNoG%4OQJ`*nB@8%Zl8WJDk=;Y%X&kzqb8#160pPH9~
zDgd6qW{7u*^mFv}bY=jJqJW%K1e%D3OjA2JfaimubHJcUZSeForf?>BDjQ84GP#^w
zTpAA^{DGN`6tkeP#WH&io*ZC+>cX5!2hC_>wF>N^c+fmHR2n*w9UqUF^G1~c+Z3Nt
z4w;Zgn>h!~*h7`WLm;?>jA?l^Lp=TCi%U{6^Wsa3Q$bOJ6!4Ytr3DP2=ngIcF9|@^
z2}+hJ#rg3WiFqkGsSNRu)DKIE;Hi92XoJ!dLwtNvaWOQ=vlt+ep9->xp%Uz0h|fz4
M7(l_r08S?i0I2DNi~s-t

literal 0
HcmV?d00001

diff --git a/MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp b/MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp
new file mode 100644
index 00000000..eef33e1a
--- /dev/null
+++ b/MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp
@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <iostream>
+#include <iomanip>
+#include <ctime>
+#include <cstdlib>
+
+using namespace std;
+
+
+int i,j;
+double y,theta;
+
+ const int row = 9;
+ const int col = 9;
+
+
+
+double theta_dwn = -.6;
+double theta_up = .6;
+double y_dwn = -.3;
+double y_up = .3;
+
+
+int main()
+{
+        int sample_rate_y = col -1;
+        int sample_rate_theta = row -1;	
+        
+	double div_theta = (theta_up - theta_dwn)/sample_rate_theta; 	
+	double div_y = (y_up - y_dwn)/sample_rate_y;
+
+cout << "\n y = ? \n" ;
+        cin >> y;
+
+
+
+cout << "\n theta = ? \n" ;
+        cin >> theta;
+
+
+
+        for(int k = 0; k <= (row - 1); k++)
+        {
+                if(theta >= (theta_dwn - ((.5 + k) * div_theta)) && theta < (theta_dwn + ((.5 + k) * div_theta)))
+                {
+                        i = k;
+                        break;
+                } 
+        }
+
+        for(int l = 0; l <= (col - 1); l++)
+        {
+                if(y >= (y_dwn - ((.5 + l) * div_y)) && y < (y_dwn + ((.5 + l) * div_y)))
+                {
+                        j = l;
+                        break;
+                }
+        }
+
+cout << "\n i = " << i << " and j = " << j <<"\n";
+
+
+return 0;
+
+
+
+}
diff --git a/MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp~ b/MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp~
new file mode 100644
index 00000000..7035b08d
--- /dev/null
+++ b/MobileRobot/Machine_Learning/Practice/iANDj_publishe.cpp~
@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <iostream>
+#include <iomanip>
+#include <ctime>
+#include <cstdlib>
+
+using namespace std;
+
+
+int i,j;
+double y,theta;
+
+ const int row = 7;
+ const int col = 7;
+
+
+
+double theta_dwn = -.6;
+double theta_up = .6;
+double y_dwn = -.3;
+double y_up = .3;
+
+
+int main()
+{
+        int sample_rate_y = col -1;
+        int sample_rate_theta = row -1;	
+        
+	double div_theta = (theta_up - theta_dwn)/sample_rate_theta; 	
+	double div_y = (y_up - y_dwn)/sample_rate_y;
+
+cout << "\n y = ? \n" ;
+        cin >> y;
+
+
+
+cout << "\n theta = ? \n" ;
+        cin >> theta;
+
+
+
+        for(int k = 0; k <= (row - 1); k++)
+        {
+                if(theta >= (theta_dwn - ((.5 + k) * div_theta)) && theta < (theta_dwn + ((.5 + k) * div_theta)))
+                {
+                        i = k;
+                        break;
+                } 
+        }
+
+        for(int l = 0; l <= (col - 1); l++)
+        {
+                if(y >= (y_dwn - ((.5 + l) * div_y)) && y < (y_dwn + ((.5 + l) * div_y)))
+                {
+                        j = l;
+                        break;
+                }
+        }
+
+cout << "\n i = " << i << " and j = " << j <<"\n";
+
+
+return 0;
+
+
+
+}
-- 
GitLab