コンテンツにスキップ

06. 単純な2次元ロケット

加速度の大きさは決まっていて、向きだけを自由に変えられる機体があります。 静止した状態から、高さ 1 m の水平な飛行に最も早く移るには、加速度をどの向きに向ければよいでしょうか。 ロケットを軌道に乗せる問題を、重力も空気もない平面に単純化したものです。

項目内容
状態水平速度 uu、鉛直速度 vv、水平位置 xx、高さ yy
制御加速度の向き β\beta(水平から測った角度)
目的終了時刻 tft_f を最小にする
区間1区間、20ノード、終了時刻は自由
新しく学ぶこと2次元の運動、制御が「大きさ」ではなく「向き」の角度であること

ロケットを打ち上げて軌道に乗せるときは、最初は上へ向かって高度を稼ぎ、だんだん機体を倒して横向きの速度をつけ、 目標の高度では上下の速度がゼロになって水平に飛ぶようにします。この「機体をどう倒していくか」が問題の核心です。

この例題では、それを最も単純な形にします。

  • 機体は平面上を動き、重力も空気抵抗もありません。
  • 加速度の大きさは常に a=1 m/s2a = 1\ \mathrm{m/s^2} で、変えられるのは向き β\beta だけです。
  • 止まった状態から出発し、高さ 1 m で、水平速度 1 m/s・鉛直速度 0 の状態になったら到着です。どの水平位置で到着してもかまいません。

上だけに加速すれば早く高さを稼げますが、鉛直速度が残って止まれず、水平速度もつきません。 横だけに加速すれば高さが稼げません。向きを時間とともにどう変えるかで、到着までの時間が変わります。

u˙=acos⁡βv˙=asin⁡βx˙=uy˙=v\begin{aligned} \dot{u} &= a \cos\beta \\[2pt] \dot{v} &= a \sin\beta \\[2pt] \dot{x} &= u \\[2pt] \dot{y} &= v \end{aligned}
  • u,vu, v は水平・鉛直方向の速度 [m/s]、x,yx, y は水平位置と高さ [m] です。
  • 加速度 aa を角度 β\beta の向きに出すので、水平成分は acos⁡βa\cos\beta、鉛直成分は asin⁡βa\sin\beta です。
  • β=0\beta = 0 は真横(+x+x 方向)、β=90∘\beta = 90^\circ は真上、β<0\beta < 0 は斜め下向きです。
u(0)=0,v(0)=0,x(0)=0,y(0)=0u(tf)=1,v(tf)=0,y(tf)=1\begin{aligned} &u(0) = 0,\quad v(0) = 0,\quad x(0) = 0,\quad y(0) = 0 \\[2pt] &u(t_f) = 1,\quad v(t_f) = 0,\quad y(t_f) = 1 \end{aligned}

原点で静止した状態から出発します。終端では高さ 1 m、水平速度 1 m/s、鉛直速度 0 にします。 終端の水平位置 x(tf)x(t_f) には条件をつけません。どこで到着するかも最適化の結果として決まります。

−π2≤β≤π2-\frac{\pi}{2} \le \beta \le \frac{\pi}{2}

加速度の向きは前方(uu が増える側)の半円に限ります。後ろ向きに加速しても得はないので、 この範囲で角度を一意に決めるための制約です。

J=tfJ = t_f

到着までの時間を最小にします。

記号意味値
aa加速度の大きさ1 m/s²

時間区間を [0,2][0, 2] s とし、s=t/2s = t/2(0 から 1 へ進む割合)を使って次のように与えます。

  • 水平速度は u=su = s(0 から 1 へ直線的に増える)、水平位置はそれを積分した x=s2x = s^2。
  • 高さは y=3s2−2s3y = 3s^2 - 2s^3(0 から 1 へなめらかに上がり、両端で傾き 0)、鉛直速度はその時間微分 v=3s(1−s)v = 3s(1-s)。
  • 角度はこれらの速度変化から決まる向き β=arctan⁡(3(1−2s))\beta = \arctan\bigl(3(1 - 2s)\bigr) で、上向きから下向きへ変わります。
軌跡。青い線が機体の通った経路、白い点はノードでの位置、橙の矢印は各ノードで加速度を向けた方向です。黒丸が始点、黒四角が終点です。
軌跡。青い線が機体の通った経路、白い点はノードでの位置、橙の矢印は各ノードで加速度を向けた方向です。黒丸が始点、黒四角が終点です。
上:水平位置 x(実線)と高さ y(破線)。中:水平速度 u(実線)と鉛直速度 v(破線)。下:加速度の向き β。点はノードでの値、線はそれらを通る多項式、赤い点線は角度の制約 ±90° です。
上:水平位置 x(実線)と高さ y(破線)。中:水平速度 u(実線)と鉛直速度 v(破線)。下:加速度の向き β。点はノードでの値、線はそれらを通る多項式、赤い点線は角度の制約 ±90° です。
飛行の様子。左は軌跡と機体の向き、右は速度と加速度の向きの時間変化で、縦の黒線が現在の時刻を表します。
  • 到着までの最短時間は 2.085 s です。
  • 到着する水平位置は 1.043 m です。
  • 加速度の向きは、最初は 1.35 rad(約 77°、ほぼ上向き)、 最後は -1.34 rad(約 −77°、ほぼ下向き)で、その間をなめらかに変わります。

前半は加速度をほぼ上に向け、鉛直速度を急いで稼ぎます。そのままでは高さ 1 m を通り過ぎてしまうので、 後半は加速度を下に向けて鉛直速度を打ち消し、ちょうど高さ 1 m で v=0v = 0 になるようにします。 鉛直速度は中ほどで最大になり、そこから 0 に戻ります。

水平方向はどうでしょう。角度が ±90∘\pm 90^\circ に近いと cos⁡β\cos\beta は小さく、水平速度はあまり増えません。 角度が 0 を横切る中盤に水平速度が大きく伸び、最後に 1 m/s に達します。 鉛直の「上げて止める」と水平の「1 m/s まで加速する」を、決まった大きさの加速度を振り分けながら同時に満たす、というのがこの問題の答えです。

前半の上向きと後半の下向きはほぼ対称になっています。重力がないので、上げる動作と止める動作に差がないためです。

角度の正接が時間の1次式になる

Section titled “角度の正接が時間の1次式になる”

重力のない平面で、一定の大きさの加速度の向きだけを選んで最短時間で目標に達する問題には、 最適な向きが

tan⁡β(t)=c1−c2 t\tan\beta(t) = c_1 - c_2\, t

の形(c1,c2c_1, c_2 は定数)になるという性質が知られています。線形タンジェント則(linear tangent law)と呼ばれ、 実際のロケットの誘導則の基礎になっています。ここでは終端の水平位置が自由なので、分母が定数のこの形になります。

数値解の tan⁡β\tan\beta も、時刻に対してほぼ直線になります。このため β\beta は、両端では ±90∘\pm 90^\circ に近い値でゆっくり変わり、 中ほどで急に向きを変える S 字の曲線になります。初期推定の β=arctan⁡(3(1−2s))\beta = \arctan(3(1-2s)) も同じ形をしているので、 ソルバーはこの形の係数を調整するだけで答えに近づけます。

この性質は、最適性の条件を先に導く間接法から得られます。直接法の OpenGoddard では こうした式を知らなくても、運動方程式と条件を書くだけで同じ形の解が得られます。

  • 加速度の大きさ PARAMETERS["a"] を 2 にすると、到着時間は短くなります。軌跡の形や角度の変化がどう変わるか比べてみましょう。
  • 終端の条件に水平位置(result.equal(x[-1], ...))を加えると、到着地点が指定されます。このときは tan⁡β\tan\beta が時間の1次式ではなくなり、角度の変化の形が変わります。
  • ノード数(Problem([0.0, 2.0], [20], ...) の 20)を 10 や 40 に変え、最短時間が何桁目まで変わらないかを確かめる。
ターミナルウィンドウ
uv run python examples/06_simple_rocket_2d.py

examples/06_simple_rocket_2d.py を GitHub で見る