From a23d3d8db1b977e0962674a64996d3b49ddfda9b Mon Sep 17 00:00:00 2001 From: Farid Alijani <farid.alijani@student.lut.fi> Date: Wed, 2 Mar 2016 22:58:34 +0100 Subject: [PATCH] y direction movement is still wrong --- .../CamMark/camtomar/include/VisionControl.h | 4 +- .../CamMark/camtomar/include/VisionControl.h~ | 3 + .../CamMark/camtomar/src/VisionControl.cpp | 87 ++++++++++--------- 3 files changed, 50 insertions(+), 44 deletions(-) diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h index 545a6ce6..42d85258 100644 --- a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h +++ b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h @@ -122,8 +122,8 @@ public: static double Pos_Px,Pos_Ix,Pos_Dx; static double Pos_Py,Pos_Iy,Pos_Dy; - //static double S_yPos_P,S_yPos_I,S_yPos_D; - //static double L_yPos_P,L_yPos_I,L_yPos_D; + static double S_yPos_P,S_yPos_I,S_yPos_D; + static double L_yPos_P,L_yPos_I,L_yPos_D; static double S_Ang_P,S_Ang_I,S_Ang_D; static double L_Ang_P,L_Ang_I,L_Ang_D; diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~ b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~ index e1e6b02f..545a6ce6 100644 --- a/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~ +++ b/MobileRobot/AugReaMarker/CamMark/camtomar/include/VisionControl.h~ @@ -122,6 +122,9 @@ public: static double Pos_Px,Pos_Ix,Pos_Dx; static double Pos_Py,Pos_Iy,Pos_Dy; + //static double S_yPos_P,S_yPos_I,S_yPos_D; + //static double L_yPos_P,L_yPos_I,L_yPos_D; + static double S_Ang_P,S_Ang_I,S_Ang_D; static double L_Ang_P,L_Ang_I,L_Ang_D; diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp index 30278f8a..20e7ad16 100644 --- a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp +++ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp @@ -42,29 +42,25 @@ using namespace cv; using namespace aruco; using namespace std; - double ImageConverter::Pos_Px = .00005; -double ImageConverter::Pos_Ix = 0.002; +double ImageConverter::Pos_Ix = 0.0015; double ImageConverter::Pos_Dx = 0; +double ImageConverter::Pos_Py = 2.3 * ImageConverter::Pos_Px; +double ImageConverter::Pos_Iy = 2.3 * ImageConverter::Pos_Ix; +double ImageConverter::Pos_Dy = 2.3 * ImageConverter::Pos_Dx; -double ImageConverter::Pos_Py = .39 * ImageConverter::Pos_Px; -double ImageConverter::Pos_Iy = .39 * ImageConverter::Pos_Ix; -double ImageConverter::Pos_Dy = .39 * ImageConverter::Pos_Dx; - -/* -double ImageConverter::S_yPos_P = .16 * ImageConverter::Pos_Px; -double ImageConverter::S_yPos_I = .16 * ImageConverter::Pos_Ix; -double ImageConverter::S_yPos_D = .16 * ImageConverter::Pos_Dx; +double ImageConverter::S_yPos_P = 2.3 * ImageConverter::Pos_Px; +double ImageConverter::S_yPos_I = 2.3 * ImageConverter::Pos_Ix; +double ImageConverter::S_yPos_D = 2.3 * ImageConverter::Pos_Dx; -double ImageConverter::L_yPos_P = .3 * ImageConverter::Pos_Px; -double ImageConverter::L_yPos_I = .3 * ImageConverter::Pos_Ix; -double ImageConverter::L_yPos_D = .3 * ImageConverter::Pos_Dx; -*/ +double ImageConverter::L_yPos_P = 15 * ImageConverter::Pos_Px; +double ImageConverter::L_yPos_I = 15 * ImageConverter::Pos_Ix; +double ImageConverter::L_yPos_D = 15 * ImageConverter::Pos_Dx; -double ImageConverter::S_Ang_P = .065 * ImageConverter::Pos_Px; -double ImageConverter::S_Ang_I = .065 * ImageConverter::Pos_Ix; -double ImageConverter::S_Ang_D = .065 * ImageConverter::Pos_Dx; +double ImageConverter::S_Ang_P = .062 * ImageConverter::Pos_Px; +double ImageConverter::S_Ang_I = .062 * ImageConverter::Pos_Ix; +double ImageConverter::S_Ang_D = .062 * ImageConverter::Pos_Dx; double ImageConverter::L_Ang_P = .7 * ImageConverter::Pos_Px; double ImageConverter::L_Ang_I = .7 * ImageConverter::Pos_Ix; @@ -72,8 +68,8 @@ double ImageConverter::L_Ang_D = .7 * ImageConverter::Pos_Dx; float ImageConverter::TheMarkerSize = .1; // Default marker size -int ImageConverter::Thresh1_min = 20; -int ImageConverter::Thresh2_min = 20; +int ImageConverter::Thresh1_min = 10; +int ImageConverter::Thresh2_min = 10; int ImageConverter::Thresh1_max = 300; int ImageConverter::Thresh2_max = 300; @@ -120,8 +116,8 @@ double ImageConverter::control_signalYAW; double ImageConverter::zeroMax = .0000000000000000001; double ImageConverter::zeroMin = -.0000000000000000001; -double ImageConverter::Pz_eps = .005; -double ImageConverter::Py_eps = .007; +double ImageConverter::Pz_eps = .001; +double ImageConverter::Py_eps = .005; double ImageConverter::A_eps = (CV_PI/180) * 1; // 1 deg. @@ -140,6 +136,9 @@ double ImageConverter::A_eps = (CV_PI/180) * 1; // 1 deg. keepMoving = true; commandPub = nh_.advertise<geometry_msgs::Twist>("/base_controller/command",1); Sub = nh_.subscribe("/marker_pose",1,&ImageConverter::camCB,this); + + + } @@ -446,7 +445,7 @@ void ImageConverter::camCB(const geometry_msgs::PoseStamped::ConstPtr& CamFB) { RefPose[0] = -.0957; -RefPose[1] = -0.0203153; +RefPose[1] = -0.0193642; RefPose[2] = 0.307922; RefPose[3] = 0.705028; @@ -516,7 +515,7 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl diffX = ((curr_errorX - prev_errorX) / dt); // scalling - p_termX = Pos_Px * curr_errorX; + p_termX = Pos_Px * curr_errorX; i_termX = Pos_Ix * int_errorX; d_termX = Pos_Dx * diffX; @@ -532,8 +531,8 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl control_signalX = 0; } // -----------------Y--------------------- // - - if(abs(RefY - MarPoseY) > Py_eps) + + if((RefY - MarPoseY) <= -Py_eps || (RefY - MarPoseY) >= Py_eps) { // e(t) = setpoint - actual value; curr_errorY = RefY - MarPoseY; @@ -555,31 +554,35 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl i_termY = Pos_Iy * int_errorY; d_termY = Pos_Dy * diffY; - /*int y_offset = 5; - if (curr_errorY < y_offset && curr_errorY > -y_offset) // -5 < err < +5 + /*double x_offset = .25; + if (abs(curr_errorY) >= abs(curr_errorX)) // -5 < err < +5 { - ROS_INFO_STREAM(" INSIDE boundry of " << y_offset << " m. \n"); + ROS_INFO_STREAM("robot movement in Y-direction is dominant! \n"); + control_signalX = 0; // scalling - p_termYAW = S_yPos_P * curr_errorY; - i_termYAW = S_yPos_I * int_errorY; - d_termYAW = S_yPos_D * diffY; - } else if (curr_errorY > y_offset || curr_errorYAW < y_offset) // err > +5 or err < -5 + p_termY = L_yPos_P * curr_errorY; + i_termY = L_yPos_I * int_errorY; + d_termY = L_yPos_D * diffY; + } else { - ROS_INFO_STREAM(" OUTSIDE boundry of " << y_offset << " m. \n"); + ROS_INFO_STREAM("robot movement in X-direction is dominant! \n"); // scalling - p_termYAW = L_yPos_P * curr_errorY; - i_termYAW = L_yPos_I * int_errorY; - d_termYAW = L_yPos_D * diffY; + p_termY = S_yPos_P * curr_errorY; + i_termY = S_yPos_I * int_errorY; + d_termY = S_yPos_D * diffY; }*/ // control signal control_signalY = p_termY + i_termY + d_termY; - - + + // robot & marker coordinates conversion + control_signalY = - control_signalY; + // save the current error as the previous one // for the next iteration. - prev_errorY = curr_errorY; - } else + prev_errorY = curr_errorY; + + }else if ((RefY - MarPoseY) < Py_eps && (RefY - MarPoseY) > -Py_eps) { control_signalY = 0; } @@ -644,7 +647,7 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl //ROS_INFO_STREAM("RAW Control signalYAW = "<< control_signalYAW <<". \n"); ROS_INFO_STREAM(" ------------------------------------------------------------- \n"); - dock(-control_signalX, -control_signalY, control_signalYAW); + dock(-control_signalX, control_signalY, control_signalYAW); } @@ -692,4 +695,4 @@ void ImageConverter::move2docking(double VelX_est, double VelY_est, double omega ROS_INFO_STREAM(" Current ESTIMATED speed of robot: \n" << msg << ".\n"); } -// ---- Controller part ----------- END -------- +// ---- Controller part -------- END ------ -- GitLab