0 制御ループについて Posted by Masafumi Miwa on January 14, 2013 at 3:48pm WikiとmissonPlanner、ソースコードを読んでみて、Arducopterの制御ループは以下の図のようになっていると思うのですが、いかがでしょうか?図1 Attitude、Yaw、Altitudeのループ 図2 Loiterのループ GpはAttitudeのループ You need to be a member of diydrones to add comments! Join diydrones Email me when people reply – Follow
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値になっているのでしょうか?