diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp index 42ce8d4097e43359ee289a14ea731ef3c3b53add..bda465fbd9e44cb96f88861590cb3edaa7dd6b31 100644 --- a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp +++ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp @@ -41,8 +41,8 @@ using namespace cv; using namespace aruco; using namespace std; -double ImageConverter::Pos_Px = .05; -double ImageConverter::Pos_Ix = 0.002; +double ImageConverter::Pos_Px = .08; +double ImageConverter::Pos_Ix = 0.0025; double ImageConverter::Pos_Dx = 0; double ImageConverter::Pos_Py = 5 * ImageConverter::Pos_Px; @@ -474,7 +474,7 @@ camPose[3] = CamFB->pose.orientation.x; ) { - ROS_INFO("--------/*******//----- Dock is completed ! -----/*********---- \n "); + ROS_INFO("----/*****//----- Dock is completed successfully ! -----/******---- \n "); keepMoving = false; // to make sure that y & theta are within the threshold... } else if (abs(RefPose[2] - camPose[2]) <= safety_margin_X) @@ -492,7 +492,7 @@ camPose[3] = CamFB->pose.orientation.x; (abs(RefPose[3] - abs(camPose[3])) <= A_eps) ) { - ROS_INFO("Y & THETA HAVE FIXED SUCCESSFULLY, MOVING STRAIGHT AHEAD ... \n"); + ROS_INFO("y & theta have been fixed successfully, MOVING STRAIGHT AHEAD ... \n"); Controller(RefPose[2], camPose[2], RefPose[1], RefPose[1], RefPose[3], RefPose[3],.01); } }else @@ -625,7 +625,7 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl p_termYAW = S_Ang_P * curr_errorYAW; i_termYAW = S_Ang_I * int_errorYAW; d_termYAW = S_Ang_D * diffYAW; - ROS_INFO_STREAM("prop_gainYAW = " << p_termYAW << ", integ_gainYAW = " << i_termYAW << " . \n"); + //ROS_INFO_STREAM("prop_gainYAW = " << p_termYAW << ", integ_gainYAW = " << i_termYAW << " . \n"); } else if (curr_errorYAW > ((CV_PI/180) * yaw_offset) || curr_errorYAW < ((CV_PI/180) * -yaw_offset)) // err > +5 or err < -5 { ROS_INFO_STREAM(" robot is OUTSIDE Reference boundry of " << yaw_offset << " deg. \n"); @@ -633,7 +633,7 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl p_termYAW = L_Ang_P * curr_errorYAW; i_termYAW = L_Ang_I * int_errorYAW; d_termYAW = L_Ang_D * diffYAW; - ROS_INFO_STREAM("prop_gainYAW = " << p_termYAW << ", integ_gainYAW = " << i_termYAW << " . \n"); + //ROS_INFO_STREAM("prop_gainYAW = " << p_termYAW << ", integ_gainYAW = " << i_termYAW << " . \n"); } // control signal control_signalYAW = p_termYAW + i_termYAW + d_termYAW; diff --git a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~ index 20e7ad16cf91ab2d43c8d1ab6ababeb1f297a86b..42ce8d4097e43359ee289a14ea731ef3c3b53add 100644 --- a/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~ +++ b/MobileRobot/AugReaMarker/CamMark/camtomar/src/VisionControl.cpp~ @@ -41,30 +41,21 @@ using namespace cv; using namespace aruco; using namespace std; - -double ImageConverter::Pos_Px = .00005; -double ImageConverter::Pos_Ix = 0.0015; +double ImageConverter::Pos_Px = .05; +double ImageConverter::Pos_Ix = 0.002; 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::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::Pos_Py = 5 * ImageConverter::Pos_Px; +double ImageConverter::Pos_Iy = 5 * ImageConverter::Pos_Ix; +double ImageConverter::Pos_Dy = 5 * 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 = .2 * ImageConverter::Pos_Px; +double ImageConverter::S_Ang_I = .2 * ImageConverter::Pos_Ix; +double ImageConverter::S_Ang_D = .2 * 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; -double ImageConverter::L_Ang_D = .7 * ImageConverter::Pos_Dx; +double ImageConverter::L_Ang_P = .8 * ImageConverter::Pos_Px; +double ImageConverter::L_Ang_I = .8 * ImageConverter::Pos_Ix; +double ImageConverter::L_Ang_D = .8 * ImageConverter::Pos_Dx; float ImageConverter::TheMarkerSize = .1; // Default marker size @@ -116,10 +107,13 @@ double ImageConverter::control_signalYAW; double ImageConverter::zeroMax = .0000000000000000001; double ImageConverter::zeroMin = -.0000000000000000001; + +// ------ offsets for X, Y, theta double ImageConverter::Pz_eps = .001; -double ImageConverter::Py_eps = .005; -double ImageConverter::A_eps = (CV_PI/180) * 1; // 1 deg. +double ImageConverter::Py_eps = .002; +double ImageConverter::A_eps = (CV_PI/180) * .6; // 1 deg. +double ImageConverter::safety_margin_X = .15; // 10 cm ImageConverter::ImageConverter() : it_(nh_) @@ -136,10 +130,6 @@ 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); - - - - } ImageConverter::~ImageConverter() @@ -443,7 +433,7 @@ void ImageConverter::ContStart() void ImageConverter::camCB(const geometry_msgs::PoseStamped::ConstPtr& CamFB) { - +// Ref. Values RefPose[0] = -.0957; RefPose[1] = -0.0193642; RefPose[2] = 0.307922; @@ -478,16 +468,34 @@ camPose[3] = CamFB->pose.orientation.x; ROS_INFO_STREAM(" ------------------------------------------------------------- \n"); if ( - (abs(RefPose[1] - camPose[1]) <= Py_eps) && // Y - (abs(RefPose[2] - camPose[2]) <= Pz_eps) && // Z - (abs(RefPose[3] - camPose[3]) <= A_eps) // Yaw + (abs(RefPose[2] - camPose[2]) <= Pz_eps) //&& // Z + //(abs(RefPose[1] - camPose[1]) <= Py_eps) && // Y + //(abs(RefPose[3] - camPose[3]) <= A_eps) // Yaw ) { ROS_INFO("--------/*******//----- Dock is completed ! -----/*********---- \n "); keepMoving = false; - - }else + // to make sure that y & theta are within the threshold... + } else if (abs(RefPose[2] - camPose[2]) <= safety_margin_X) + { + if( + (abs(RefPose[1] - camPose[1]) > Py_eps) || + (abs(RefPose[3] - abs(camPose[3])) > A_eps) + ) + { + ROS_INFO_STREAM(" X < " << safety_margin_X << " m. , Fixing Y and theta. \n "); + Controller(RefPose[2], RefPose[2], RefPose[1], camPose[1], RefPose[3], camPose[3],.01); + + } else if( + (abs(RefPose[1] - camPose[1]) <= Py_eps) && + (abs(RefPose[3] - abs(camPose[3])) <= A_eps) + ) + { + ROS_INFO("Y & THETA HAVE FIXED SUCCESSFULLY, MOVING STRAIGHT AHEAD ... \n"); + Controller(RefPose[2], camPose[2], RefPose[1], RefPose[1], RefPose[3], RefPose[3],.01); + } + }else { Controller(RefPose[2], camPose[2], RefPose[1], camPose[1], RefPose[3], camPose[3],.01); } @@ -571,7 +579,8 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl i_termY = S_yPos_I * int_errorY; d_termY = S_yPos_D * diffY; }*/ - + + ROS_INFO_STREAM("prop_gainY = " << p_termY << ", integ_gainY = " << i_termY << " . \n"); // control signal control_signalY = p_termY + i_termY + d_termY; @@ -606,6 +615,8 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl // differentiation diffYAW = ((curr_errorYAW - prev_errorYAW) / dt); + + // YAW offset... int yaw_offset = 15; if (curr_errorYAW < ((CV_PI/180) * yaw_offset) && curr_errorYAW > ((CV_PI/180) * -yaw_offset)) // -5 < err < +5 { @@ -614,6 +625,7 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl p_termYAW = S_Ang_P * curr_errorYAW; i_termYAW = S_Ang_I * int_errorYAW; d_termYAW = S_Ang_D * diffYAW; + ROS_INFO_STREAM("prop_gainYAW = " << p_termYAW << ", integ_gainYAW = " << i_termYAW << " . \n"); } else if (curr_errorYAW > ((CV_PI/180) * yaw_offset) || curr_errorYAW < ((CV_PI/180) * -yaw_offset)) // err > +5 or err < -5 { ROS_INFO_STREAM(" robot is OUTSIDE Reference boundry of " << yaw_offset << " deg. \n"); @@ -621,6 +633,7 @@ void ImageConverter::Controller(double RefX, double MarPoseX, double RefY, doubl p_termYAW = L_Ang_P * curr_errorYAW; i_termYAW = L_Ang_I * int_errorYAW; d_termYAW = L_Ang_D * diffYAW; + ROS_INFO_STREAM("prop_gainYAW = " << p_termYAW << ", integ_gainYAW = " << i_termYAW << " . \n"); } // control signal control_signalYAW = p_termYAW + i_termYAW + d_termYAW;