예제 #1
0
void estimator_update_state_infrared( void ) {
  float rad_of_ir = (ir_estim_mode == IR_ESTIM_MODE_ON ? 
		     estimator_rad_of_ir :
		     ir_rad_of_ir);

#ifdef IR_360
  if (ir_360) { /* 360° estimation */
    /* 250 us for the whole block */
    float tmp_ir_roll = ir_roll * IR_360_LATERAL_CORRECTION;
    float tmp_ir_pitch = ir_pitch * IR_360_LONGITUDINAL_CORRECTION;
    float tmp_ir_top = ir_top * IR_360_VERTICAL_CORRECTION;

    estimator_phi  = atan2(tmp_ir_roll, tmp_ir_top) - ir_roll_neutral;
    estimator_phi = correct_angle(estimator_phi, ir_estimated_phi_pi_4, ir_estimated_phi_minus_pi_4);

    estimator_theta  = atan2(tmp_ir_pitch, tmp_ir_top) - ir_pitch_neutral;
    estimator_theta = correct_angle(estimator_theta, ir_estimated_theta_pi_4, ir_estimated_theta_minus_pi_4);
    if (estimator_theta < -M_PI_2)
      estimator_theta += M_PI;
    else if (estimator_theta > M_PI_2)
      estimator_theta -= M_PI;
  } else
#endif /* IR_360 */
  {
    ir_top = Max(ir_top, 1);
    float c = rad_of_ir*(1-z_contrast_mode)+z_contrast_mode*((float)IR_RAD_OF_IR_CONTRAST/fabs(ir_top));
    estimator_phi  = c * ir_roll - ir_roll_neutral;
    estimator_theta = c * ir_pitch - ir_pitch_neutral;
    
    
    
    /* infrared compensation */
#if defined IR_CORRECTION_LEFT && defined IR_CORRECTION_RIGHT
    if (estimator_phi >= 0) 
      estimator_phi *= ir_correction_right;
    else
      estimator_phi *= ir_correction_left;
#endif
    
    
#if defined IR_CORRECTION_UP && defined IR_CORRECTION_DOWN
    if (estimator_theta >= 0)
      estimator_theta *= ir_correction_up;
    else
      estimator_theta *= ir_correction_down;
#endif
    
    Bound(estimator_phi, -M_PI_2, M_PI_2);
    Bound(estimator_theta, -M_PI_2, M_PI_2);
    
 } 
}
	void updateParameters(){
		r= sqrt(pow(pos_x-goal_x,2) + pow(pos_y-goal_y,2));
        if (r<r_no_gps){
            close_to_goal = 1;
            v_max = v_max_close;
        }
		alpha = atan2(goal_y-pos_y,goal_x-pos_x);
        printf("distance_goalx = %f  distance_goaly = %f \n",goal_x-pos_x,goal_y-pos_y);
		delta = yaw - alpha;
		theta = goal_yaw - alpha;
		correct_angle(delta);
		correct_angle(theta);
		K = -1/r*(k2*(delta-atan(-k1*theta))+(1+k1/(1+k1*k1*theta*theta))*sin(delta));
        if(fabs(K)>0.15){
            K=0.15*(K/fabs(K));
        }
		v = v_max/(1+beta*pow(abs(K),lambda));
		omega = v*K;

        if (fabs(omega) > 0.5){
            v=0.5*v/fabs(omega);
            omega=omega*0.5/fabs(omega);
        }

        if (r<r_threshold){
            v=0;
            omega = 0;
            hasGoal = 0;
            publishGoalReached();
        }
		printf("r=%f, \nalpha=%f \ndelta=%f \n theta=%f \n v=%f \n omega=%f \nK=%f\n\n",r,alpha,delta,theta,v,omega,K);


        printf("v =%f    omega= %f r = %f\n\n,yaw %f \n",v,omega,r,yaw);

	}		
    void processOdometryNoGps(const nav_msgs::Odometry::ConstPtr& msg){
        if(close_to_goal==0){
            prev_x = msg->pose.pose.position.x;
            prev_y = msg->pose.pose.position.y;
            qx=msg->pose.pose.orientation.x;
            qy=msg->pose.pose.orientation.y;
            qz=msg->pose.pose.orientation.z;
            qw=msg->pose.pose.orientation.w;
            prev_yaw = atan2(2*(qx*qy + qw*qz),qw*qw + qx*qx -qy*qy - qz*qz);
        }
        else{
            current_x = msg->pose.pose.position.x;
            current_y = msg->pose.pose.position.y;
            qx=msg->pose.pose.orientation.x;
            qy=msg->pose.pose.orientation.y;
            qz=msg->pose.pose.orientation.z;
            qw=msg->pose.pose.orientation.w;
            current_yaw = atan2(2*(qx*qy + qw*qz),qw*qw + qx*qx -qy*qy - qz*qz);

            d_xm = current_x - prev_x;
            d_ym = current_y - prev_y;
            d_yaw = current_yaw - prev_yaw;
            yaw   = yaw + d_yaw;
            correct_angle(yaw);
            d_x = sqrt(d_xm*d_xm +d_ym*d_ym)*cos(yaw);
            d_y = sqrt(d_xm*d_xm +d_ym*d_ym)*sin(yaw);
            prev_x = current_x;
            prev_y = current_y;
            prev_yaw = current_yaw;
            active_pose.pose.pose.position.x= pos_x = pos_x + d_x;
            active_pose.pose.pose.position.y= pos_y = pos_y + d_y;


            active_pose.pose.pose.orientation = tf::createQuaternionMsgFromYaw(yaw);
            active_pose_pub.publish(active_pose);
            if(hasGoal){
                updateParameters();
                publishSystemInput();
            }
            else{
                publishGoalReached();
            }

        }

	}