前回、比例制御(P制御)について学び、そこでP制御だけでは、マイコンの計算能力に限界によりターゲット値に正しく収束しないという問題に直面しました。
誤差が出てしまうのは誤差の値が小さすぎるためです。小さければ積み上げればよいということで、誤差を累積させてフィードバックをかける方法が考えられました。これが積分制御(I制御)です。
収束領域近傍では、ターゲット値と測定値の差はほんの僅かなので値としてはほぼ無視できます。その領域では積分値がそのまま補正値となり、正負の面積の差がほぼゼロとなるまで値を収束させます。
では実際にプログラムで確認をしてみましょう。シミュレーションのプログラムを作ってみました。質量は1g、測定間隔は0.1秒、比例係数は1.0、積分項係数も 1.0 にしてみました。
これをグラフにすると下記のようになります。最初は差が大きいので非常に大きな振れ幅となりますが、次第に収束していきます。
ターゲット値となっているか収束点を拡大をしてみました。確かに 80km/h ぴったりとなっています。
これをシステムとして表現してみました。このフィードバック制御をPI制御と呼びます。
ただ、PI制御の問題点はターゲット値に収束するまでに非常に時間がかかることです。動きが激しい場面ではとても使い物になりません。
次は、PI制御の特性を生かしつつ、収束を早める方法について学びたいと思います。
(^_^)/~
誤差が出てしまうのは誤差の値が小さすぎるためです。小さければ積み上げればよいということで、誤差を累積させてフィードバックをかける方法が考えられました。これが積分制御(I制御)です。
収束領域近傍では、ターゲット値と測定値の差はほんの僅かなので値としてはほぼ無視できます。その領域では積分値がそのまま補正値となり、正負の面積の差がほぼゼロとなるまで値を収束させます。
では実際にプログラムで確認をしてみましょう。シミュレーションのプログラムを作ってみました。質量は1g、測定間隔は0.1秒、比例係数は1.0、積分項係数も 1.0 にしてみました。
#include <stdio.h>
#define MASS 1
#define TIME_INTERVAL 0.1
#define Kp 1.0
#define Ki 1.0
void main()
{
float Vt = 80.0; // Target Velocity
float Vm = 60.0; // Measured Velocity
float Time = 0.0;
float err_integ = 0.0;
printf("%f, %f\n", Time, Vm);
for (int i = 0; i < 500; i++) {
float err = Vt - Vm;
err_integ += err * TIME_INTERVAL;
float force = Kp * err + Ki * err_integ;
float dAcc = force / MASS;
Vm += dAcc * TIME_INTERVAL;
Time += TIME_INTERVAL;
printf("%f, %f\n", Time, Vm);
}
}
これをグラフにすると下記のようになります。最初は差が大きいので非常に大きな振れ幅となりますが、次第に収束していきます。
ターゲット値となっているか収束点を拡大をしてみました。確かに 80km/h ぴったりとなっています。
これをシステムとして表現してみました。このフィードバック制御をPI制御と呼びます。
ただ、PI制御の問題点はターゲット値に収束するまでに非常に時間がかかることです。動きが激しい場面ではとても使い物になりません。
次は、PI制御の特性を生かしつつ、収束を早める方法について学びたいと思います。
(^_^)/~
Make: Drones: Teach an Arduino to Fly
- 出版社/メーカー: Maker Media, Inc
- 発売日: 2016/10/10
- メディア: Kindle版
Holy Stone ミニドローンカメラ付き 空撮カメラ付き 2.4GHz 4CH 6軸ジャイロ バッテリー2個付 国内認証済み 日本語説明書付き フルスペックエディション RTF F180C
- 出版社/メーカー: Holy Stone
- メディア: