制御ループについて

WikiとmissonPlanner、ソースコードを読んでみて、

Arducopterの制御ループは以下の図のようになっていると思うのですが、いかがでしょうか?3690986929?profile=original

図1 Attitude、Yaw、Altitudeのループ

 

3690986826?profile=original

図2 Loiterのループ GpはAttitudeのループ

You need to be a member of diydrones to add comments!

Join diydrones

Email me when people reply –

Replies

  • Randyさん:

    高度制御のシミュレーションをSCILABでやりたいと思い、Arducopterのコードを見ています。
    Arducopter.pdeの 1851からの
    case THROTTLE_AUTO:
    以降が高度制御の部分だと思います。

    まず、現在高度と目標高度の誤差から、PI制御側で目標速度を算出し、
    1863行で目標速度からPID制御でスロットルの値を算出しています。

    nav_throttle = get_throttle_rate(desired_speed);
    そして、1875行から出力値を決めています。
    #if FRAME_CONFIG == HELI_FRAME
    throttle_out = heli_get_angle_boost(g.throttle_cruise + nav_throttle - landing_boost);
    #else
    throttle_out = g.throttle_cruise + nav_throttle + angle_boost - landing_boost;
    #endif

    g.rc_3.servo_out = throttle_out;
    break;

    ここで、g.throttle_cruiseはホバリング時のニュートラルスロットル、
    nav_throttleは高度制御量、
    angle_boostは姿勢の補正量、
    landing_boostは自動着陸の操作量だと思います。

    実際のPWMの出力量は、1804行からの fast_loop()内、set_servos_4()で呼び出される、
    motors.output()がよびだす、AP_MotorsMatrix::output_armed()で決められていそうです。

    ソースを見ていての疑問点ですが、
    1.Attitude.pde 471からのget_throttle_rateの中でわからないところがあります。
    int32_t tmp = (z_target_speed * z_target_speed * (int32_t)g.throttle_cruise) / 200000;

    if(z_target_speed < 0) tmp = -tmp;

    output = constrain(tmp, -3200, 3200);

    ここで計算している、tmpとは何でしょうか?

    2. g.rc_3.servo_out = throttle_out;での、throttoleの値は、すでにPWM値になっているのでしょうか?

This reply was deleted.