前回は教科書的なことを書いたが、メールをくれた高校生が知りたいのはここから先だろうと思う。
竿燈シミュレータの実装では、シミュレーション全体を 1 ステップ進める関数に dt が渡される。dt は「今回、何秒進めるか」だ。
シミュレータの実装コードではPID制御の部分でこう書いている。(Pythonのコード)
def step(self, dt: float) -> SimulationState:
if self.state.safety_tripped:
return self.state
…
if self.controller_mode == “pid”:
automatic_torque = self.pid.update(
self.state.pole_angle_rad,
self.state.pole_angular_velocity_rad_s,
dt,
)
|
コード中の値 |
物理的な意味 |
単位の例 |
| dt | 1ステップの時間幅 | s |
| pole_angle_rad | 竿の傾き | rad |
| pole_angular_velocity_rad_s | 竿の角速度 | rad/s |
| automatic_torque | 制御器が作る回転力 | N·m |
ここで重要なのは、PID 制御器にも dt が渡されていることで、角度と角速度だけでなく「今回の時間幅」(何秒進めるか)が必要なのは、積分や時間変化を扱うからだ。「毎フレーム1回計算」ではなく、Physics の dt と画面描画の周期は分けられる。物理を細かく刻み、表示はそれより少ない回数にすることで、安定した計算と滑らかな画面を両立できる。この辺はシミュレーションのテクニックで本質ではないが、よく使われる手法。