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; }
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(); }
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(); }
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(); }