예제 #1
0
 static void* playActionThread(void *ptr)
 {
   ServoController* that = (ServoController*)ptr;
   
   ros::Rate loop_rate(that->servo_fps_); 
   while (that->running_)
   {
     if (!that->capture_mode_)
     {
       if ((that->do_mix_ || that->force_mix_) && that->balancing_enabled_) 
       {
         pthread_mutex_lock(&that->mixframe_mutex_);
         pthread_mutex_lock(&that->playframe_mutex_);
         rcservo_PlayActionMix(that->mixframe_);
         pthread_mutex_unlock(&that->playframe_mutex_);
         if (that->reset_after_mix_)
           memset(that->mixframe_, 0, sizeof(long) * 32);
         that->do_mix_ = false;
         pthread_mutex_unlock(&that->mixframe_mutex_);
       }
       else
       {
         pthread_mutex_lock(&that->playframe_mutex_);
         rcservo_PlayAction();
         pthread_mutex_unlock(&that->playframe_mutex_);
       }
     }
     loop_rate.sleep();
   }
       
   return NULL;
 }
예제 #2
0
void Idle(void)
{
	int i;
	double temp_p, temp_r;
	if(rcservo_PlayAction() == RCSERVO_PLAYEND)
	{
		for(i =0 ; i < 6; i++ )
		{
			LEGPOS[0] = LEGGOAL[3*i];
			LEGPOS[1] = LEGGOAL[3*i+1];
			LEGPOS[2] = LEGGOAL[3*i+2];
			if(SWING == 1)
			{
				ALPHA = ALPHA + PI/36.0;
				if(ALPHA >= 2*PI - PI/36.0)
					ALPHA = 0.0;
				temp_p = BODY_PITCH + gain_p*sin(ALPHA)*DEG_TO_RAD;
				temp_r = BODY_ROLL+ gain_r*sin(ALPHA+PI/2)*DEG_TO_RAD;
			}
			else
			{
				temp_p = BODY_PITCH;
				temp_r = BODY_ROLL;
			}
			Transform(BODY_YAW, temp_p, temp_r, LEGPOS);
			AdjustPos(POS_GAIN, LEGPOS);
			CenterToJoint3(LEGPOS,i,J3GOAL);
			Joint3ToJoint2(J3GOAL, J2GOAL);
			JointAngle(LEGPOS, J2GOAL,i,JANGLE);
			SetJoint(JANGLE,i);	
			rcservo_SetAction(POSITION, IDLEPLAYTIME);
			
		}
		IDLEFRAME = 0;
	}
	rcservo_PlayAction();
}
예제 #3
0
void Stable(void)
{
	static double gval[3];
	static double pre_pitch, pitch, pre_roll, roll;
	int i;
	if(timer_nowtime() - STABLETIMER > FRESHTIME)
	{
		ReadGSensor();
		gval[0] = (double)(G_AXIS_VALUE[0]);
		gval[1] = (double)(G_AXIS_VALUE[1]);
		gval[2] = (double)(G_AXIS_VALUE[2]);
		pitch = (GetPitch(gval)- 5.0*DEG_TO_RAD)*0.5 + pre_pitch*0.5;
		roll = (GetRoll(gval) - 4.5*DEG_TO_RAD)*0.5 + pre_roll*0.5;
	
	
		BODY_PITCH = BODY_PITCH + STABLE_P*pitch + (pitch - pre_pitch)*STABLE_D/FRESHTIME;
		BODY_ROLL = BODY_ROLL + STABLE_P*roll + (roll - pre_roll)*STABLE_D/FRESHTIME;

		if(BODY_PITCH > 60.0*DEG_TO_RAD)
			BODY_PITCH = 60.0*DEG_TO_RAD;
		else if(BODY_PITCH < -60.0*DEG_TO_RAD)
			BODY_PITCH = -60.0*DEG_TO_RAD;
		if(BODY_ROLL > 60.0*DEG_TO_RAD)
			BODY_ROLL = 60.0*DEG_TO_RAD;
		else if(BODY_ROLL < -60.0*DEG_TO_RAD)
			BODY_ROLL = -60.0*DEG_TO_RAD;
			
		
		for(i =0 ; i < 6; i++ )
		{
			LEGPOS[0] = LEGGOAL[3*i] - cos(J3MAP[i])*20.0;
			LEGPOS[1] = LEGGOAL[3*i+1] - sin(J3MAP[i])*20.0;
			LEGPOS[2] = LEGGOAL[3*i+2];
			Transform(BODY_YAW, BODY_PITCH, BODY_ROLL, LEGPOS);
			AdjustPos(POS_GAIN, LEGPOS);
			CenterToJoint3(LEGPOS,i,J3GOAL);
			Joint3ToJoint2(J3GOAL, J2GOAL);
			JointAngle(LEGPOS, J2GOAL,i,JANGLE);
			SetJoint(JANGLE,i);	
			rcservo_SetAction(POSITION, STABLETIME);
			STABLETIMER = timer_nowtime(); 
		}
		pre_pitch = pitch;
		pre_roll = roll;
	}
	rcservo_PlayAction();
}
예제 #4
0
void PlayMotion(void)
{
	int i;
	
	for(i =0; i < 6; i++)
	{
		switch(LEGFRAME[i])
		{
			case -1:
				if(timer_nowtime() - PLAYTIMER[i] > STARTTIME[i]) 
				{
					LEGFRAME[i] = 0;
					SetMotion(i);
					rcservo_SetAction(POSITION, PLAYTIME);
					LEGFRAME[i]++;
					LEGTIMER[i] = timer_nowtime();
				}
				break;
			case 11:
				if(timer_nowtime() - LEGTIMER[i] > PLAYTIME) 
				{
					SetMotion(i);
					rcservo_SetAction(POSITION, PLAYTIME);
					LEGFRAME[i] = 0;
					LEGTIMER[i] = timer_nowtime();
				}
				break;	
			case 0:	
				if(timer_nowtime() - LEGTIMER[i] > PLAYTIME) 
				{
					SetMotion(i);
					rcservo_SetAction(POSITION, PLAYTIME);
					LEGFRAME[i]++;
					LEGTIMER[i] = timer_nowtime();
				}
				break;
			case 9:		
			case 1:
				if(timer_nowtime() - LEGTIMER[i] > PLAYTIME) 
				{
					SetMotion(i);
					rcservo_SetAction(POSITION, PLAYTIME);
					LEGFRAME[i] = LEGFRAME[i] + STEP_1;
					LEGTIMER[i] = timer_nowtime();
				}
				break;
			case 3:
			case 6:
				if(timer_nowtime() - LEGTIMER[i] > PLAYTIME) 
				{
					SetMotion(i);
					rcservo_SetAction(POSITION, PLAYTIME);
					LEGFRAME[i] = LEGFRAME[i] + STEP_2;
					LEGTIMER[i] = timer_nowtime();
				}
				break;		
			default:
				if(timer_nowtime() - LEGTIMER[i] > PLAYTIME) 
				{
					SetMotion(i);
					rcservo_SetAction(POSITION, PLAYTIME);
					LEGFRAME[i] = LEGFRAME[i]++;
					LEGTIMER[i] = timer_nowtime();
				}
				break;
		}
	}	
	rcservo_PlayAction();
}