Beispiel #1
0
void Reaching::DecrementAngleWeights(float factor){
#ifdef DYN_WEIGHTS
  v4_scale(base_weight_angle,factor,base_weight_angle);
#else
  v4_scale(weight_angle,factor,weight_angle);
#endif
}
Beispiel #2
0
// works for homogeneous weights only. not clean
float Reaching::GetCosts(joint_vec_t& des_angle,cart_vec_t& des_pos){
  joint_vec_t& v1,v2;
  cart_vec_t& w1,w2;
  float s1,s2;
  v4_sub(des_angle,pos_angle,v1);
  //m4_diag_v_multiply(weight_angle,v1,v2);
  if (weight_angle[0] == 0){
    s1 = v4_dot(v1,v1);
    return s1;
  }
  else{
    v4_scale(v1,1/weight_angle[0],v2);
    s1 = v4_dot(v1,v2);
  }
  v_sub(des_cart,pos_cart,w1);
  
  if (weight_cart[0] == 0){
    s2 = v_dot(w1,w1);
    return s2;
  }
  else{
     v4_scale(w1,1/weight_cart[0],w2);
     s2 = v_dot(w1,w2);
  }

  //  m3_diag_v_multiply(weight_cart,w1,w2);
 
  return (s1+s2)/(1/weight_cart[0]+1/weight_angle[0]);
}
Beispiel #3
0
void Reaching::IncrementAngleWeights(float factor){
  float f = factor;
  if (f<0) return;
#ifdef DYN_WEIGHTS
  v4_scale(base_weight_angle,f,base_weight_angle);
#else
  v4_scale(weight_angle,f,weight_angle);
#endif
}
Beispiel #4
0
// returns hoap angles in rad
void Reaching::RetrieveJointAngles(pHoap2_JointAngles angles)
{
  joint_vec_t& v1,v2;
  //  Hoap2_JointAngles *angles;
  // angles =(Hoap2_JointAngles *)an;
  v4_copy(pos_angle,v1);
  Rob2Hoap(v1);
  v4_scale(v1,deg2rad,v2);
  angles->R_SFE = v2[0];
  angles->R_SAA = v2[1];
  angles->R_SHR = v2[2];
  angles->R_EB =  v2[3];
}
Beispiel #5
0
/** Catmull-rom spline interpolation */
scalar_t spline(scalar_t a, scalar_t b, scalar_t c, scalar_t d, scalar_t t)
{
	vec4_t tmp;
	scalar_t tsq = t * t;

	static mat4_t crspline_mat = {
		{-1,  3, -3,  1},
		{2, -5,  4, -1},
		{-1,  0,  1,  0},
		{0,  2,  0,  0}
	};

	tmp = v4_scale(v4_transform(v4_cons(a, b, c, d), crspline_mat), 0.5);
	return v4_dot(v4_cons(tsq * t, tsq, t, 1.0), tmp);
}
Beispiel #6
0
/** b-spline approximation */
scalar_t bspline(scalar_t a, scalar_t b, scalar_t c, scalar_t d, scalar_t t)
{
	vec4_t tmp;
	scalar_t tsq = t * t;

	static mat4_t bspline_mat = {
		{-1,  3, -3,  1},
		{3, -6,  3,  0},
		{-3,  0,  3,  0},
		{1,  4,  1,  0}
	};

	tmp = v4_scale(v4_transform(v4_cons(a, b, c, d), bspline_mat), 1.0 / 6.0);
	return v4_dot(v4_cons(tsq * t, tsq, t, 1.0), tmp);
}
Beispiel #7
0
void Reaching::ReachingStep(float dt){
    if(dt<EPSILON) return;//no point of doing anything
    //  cout<<"DT "<<dt<<endl;
    joint_vec_t tmp1,tmp3; // temporary variables
    cart_vec_t tmp13;
    float dist=0;
  
    // dt = dt/10; 
    //dist = UpdateLocalTarget();
    if(dist>tol || isnan(dist)){
        SetLocalTarget(target);
        cout<<dist<<" "<<tol<<endl;
    }
    // vite in angle space and cart space
    alpha*=dt;beta*=dt;
    ViteAngle(tar_angle,pos_angle,v_angle,des_angle,des_v_angle);
    ViteCart(target,pos_cart,v_cart,des_cart,des_v_cart);
    alpha /= dt; beta/=dt;

    //  cout<<"vite done"<<endl; 
#ifdef OBSTACLE_AVOIDANCE
    // find the closest obstacle
    float ro,point;
    float gamma;
    CMatrix4_t ijac;
    v4_clear(des_a_angle_obs);
    if(env){
        for (i=1;i<3;i++){
            for(int j=0;j<env->CountManipulableObjects();j++){
                LinkDistanceToObject(i,env->GetObject(j),&ro,&point,tmp13);
                //      coutvec(tmp13);
                IntermediateJacobian(i,point,pos_angle,ijac);
                m3_4_t_v_multiply(ijac,tmp13,tmp1);
                // eq. 18 of Khatib,icra'85
                if(ro<=obstacle_rad){
                    gamma = nu *(1/ro -1/obstacle_rad)/(ro*ro); //(ro*ro) 
                    //test
                    //   gamma *= -v4_dot(tmp1,v_angle)/50;
                    //   gamma = max(0.0,gamma);
                }
                else{
                    gamma =0;
                }
                v4_scale(tmp1,gamma,tmp1);
                v4_add(des_a_angle_obs,tmp1,des_a_angle_obs);
            }
        }
        v4_add(des_a_angle_obs,des_v_angle,des_v_angle);
        v4_add(pos_angle,des_v_angle,des_angle);
    }
#endif
 
    body->SetAnglesInRange(des_angle);
    des_v_angle = des_angle - pos_angle;
    des_v_cart = des_cart - pos_cart;
    if(pure_joint_ctl){
        tmp1 = des_angle;
    }
    else{
        UpdateWeights();
        // coherence enforcement
        ProjectVector(des_v_cart,des_v_angle,tmp3);
        tmp1 = pos_angle+tmp3;
    }
    body->SetAnglesInRange(tmp1);
    body->Angle2Cart(tmp1,tmp13);
    v_angle = tmp1 - pos_angle;
    v_cart = tmp13 - pos_cart;
    pos_cart = tmp13;
    pos_angle = tmp1;
    //pos_angle.Print();
    //pos_cart.Print();
}