0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

磁石が浮く仕組みをPID制御で解き明かす — 磁気浮上シミュレーター入門

0
Posted at

「磁石で物を浮かせる」——子供の頃、誰もが一度は夢見たことがあるんじゃないでしょうか。でも実は、永久磁石だけでは物体を空中で安定させることができません。これは物理法則で証明されている事実なんです。

一方で、リニアモーターカーは実際に浮上して時速500km以上で走っています。なぜリニアモーターカーは浮いていられるのか? その秘密は「PID制御」という仕組みにあります。

この記事では、ブラウザで動く磁気浮上シミュレーターを題材に、数式・コード・実践を交えながら、磁気浮上の原理を徹底的に解説します。最後まで読めば、自分でPIDゲインを調整して安定浮上を実現できるようになりますよ。


「永久磁石だけじゃダメ」——アーンショーの定理という壁

まず、なぜ永久磁石だけでは物体を安定して浮かせられないのか。これを理解するために、アーンショーの定理という物理法則を紹介します。

この定理をざっくり言うと:

静磁場(時間変化しない磁場)だけでは、すべての方向で安定な浮上点は作れない

つまり、上下方向で反発させて浮かせようとすると、横方向では引き寄せられてしまうんです。まるで「風船を押すと横に逃げる」ような感じですね。

シミュレーターで試してみましょう。「磁力定数K」を大きくして永久磁石モードにすると、物体が一瞬浮いたかと思うと、すぐに横にずれて落下します。これがアーンショーの定理の現れです。

では、どうすれば安定浮上を実現できるのか? 答えは 「能動的な制御」 です。つまり、磁力をリアルタイムで調整しながら、物体の位置を常に監視して補正し続けるんですね。


ざっくり本質——「見ながら調整する」仕組み

磁気浮上制御の本質は、人間がコップの上のボールをバランスするのと似ています。

  • コップの上にボールを置こうとしても、そのままでは落ちる(=永久磁石だけでは不安定)
  • しかし、手で支えながら、ボールの位置を目で見て、手の力を微調整すれば、バランスを保てる

この「目で見る」「判断する」「手を動かす」の3ステップを、機械が自動でやってくれるのがPID制御です。

「センサーで位置を計測 → 目標との差を計算 → 電磁石の電流を調整」の無限ループ

このループを1秒間に何千回も繰り返すことで、安定浮上が実現するんですね。


数式で理解する——磁気浮上の物理とPID制御

磁気吸引力のモデル

まず、電磁石が物体を引き付ける力を数式で表します。シミュレーターでは以下のモデルを使っています:

F_m = K \cdot \frac{I^2}{x^2}

ここで:

  • $F_m$:磁気吸引力 [N]
  • $K$:磁力定数(電磁石の強さを決める係数)
  • $I$:コイル電流 [A]
  • $x$:電磁石と物体のギャップ [m]

この式が示すのは、ギャップが小さくなるほど磁力が急激に強くなるという性質。これが制御を難しくする原因でもあります。

運動方程式

物体の運動はニュートンの第二法則で記述します:

m \cdot \frac{d^2x}{dt^2} = mg - F_m + F_{ext}
  • $m$:物体の質量 [kg]
  • $g$:重力加速度 [m/s²]
  • $F_{ext}$:外部から加わる力 [N]

右辺は「重力」−「磁気吸引力」+「外力」。この釣り合いが崩れると物体が動きます。

PID制御の式

目標ギャップを $x_{ref}$、現在のギャップを $x(t)$ とすると、誤差 $e(t)$ は:

e(t) = x_{ref} - x(t)

この誤差をもとに、電磁石の電流を次のPID則で決定します:

I(t) = K_p \cdot e(t) + K_i \cdot \int e(t) dt + K_d \cdot \frac{de(t)}{dt}

各項の役割は:

  • 比例項(P):現在の誤差に比例した力を出す。応答を速くする。
  • 積分項(I):過去の誤差を蓄積し、定常偏差(ずっと残る誤差)をゼロに近づける。
  • 微分項(D):誤差の変化速度を見て、振動を抑制する(ダンピング効果)。

この3つのゲイン($K_p, K_i, K_d$)を適切に調整することが、安定浮上の鍵です。


コードで実装する——シミュレーションの核心を再現

それでは、実際にシミュレーションの計算ロジックをJavaScriptで再現してみましょう。以下のコードは、シミュレーターの1ステップ分の計算を抜き出したものです:

// 磁気浮上シミュレーションの1ステップ
function simulationStep(state, dt, params) {
    // パラメータを展開
    const { m, g, K, Kp, Ki, Kd, x_ref, F_ext } = params;
    let { x, v, integral, I_prev } = state;

    // 1. 誤差を計算
    const error = x_ref - x;

    // 2. 積分項(アンチワインドアップ付き)
    integral += error * dt;
    // 積分値が大きくなりすぎないように制限
    const integral_max = 100;
    integral = Math.max(-integral_max, Math.min(integral_max, integral));

    // 3. 微分項(後退差分法)
    const derivative = (error - I_prev) / dt;

    // 4. PID制御で電流を計算
    const I = Kp * error + Ki * integral + Kd * derivative;

    // 5. 磁気吸引力を計算(電流は0以下にならないように)
    const I_clamped = Math.max(0, I);
    const F_m = K * (I_clamped * I_clamped) / (x * x + 0.001); // ゼロ割防止

    // 6. 加速度を計算(運動方程式)
    const a = g - (F_m / m) + (F_ext / m);

    // 7. 速度と位置を更新(オイラー法)
    v += a * dt;
    x += v * dt;

    // 8. 状態を更新して返す
    return {
        x: x,
        v: v,
        integral: integral,
        I_prev: error  // 次の微分計算用
    };
}

// 使用例:1ステップ進める
const state = {
    x: 0.010,        // 現在のギャップ [m](10mm)
    v: 0.0,          // 速度 [m/s]
    integral: 0.0,   // 積分値の累積
    I_prev: 0.0      // 前回の誤差
};

const params = {
    m: 0.1,          // 質量 [kg]
    g: 9.81,         // 重力加速度 [m/s²]
    K: 0.005,        // 磁力定数
    Kp: 500,         // 比例ゲイン
    Ki: 10,          // 積分ゲイン
    Kd: 50,          // 微分ゲイン
    x_ref: 0.008,    // 目標ギャップ [m](8mm)
    F_ext: 0.0       // 外力 [N]
};

const dt = 0.001;    // 時間刻み [s](1ms)
const newState = simulationStep(state, dt, params);

このコードのポイントは:

  • アンチワインドアップ:積分値が発散しないように上限を設定
  • ゼロ割防止:ギャップが0になっても計算が破綻しないように微小値を加算
  • 電流の下限:電流が負にならないようにクランプ

実際のシミュレーターではさらに細かい処理(グラフ描画、衝突判定など)が入りますが、制御の核心はこの20行に集約されています。


数値例で確かめる——実際に計算してみよう

それでは、具体的な数値を使って1ステップの計算を追ってみましょう。

設定値:

  • 質量 $m = 0.1$ kg
  • 重力加速度 $g = 9.81$ m/s²
  • 磁力定数 $K = 0.005$
  • 目標ギャップ $x_{ref} = 0.008$ m(8mm)
  • 現在のギャップ $x = 0.010$ m(10mm)→ 2mm下がっている
  • 速度 $v = 0$ m/s
  • 外力 $F_{ext} = 0$ N
  • PIDゲイン:$K_p = 500, K_i = 10, K_d = 50$
  • 時間刻み $\Delta t = 0.001$ s

Step1:誤差の計算

e = 0.008 - 0.010 = -0.002 \text{ m}

物体が目標より2mm下がっているので、誤差は負の値。

Step2:積分項(初回なので積分値は0と仮定)

\int e dt \approx 0 + (-0.002) \times 0.001 = -2.0 \times 10^{-6}

Step3:微分項(前回の誤差も0と仮定)

\frac{de}{dt} \approx \frac{-0.002 - 0}{0.001} = -2.0 \text{ m/s}

Step4:PID制御で電流を計算

I = 500 \times (-0.002) + 10 \times (-2.0 \times 10^{-6}) + 50 \times (-2.0)
I = -1.0 - 0.00002 - 100 = -101.0 \text{ A}

でも、電流は負になれないので $I = 0$ A にクランプされます。

Step5:磁気吸引力

F_m = 0.005 \times \frac{0^2}{(0.010)^2 + 0.001} = 0 \text{ N}

Step6:加速度

a = 9.81 - \frac{0}{0.1} + \frac{0}{0.1} = 9.81 \text{ m/s}^2

Step7:速度と位置の更新

v = 0 + 9.81 \times 0.001 = 0.00981 \text{ m/s}
x = 0.010 + 0.00981 \times 0.001 = 0.01000981 \text{ m}

物体は重力でさらに下がりました。でも、次のステップでは誤差が大きくなり、微分項がさらに大きな制御信号を生み出します。このループを繰り返すうちに、電磁石が十分な吸引力を発揮する電流値に達し、物体は目標位置に向かって引き上げられていきます。

この計算からわかるのは、最初のうちは重力に負けて落下するが、制御が追いついて浮上を開始するという過渡的な挙動です。


シミュレーターで遊ぶ——3つの実験で体感しよう

実際にシミュレーターを開いて、以下の実験を試してみてください。

実験1:Pゲインだけを大きくするとどうなる?

操作: 比例ゲイン $K_p$ を 500 → 2000 に上げてみる($K_i=0, K_d=0$)

結果: 応答は速くなるが、物体が目標位置を行き過ぎて激しく振動(ハンチング) する。これは比例制御だけでは「行き過ぎを止める力」が足りないから。

なぜ? P制御は「今の誤差」にしか反応しない。誤差が小さくなると電流も小さくなるので、慣性で行き過ぎてしまう。これが 「過制御」 の状態です。

実験2:Dゲインで振動を抑える

操作: $K_p=2000, K_d=0$ で振動している状態から、$K_d$ を 50 → 200 に上げる

結果: 振動が収まり、滑らかに目標位置に収束する。まるでダンパーが効いたような動き。

なぜ? 微分項は「誤差の変化速度」を見ている。物体が目標に近づく速度が速いほど、ブレーキをかけるように電流を減らす方向に働く。これがダンピング効果です。

実験3:外力を加えてみる

操作: 安定浮上中($K_p=500, K_i=10, K_d=50$)に「外力 $F_{ext}$」を 2N に設定する

結果: 物体が一瞬押し下げられるが、PID制御が即座に電流を増やして元の高さに戻す。外力を0に戻すと、少しオーバーシュートしてから再び安定。

なぜ? 積分項が「外力によって生じた定常誤差」を蓄積し、それを打ち消す方向に電流を調整する。ただし、積分ゲインが大きすぎると、外力がなくなった後に「積分ワインドアップ」が発生して大きく行き過ぎることも。


現場でハマるポイント——実機で泣かないための注意点

シミュレーターで遊んで「簡単じゃん」と思ったあなた。実機では以下の落とし穴が待っています。

1. 「Pゲインを上げれば速くなる」は大間違い

確かに $K_p$ を上げれば応答は速くなります。でも、ある閾値を超えると制御系が発振します。実機ではコイルが過熱したり、制御装置が故障する原因に。

実務の目安: 振動が収まるギリギリ手前の値が「最適ゲイン」の第一歩。シミュレーターでいうと、$K_p$ を少しずつ上げて、振動し始めたら10%戻す、という調整が王道です。

2. 「Dゲインは大きければ大きいほど良い」も危険

微分項は誤差の「変化速度」を見ているので、センサーのノイズを極端に増幅します。例えば、ギャップ測定値に0.01mmのノイズが乗っていたら、$K_d$ が大きいとそれが巨大な制御信号の乱れに変わってしまう。

実務の対策: 「不完全微分」という手法を使います。微分項にローパスフィルタをかけて、高周波ノイズの影響を抑えるんです。

3. 「Iゲインは最初から大きくしておこう」が一番危険

積分項は過去の誤差をずっと蓄積します。急に外力がかかった後などに、誤差は解消されたのに蓄積した値(積分ワインドアップ)が残り、制御が大きくオーバーシュートする原因に。

実務の対策: 「アンチワインドアップ」が必須。シミュレーターのコードでも実装したように、積分値の上限を設定するのが基本です。

これらの問題は、シミュレーターで $K_i$ を大きくしてから外力を加えたり、$K_d$ を大きくしてノイズを模擬してみると体感できます。


まとめ——3つの要点

  1. 永久磁石だけでは安定浮上できない(アーンショーの定理)。能動的な制御が必要。
  2. PID制御は「P(比例)で応答、D(微分)で制振、I(積分)で定常偏差除去」 の3役。この順番で調整するのがセオリー。
  3. 実機ではゲインの限界とノイズ対策が重要。シミュレーターで安全に試行錯誤できるのが最大のメリット。

最後に、この記事で使ったシミュレーターを改めて紹介します。

磁気浮上シミュレーター(PID制御) — ブラウザで即動作、登録不要

スライダーを動かすだけでPIDゲインを調整でき、リアルタイムで浮上の様子が観察できます。リニアモーターカーや磁気軸受の原理を、手を動かしながら学べる優れたツールです。

NovaSolverでは、この他にも700以上の工学シミュレーターを無料公開しています。

👉 シミュレーター一覧はこちら

「理論と実践の橋渡し」——それがシミュレーターの力です。ぜひ遊んでみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?