yuto kawamura
/
MR2_n_1_class
l
Diff: main.cpp
- Revision:
- 5:1fa5aa097af5
- Parent:
- 4:3f59e4f5ca30
- Child:
- 6:75cfa1a66382
diff -r 3f59e4f5ca30 -r 1fa5aa097af5 main.cpp --- a/main.cpp Mon Apr 01 02:20:07 2019 +0000 +++ b/main.cpp Sat Apr 20 11:41:38 2019 +0000 @@ -5,55 +5,290 @@ #include "pin.h" #include "microinfinity.h" +#define DEBUG_ON -Timer timer; +#ifdef DEBUG_ON +#define DEBUG(...) printf("" __VA_ARGS__); +#else +#define DEBUG(...) +#endif + + +int ecgear = 25; //ここはいちいち設定したくないからグローバル +float accel_max = 0.01; //これグローバルにしたのはごめん。set関数多すぎてめんどくなった。 + +#define Pi 3.14159265359 //円周率π + +class PIDcontroller //distanceをvalueに置き換えました +{ + float Kp_, Ki_, Kd_, tolerance_, time_delta_; + float pile_, value_old_, target_; + + public: + bool IsConvergence_; //収束したかどうか + PIDcontroller(float Kp, float Ki, float Kd); //初期設定で係数を入力 + void setCoefficients(float Kp, float Ki, float Kd); //係数を変更するときに使う + void setTimeDelta(float delta); + void setTarget(float target); //目標位置の設定 + void setTolerance(float tolerance); //許容誤差の設定 + float calc(float nowVal); //現在位置と目標を比較してPID補正 + bool knowConvergence(); //収束したかどうかを外部に伝える +}; + +class Motor //PIDコントローラ、エンコーダを含むモータのクラス +{ + PwmOut *pin_forward_, *pin_back_; + Ec *ec_; //対応するエンコーダ + float duty_, pre_duty_, duty_limit_; //dutyと現在のモータ位置 + public: + Motor(PwmOut *forward, PwmOut *back); //ピンをポインタ渡し + void setDutyLimit(float limit); + float getPosi(); //ポジをエンコーダから取得 + void calcDuty(PIDcontroller *pid); //Duty比を計算 + void setEncoder(Ec *ec); //エンコーダを設定 + void output(); //出力するだけ +}; -//パラメタ -double dutylimit_nomal = 0.2; // duty出力の上限値(通常時) -double dutylimit_turn = 0.4; // duty出力の上限値(回転時) -int ecgear = 25; //エンコーダのギアの歯数 -/*double Kp_r = 0.342000; //P値 -double Ki_r = 0.013062; //I値 -double Kd_r = 0.003266; //D値 -double Kp_l = 0.342000; //P値 -double Ki_l= 0.013062; //I値 -double Kd_l = 0.003266; //D値*/ -double Kp_r_n = 0.0015; //P値 通常時右 -double Ki_r_n = 0.001; //I値 -double Kd_r_n = 0.0001; //D値 -double Kp_l_n = 0.0015; //P値 回転時右 -double Ki_l_n = 0.001; //I値 -double Kd_l_n = 0.0001; //D値 -double Kp_r_t = 0.004; //P値 -double Ki_r_t = 0.001; //I値 -double Kd_r_t = 0.0001; //D値 -double Kp_l_t = 0.004; //P値 -double Ki_l_t = 0.001; //I値 -double Kd_l_t = 0.0001; //D値 -double leg_wait_time = 0.2; //脚の伸縮にかかる時間 -double leg_wait_time_l = 1; //長い足にかかる時間 -double target_max = 310; //直動機構の目標座標の上限(オーバーシュートを考慮して短めに設定) -double target_min = 20; //直動機構の目標座標の下限(オーバーシュートを考慮して短めに設定) -double servo_iniposi=105; //サーボ初期角度 -double error_target=10;//PIDでの許容誤差 +class AirCylinder +{ + DigitalOut *air_; + bool IsOpenState_; + + public: + AirCylinder(DigitalOut *air); //ピンをポインタ渡し + void open(); //足上げ + void close(); //足下げ + void changeState(); //上がってるとき下げる その逆も +}; + +class OneLeg //足の挙動を制御する +{ + Motor *motor_; + AirCylinder *air1_, *air2_; + float target_pose_; -double pid_time=0.01;//PIDの割り込み時間 -double accel_max=0.01;//加速制限 + public: + PIDcontroller *pid_; + OneLeg(){}; + void setMotor(Motor *motor); + void setPIDcontroller(PIDcontroller *pid); + void setAir(AirCylinder *air1, AirCylinder *air2); + void setTargetPose(float target_pose); + void actMotor();//モータ出力 + void actCylinder();//シリンダ出力 +}; + + +class Robot +{ + float ticker_time_, air_wait_time_; + OneLeg *rightLeg_, *leftLeg_; + Timer timer; + + public: + Robot(){}; + void setLeg(OneLeg *rightLeg, OneLeg *leftLeg); + void setTickerTime(float ticker_time); + void setAirWaitTime(float air_wait_time); + void run();//ここがメインで走る記述 +}; + -//定数 -#define Pi 3.14159265359 //円周率π +PIDcontroller::PIDcontroller(float Kp, float Ki, float Kd) +{ + Kp_ = Kp, Ki_ = Ki, Kd_ = Kd; + DEBUG("set Kp:%.3f KI:%.3f Kd:%.3f \n\r", Kp_, Ki_, Kd_); + IsConvergence_=true; +} +void PIDcontroller::setCoefficients(float Kp, float Ki, float Kd) +{ + Kp_ = Kp, Ki_ = Ki, Kd_ = Kd; +} +void PIDcontroller::setTimeDelta(float delta) +{ + time_delta_ = delta; + DEBUG("set TimeDelta: %.3f\n\r", time_delta_); +} +void PIDcontroller::setTarget(float target) +{ + if (IsConvergence_) //収束時のみ変更可能 + { + target_ = target; + DEBUG("set Target: %.3f\n\r", target_); + IsConvergence_ = false; + } + else + { + DEBUG("error: setTarget permission denied!\n"); + } +} +void PIDcontroller::setTolerance(float tolerance) +{ + tolerance_ = tolerance; + DEBUG("set Tolerance: %.3f\n\r", tolerance_); +} +float PIDcontroller::calc(float nowVal) +{ + float out = 0; + //PID計算ここで行う + float deviation = target_ - nowVal; //目標との差分 + pile_ += deviation; //積分用に和を取る + out = deviation * Kp_ - (nowVal - value_old_) / time_delta_ * Kd_ + pile_ * Ki_ * time_delta_; + value_old_ = nowVal; //今のデータを保存 + // + if (fabs(deviation) < tolerance_) //収束した場合 + { + DEBUG("complete !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\r"); + out = 0; + pile_ = 0; + value_old_ = 0; + IsConvergence_ = true; + } + return out; +} +bool PIDcontroller::knowConvergence() +{ + return IsConvergence_; +} -//変数 -int target_num=0; //現在の目標プロット -bool move_r=0,move_l=0; // -double target_r_out=0,target_l_out=0; -bool reach_target_r=0,reach_target_l=0; -double posi_r=0,posi_l=0; -double pre_out_r=0,pre_out_l=0; -bool turn_mode=0; -double turn_target=0; +Motor::Motor(PwmOut *forward, PwmOut *back) +{ + pin_forward_ = forward; + pin_back_ = back; +} +float Motor::getPosi() +{ + float posi = 1.0 * ecgear * Pi * (ec_->getCount)() /resolution; + DEBUG("posi is %.4f\n\r",posi); + return posi; +} +void Motor::setDutyLimit(float limit) +{ + duty_limit_ = limit; + DEBUG("set DutyLimit: %.3f\n\r", duty_limit_); +} +void Motor::calcDuty(PIDcontroller *pid) +{ + duty_ = pid->calc(getPosi()); + DEBUG("duty is %.4f\n\r",duty_); +} +void Motor::setEncoder(Ec *ec) +{ + ec_ = ec; +} +void Motor::output() +{ + //DEBUG("dutyOut %.3f\n\r",duty_); + //加速度が一定値を超えたら変更加える + if (duty_ > 0) + { + if (duty_ - pre_duty_ > accel_max) duty_ = pre_duty_ + accel_max; + *pin_forward_ = min(fabs(duty_), duty_limit_); + *pin_back_ = 0; + DEBUG("forward %.3f\n\r",pin_forward_->read()); + } + else + { + if (pre_duty_ - duty_ > accel_max) + duty_ = pre_duty_ - accel_max; + *pin_forward_ = 0; + *pin_back_ = min(fabs(duty_), duty_limit_); + DEBUG("back %.3f\n\r",pin_back_->read()); + } + pre_duty_ = duty_; +} + +AirCylinder::AirCylinder(DigitalOut *air) +{ + air_ = air; +} +void AirCylinder::open() +{ + *air_ = 1; + IsOpenState_ = true; +} +void AirCylinder::close() +{ + *air_ = 0; + IsOpenState_ = false; +} +void AirCylinder::changeState() +{ + if (IsOpenState_) + close(); + else + open(); +} + +void OneLeg::setMotor(Motor *motor) +{ + motor_ = motor; +} +void OneLeg::setPIDcontroller(PIDcontroller *pid) +{ + pid_ = pid; +} +void OneLeg::setAir(AirCylinder *air1, AirCylinder *air2) +{ + air1_ = air1, air2_ = air2; +} +void OneLeg::setTargetPose(float target_pose) +{ + target_pose_ = target_pose; + //PIDにtargetを送る + pid_->setTarget(target_pose_); +} +void OneLeg::actMotor() +{ + motor_->calcDuty(pid_); + motor_->output(); +} +void OneLeg::actCylinder() +{ + //上がっている場合は下げ、下がっている時は上げる + air1_->changeState(); + air2_->changeState(); +} + +void Robot::setLeg(OneLeg *rightLeg, OneLeg *leftLeg) +{ + rightLeg_ = rightLeg; + leftLeg_ = leftLeg; +} +void Robot::setTickerTime(float ticker_time) +{ + ticker_time_ = ticker_time; + rightLeg_->pid_->setTimeDelta(ticker_time_); + leftLeg_->pid_->setTimeDelta(ticker_time_); +} +void Robot::setAirWaitTime(float air_wait_time) +{ + air_wait_time_ = air_wait_time; + DEBUG("set AirWaitTime: %.3f\n\r", air_wait_time_); +} +void Robot::run() +{ + while (!rightLeg_->pid_->IsConvergence_ || !leftLeg_->pid_->IsConvergence_) //片方が収束していない時*/ + { + //ticker_time毎にモータに出力する + float time_s = timer.read(); + rightLeg_->actMotor(); + leftLeg_->actMotor(); + float rest_time_s = ticker_time_ - (timer.read() - time_s); + //ticker_timeまで待機 + if (rest_time_s > 0) + wait(rest_time_s); + else //時間が足りない場合警告 + DEBUG("error: restTime not enough\n\r"); + DEBUG("loop end\n\r") + } + + rightLeg_->actCylinder(); + leftLeg_->actCylinder(); + wait(air_wait_time_); +} @@ -61,685 +296,103 @@ void setup(); -void out_r(double);//モーターの出力 -void out_l(double);//モーターの出力 -void pid_r(double,double); //PID (移動先の座標(機体内)[mm],許容誤差の絶対値[mm]) -void pid_l(double,double); //PID (移動先の座標(機体内)[mm],許容誤差の絶対値[mm]) -void move(double,double); //(target_r,target_l) -void up(int); -void down(int); -//void reset(); //脚位置の初期化 -void turn(double); //旋回動作 -void turn_2(double); -void straight(double); //目的地まで直進 void wait_MR1(); -double get_dist(); -void output(); -void sanddune(); -void tussock(); - -Ticker ticker; +//PIDcontroller, Motor, AirCylinderはOneLegのメンバクラスとして扱う +//しかし変更を多々行うためポインタ渡しにしてある +//文が長くなると困るため, PID係数の変更は直接PIDコントローラを介して行う +PIDcontroller pid_r(0.0015, 0.000, 0.000); +PIDcontroller pid_l(0.0015, 0.000, 0.000); //Kp.Ki,Kd +Motor motorLeft(&motor_l_f, &motor_l_b), + motorRight(&motor_r_f, &motor_r_b); //forward,backのピンを代入 +OneLeg leftLeg, rightLeg; +Robot robot; int main() { + DEBUG("start\n\r"); setup(); + //PIDコントローラ生成 左右2つで、係数の変更はメンバ関数を用いて行う + //許容誤差設定 + pid_r.setTolerance(20.0); + pid_l.setTolerance(20.0); + //モータ生成 PID、ECの代入を行うこと + motorLeft.setEncoder(&ec_l); + motorLeft.setDutyLimit(0.2); + motorRight.setEncoder(&ec_r); + motorRight.setDutyLimit(0.2); + + AirCylinder air_leg[4] = {//名前は分けたほうがいいきがする? + AirCylinder(&air[0]), + AirCylinder(&air[1]), + AirCylinder(&air[2]), + AirCylinder(&air[3])}; + AirCylinder air_nonleg[2] = { + AirCylinder(&air[4]), + AirCylinder(&air[5])}; - ticker.attach(&output,pid_time); - - /*while(1){ - printf("%f\r\n",degree0); - }*/ - - wait(3); - /*down(long_r); - down(long_l); - wait(1); - up(long_r);*/ - - //straight(2800); - //turn_2(45); - //move(50,50); - //move(190,190); - sanddune(); - - /*for(int i=0;i<15;i++){ - move(220,220); - move(80,80); - }*/ - - /*for(int i=0;i<5;i++){ - move(300,300); - move(30,30); - } - turn_2(45); - for(int i=0;i<2;i++){ - move(300,300); - move(30,30); - } - turn_2(0); - - for(int i=0;i<4;i++){ - move(300,300); - move(30,30); - }*/ - - - - //sanddune(); - - //move(300,300); - //move(-300,-300); + //シリンダ初期設定 + air_leg[0].open(); + air_leg[1].close();//内側の二つが開く + air_leg[2].close(); + air_leg[3].open(); + + leftLeg.setMotor(&motorLeft); + leftLeg.setPIDcontroller(&pid_l); + leftLeg.setAir(&air_leg[0], &air_leg[1]); + rightLeg.setMotor(&motorRight); + rightLeg.setPIDcontroller(&pid_r); + rightLeg.setAir(&air_leg[2], &air_leg[3]); - //wait(5); - /*move(300,300); - move(30,30); - move(300,300); - move(30,30); - move(300,300); - move(30,30); - move(300,300); - move(30,30); - move(300,300); - move(30,30);*/ + robot.setLeg(&rightLeg, &leftLeg); + robot.setTickerTime(0.01); //モータ出力間隔 0.01 + robot.setAirWaitTime(0.2); //シリンダを待つ時間 + //初期位置は0これは内側が一番内側の時 - /* - wait_MR1(); - - for(int i=0; i<4; i++) { - move(360,360); - move(10,10); - } - turn(700); - sanddune(); - - move(360,360); - move(10,10); - move(10,10); - - turn(-700); - - tussock();*/ + //example これで1サイクル + leftLeg.setTargetPose(200.0); + rightLeg.setTargetPose(200.0); + robot.run(); + leftLeg.setTargetPose(80.0); + rightLeg.setTargetPose(80.0); + robot.run(); + // + DEBUG("program end\n\n\r"); } -double get_dist() -{ - sensor.start(); - //wait_ms(50); //sensor.start()で信号を送ったあと反射波が帰ってきてから距離データが更新されるため、少し待つ必要がある。 - //何ループも回す場合は不要。また、時間は適当だから調整が必要。 - return sensor.get_dist_cm(); -} - - - -//初期設定 void setup() { motor_r_f.period_us(100); motor_r_b.period_us(100); motor_l_f.period_us(100); motor_l_b.period_us(100); - switch_max.mode(PullUp); - switch_min.mode(PullUp); - switch_x.mode(PullUp); - switch_y.mode(PullUp); - switch_hand.mode(PullUp); - for(int i=0; i<4; i++) { - air[i]=1; + + for (int i = 0; i < 4; i++) + { + air[i] = 1; } - air[4]=0; - air[5]=0; + air[4] = 0; + air[5] = 0; + servo.init(); wait_us(1000); - servo.set_degree(0,servo_iniposi); - - device.baud(115200); - device.format(8,Serial::None,1); - device.attach(dev_rx, Serial::RxIrq); - - wait(0.05); - theta0=degree0; -} -int k=0; -void output() -{ - posi_r=1.0*ecgear*Pi*ec_r.getCount()/resolution; - posi_l=1.0*ecgear*Pi*ec_l.getCount()/resolution; - - if(move_r) pid_r(target_r_out,error_target); - else out_r(0); - if(move_l) pid_l(target_l_out,error_target); - else out_l(0); - - k++; - if(k>50){ - printf("%f, %f, %f\r\n",posi_r,posi_l,degree0); - k=0; - } -} - - -//モーターの出力 -void out_r (double duty) -{ - double dutylimit=0; - if(turn_mode)dutylimit=dutylimit_turn; - else dutylimit=dutylimit_nomal; - - if(duty > 0) { //入力duty比が正の場合 - if(duty-pre_out_r >accel_max)duty=pre_out_r+accel_max; - //if(switch_max == 0) { //上限のリミットスイッチが押されていない場合 - if( fabs( duty ) < dutylimit ) { //制限値内 - motor_r_f = fabs(duty); - motor_r_b = 0; - } else { //制限値超 - motor_r_f = dutylimit; - motor_r_b = 0; - } - /*} else { //上限のリミットスイッチが押されている場合 - motor_r_f = 0; - motor_r_b = 0; - }*/ - - } else {//入力duty比が負の場合 - if(pre_out_r-duty >accel_max)duty=pre_out_r-accel_max; - //if(switch_min == 0) { //下限のリミットスイッチが押されていない場合 - if( fabs(duty) < dutylimit) { //制限値内 - motor_r_f = 0; - motor_r_b = fabs(duty); - } else { //制限値超 - motor_r_f = 0; - motor_r_b = dutylimit; - } - /*} else { //下限のリミットスイッチが押されている場合 - motor_r_f = 0; - motor_r_b = 0; - }*/ - } - pre_out_r=duty; - //if(k>49)printf("%f\r\n",dutylimit); -} - -void out_l (double duty) -{ - double dutylimit=0; - if(turn_mode)dutylimit=dutylimit_turn; - else dutylimit=dutylimit_nomal; - - if(duty > 0) { //入力duty比が正の場合 - if(duty-pre_out_l >accel_max)duty=pre_out_l+accel_max; - //if(switch_max == 0) { //上限のリミットスイッチが押されていない場合 - if( fabs( duty ) < dutylimit ) { //制限値内 - motor_l_f = fabs(duty); - motor_l_b = 0; - } else { //制限値超 - motor_l_f = dutylimit; - motor_l_b = 0; - } - /*} else { //上限のリミットスイッチが押されている場合 - motor_l_f = 0; - motor_l_b = 0; - }*/ - - } else {//入力duty比が負の場合 - if(pre_out_l-duty >accel_max)duty=pre_out_l-accel_max; - //if(switch_min == 0) { //下限のリミットスイッチが押されていない場合 - if( fabs(duty) < dutylimit) { //制限値内 - motor_l_f = 0; - motor_l_b = fabs(duty); - } else { //制限値超 - motor_l_f = 0; - motor_l_b = dutylimit; - } - /*} else { //下限のリミットスイッチが押されている場合 - motor_l_f = 0; - motor_l_b = 0; - }*/ - } - pre_out_l=duty; -} - - -double pile_r=0,distance_r_old=0,pile_l=0,distance_l_old=0; - -//PID制御 -void pid_r(double target,double error) //(移動先の座標(機体内)[mm],許容誤差の絶対値[mm]) -{ - double Kp_r,Ki_r,Kd_r; - if(turn_mode){ - Kp_r=Kp_r_t; - Ki_r=Ki_r_t; - Kd_r=Kd_r_t; - }else{ - Kp_r=Kp_r_n; - Ki_r=Ki_r_n; - Kd_r=Kd_r_n; - } - double deviation = target - posi_r; - //printf("%f,%f\r\n",posi_r,deviation); - pile_r += deviation; - out_r(deviation * Kp_r - (posi_r - distance_r_old) / pid_time * Kd_r + pile_r * Ki_r * pid_time); - distance_r_old = posi_r; - if (fabs(deviation) < error) { - out_r(0); - pile_r=0; - move_r=0; - reach_target_r=1; - }else if(turn_mode==1 && fabs(turn_target-degree0)<5){ - out_r(0); - pile_r=0; - move_r=0; - reach_target_r=1; - turn_mode=0; - } -} - -void pid_l(double target,double error) //(移動先の座標(機体内)[mm],許容誤差の絶対値[mm]) -{ - double Kp_l,Ki_l,Kd_l; - if(turn_mode){ - Kp_l=Kp_l_t; - Ki_l=Ki_l_t; - Kd_l=Kd_l_t; - }else{ - Kp_l=Kp_l_n; - Ki_l=Ki_l_n; - Kd_l=Kd_l_n; - } - double deviation = target - posi_l; - pile_l += deviation; - out_l(deviation * Kp_l - (posi_l - distance_l_old) / pid_time * Kd_l + pile_l * Ki_l * pid_time); - distance_l_old = posi_l; - if (fabs(deviation) < error) { - out_l(0); - pile_l=0; - move_l=0; - reach_target_l=1; - }else if(turn_mode==1 && fabs(turn_target-degree0)<5){ - out_l(0); - pile_l=0; - move_l=0; - reach_target_l=1; - turn_mode=0; - } -} - - -//脚を上げる -void up(int i) // j=1 待ち時間あり -{ - air[i]=0; - //if(j)wait(leg_wait_time); -} - -//脚を降ろす -void down(int i) -{ - air[i]=1; - //if(j)wait(leg_wait_time); -} - - - -//移動 -void move (double target_r,double target_l) -{ - //pc.printf("x target=%f , posi=%f\r\n",x,linear_posi); - int upleg_r=0,upleg_l=0; - if(fabs(target_r)>target_max)target_r=target_max; - else if(fabs(target_r)<target_min)target_r=target_min; - if(target_r>0) { - if(posi_r<target_r)upleg_r=r_o_s; - else upleg_r=r_i_s; - } else { - if(posi_r>-target_r)upleg_r=r_o_s; - else upleg_r=r_i_s; - } - - if(fabs(target_l)>target_max)target_l=target_max; - else if(fabs(target_l)<target_min)target_l=target_min; - if(target_l>0) { - if(posi_l>target_l)upleg_l=l_o_s; - else upleg_l=l_i_s; - } else { - if(posi_l<-target_l)upleg_l=l_o_s; - else upleg_l=l_i_s; - } - up(upleg_r); - up(upleg_l); - - wait(leg_wait_time); - target_r_out=fabs(target_r); - target_l_out=fabs(target_l); - reach_target_r=0; - reach_target_l=0; - move_r=1; - move_l=1; - //printf("%d\r\n",reach_target_r); - /*while(reach_target_r==0 || reach_target_l==0){ - printf("%d\r\n",reach_target_r); - };*/ - while(reach_target_r==0 || reach_target_l==0){ - wait(0.01); - //printf("%d\r\n",reach_target_r); - } - down(upleg_r); - down(upleg_l); - wait(leg_wait_time); - reach_target_r=0; - reach_target_l=0; -} - - + servo.set_degree(0, 105); //初期角度105 -void straight(double distance) //とりあえず左右で位置をずらさない前提 -{ - bool reach=0; - while(1) { - if(distance>0) { - if(target_max-posi_r > posi_r-target_min) { - if(target_max-posi_r > distance) { - move(posi_r+distance,posi_r+distance); - reach=1; - } else { - distance-=target_max-posi_r; - move(target_max,target_max); - } - } else { - if(posi_r-target_min > distance) { - move(posi_r-distance,posi_r-distance); - reach=1; - } else { - distance-=posi_r-target_min; - move(target_min,target_min); - } - } - } else { - if(target_max-posi_r > posi_r-target_min) { - if(target_max-posi_r > -distance) { - move(-posi_r+distance,-posi_r+distance); - reach=1; - } else { - distance+=target_max-posi_r; - move(-target_max,-target_max); - } - } else { - if(posi_r-target_min> -distance) { - move(-posi_r-distance,-posi_r-distance); - reach=1; - } else { - distance+=posi_r-target_min; - move(-target_min,-target_min); - } - } - } - if(reach==1)break; - } -} - -void turn(double distance) //理論計算の元気が出ないから脚の動かす量のみ distance>0:左回転 -{ - while(1) { - if(distance>0) { - if(target_max-posi_r > posi_r-target_min) { - if(target_max-posi_r > distance) { - move(posi_r+distance,-(posi_r+distance)); - break; - } else { - distance-=target_max-posi_r; - move(target_max,-target_max); - } - } else { - if(posi_r-target_min > distance) { - move(-(posi_r-distance),posi_r-distance); - break; - } else { - distance-=posi_r-target_min; - move(-target_min,target_min); - } - } - } else { - if(target_max-posi_r > posi_r-target_min) { - if(target_max-posi_r > -distance) { - move(-(-posi_r+distance),-posi_r+distance); - break; - } else { - distance+=target_max-posi_r; - move(target_max,-target_max); - } - } else { - if(posi_r-target_min> -distance) { - move(-posi_r-distance,-(-posi_r-distance)); - break; - } else { - distance+=posi_r-target_min; - move(-target_min,target_min); - } - } - } - } -} - - -double a=140,b=70; -void turn_2(double target){ - turn_mode=1; - turn_target=target; - if(target-degree0>0){ - move(a,a); - while(turn_mode){ - move(a+b,-(a+b)); - move(a,-a); - } - }else{ - move(a,a); - while(turn_mode){ - move(-(a+b),a+b); - move(-a,a); - } - } -} - -void sanddune() -{ - move(160,160); - down(long_o); - down(long_i); - wait(1); - - up(long_i); - wait(leg_wait_time_l); - target_r_out=50; - target_l_out=50; - //target_l_out=270; - reach_target_r=0; - reach_target_l=0; - move_r=1; - move_l=1; - while(reach_target_r==0 || reach_target_l==0){ - wait(0.01); - } - down(long_i); - //down(l_o_s); - //down(r_i_s); - wait(leg_wait_time_l); - reach_target_r=0; - reach_target_l=0; + device.baud(115200); + device.format(8, Serial::None, 1); + device.attach(dev_rx, Serial::RxIrq); - up(long_o); - wait(leg_wait_time_l); - target_r_out=250; - target_l_out=250; - //target_l_out=70; - reach_target_r=0; - reach_target_l=0; - move_r=1; - move_l=1; - while(reach_target_r==0 || reach_target_l==0){ - wait(0.01); - } - down(long_o); - wait(leg_wait_time_l); - reach_target_r=0; - reach_target_l=0; - - up(long_i); - //up(l_o_s); - //up(r_i_s); - wait(leg_wait_time_l); - target_r_out=160; - target_l_out=160; - reach_target_r=0; - reach_target_l=0; - move_r=1; - move_l=1; - while(reach_target_r==0 || reach_target_l==0){ - wait(0.01); - } - down(long_i); - wait(leg_wait_time_l); - reach_target_r=0; - reach_target_l=0; - - up(long_o); - wait(leg_wait_time_l); - target_r_out=220; - target_l_out=220; - //target_l_out=100; - reach_target_r=0; - reach_target_l=0; - move_r=1; - move_l=1; - while(reach_target_r==0 || reach_target_l==0){ - wait(0.01); - } - down(long_o); - //down(r_o_s); - //down(l_i_s); - wait(leg_wait_time_l); - reach_target_r=0; - reach_target_l=0; - - up(long_i); - wait(leg_wait_time_l); - target_r_out=80; - target_l_out=80; - //target_l_out=240; - reach_target_r=0; - reach_target_l=0; - move_r=1; - move_l=1; - while(reach_target_r==0 || reach_target_l==0){ - wait(0.01); - } - down(long_i); - wait(leg_wait_time_l); - reach_target_r=0; - reach_target_l=0; - - //up(r_o_s); - //up(l_i_s); - up(long_o); - wait(leg_wait_time_l); - target_r_out=0; - target_l_out=0; - reach_target_r=160; - reach_target_l=160; - move_r=1; - move_l=1; - while(reach_target_r==0 || reach_target_l==0){ - wait(0.01); - } - down(long_o); - wait(leg_wait_time_l); - reach_target_r=0; - reach_target_l=0; + wait(0.05); + theta0 = degree0; } - -void tussock() -{ - for(int i=0; i<3; i++) { - up(long_i); - wait(leg_wait_time); - target_r_out=360; - target_l_out=360; - while(reach_target_r==0 || reach_target_l==0); - down(long_i); - wait(leg_wait_time); - reach_target_r=0; - reach_target_l=0; - - up(long_o); - wait(leg_wait_time); - target_r_out=10; - target_l_out=10; - while(reach_target_r==0 || reach_target_l==0); - down(long_o); - wait(leg_wait_time); - reach_target_r=0; - reach_target_l=0; - } -} - -/*int k=0; -//脚位置の初期化 -void reset() -{ - up_x(); - while(switch_min == 0) { - out(-0.2); - k++; - if(k>5000) { - servo.set_degree(0,servo_iniposi); - k=0; - } - } - //pc.printf("%d\r\n",ec.getCount()); - ec.reset(); - out(0); - down_x(); - //pc.printf("%d\r\n",ec.getCount()); -}*/ - - - - - -/*void straight(double target) -{ - while(1) { - double xleg_posi=1.0*ecgear*Pi*ec.getCount()/resolution; //機体内のX脚位置 - double dist=target-linear_posi; - pc.printf("leg=%f,dist=%f,linear_posi=%f\r\n",xleg_posi,dist,linear_posi); - if(fabs(dist)<10) { - break; - } else if((dist>0 && dist<=(target_max-xleg_posi)) || (dist<0 && dist>=(target_min-xleg_posi))) { - move_x(xleg_posi+dist,10); - } else if(dist<0) { - pc.printf("distance < 0"); - break; - } else if(dist<=(target_max-target_min-10)) { - if(dist<=(rail_len*0.5-target_min-10)) { - move_y(dist+xleg_posi-rail_len*0.5,10); - } else { - move_y(target_min,10); - } - } else { - if(xleg_posi<(rail_len*0.5))move_x(target_max,10); - else move_y(target_min,10); - } - } -}*/ - void wait_MR1() { - while(switch_x==1) { - + while (switch_x == 1) + { } //while(switch_hand==0); //air_hand=1; wait(1); - -} \ No newline at end of file +}