メインコンテンツまでスキップ
ステージ 5 · 第25章 · 理論

25. 軌道計画とロボットアーム制御

Seeed Physical AI Beginner's Course 第25章 — パスとトラジェクトリ、関節空間とデカルト空間での補間、線形・3次・5次多項式、およびフィードフォワード(モデルと重力)とフィードバック誤差補正から構成されるトルク指令。

25.1 学習目標​

ユーザーが、アームがターゲット姿勢からどのように滑らかで安全な連続運動を生成しているかを理解できるようにします。

この章のあとには、次のことができるようになります:

  1. 動作をパス(形状)とトラジェクトリ(タイミング)に分け、どちらがタスクによって制約されるかを説明する。
  2. 関節空間補間とデカルト空間補間を選び分ける。
  3. 線形・3次・5次補間の違いと、開始/停止時の挙動がなぜ重要かを説明する。
  4. フィードフォワード、フィードバック、重力補償を説明し、トルク指令がどのように構成されるかを説明する。
パスとトラジェクトリの違い (1/2)
ロボットアームにおけるパスとトラジェクトリ (2/2)

25.2 パス vs. トラジェクトリ​

自宅からオフィスまで歩くところを想像してください。

パス = あなたが通るルート(形状)

ドアを出て左に曲がり、大通りに出て、橋を渡り、右に曲がって、オフィスに到着する

速く歩いてもゆっくり歩いても、このルート自体は変わりません。

トラジェクトリ = あなたが歩くペース(時間 + 速度)

10秒でドアを出て、橋の上で1分間立ち止まり、1階の信号で30秒待つ

同じ道でも、速く歩くか遅く歩くかは違います。

本質的な違い

次元パストラジェクトリ
説明どこにいるかどこにいついるか
定義域空間空間 + 時間
重視するもの形状時間、速度、加速度
例「A から B までまっすぐ行く」「A から B まで5秒で一定速度で行く」

ロボットアームへの対応付け

タスクパストラジェクトリ
溶接溶接ビードの形状ビードに沿った移動速度
把持A からカップの縁までいつ到着するか、どれくらい保持するか
塗装塗装する領域スプレーガンの移動速度

計画の順序:

  1. まずパス(形状)を定義する

  2. そのあとトラジェクトリ(いつどこにいるか)を定義する

具体例

アームがカップを点Aから点Bへ運びます。

パス(形状のみ):

持ち上げる -> 前に伸ばす -> 下ろす

(空間的な曲線)

トラジェクトリ(時間付き):

1秒かけて持ち上げる -> 0.5秒停止 -> 2秒かけて前に伸ばす -> 1秒かけて下ろす

(各時刻の関節角度)

パスが正しくてもトラジェクトリが間違っていることがあります(例:動きが激しすぎてカップが飛んでしまう)。トラジェクトリを正しくするには、まずパスが正しくなければなりません(パスが間違っていれば、どれだけ正確なトラジェクトリでも意味がありません)。

なぜ分けて議論するのか

段階重視するもの
パス計画障害物を避け、実現可能な形状を見つける
トラジェクトリ計画動きを滑らかにし、振動や速度超過をなくす

パスは幾何学の問題であり、トラジェクトリはタイミングの問題です。

アームのトラジェクトリは「滑らか」でなければならない

単に「A から B へ」だけでなく、次のことも必要です:

  • 速度が連続している(0 との間で急に飛ばない)
  • 加速度が連続している(ジャークが急に出ない)
  • モーターの速度制限内である
  • トルク制限内である

これらはすべてトラジェクトリ計画に属します。

25.3 関節空間トラジェクトリとデカルト空間トラジェクトリ​

境界条件からのトラジェクトリ
次元関節空間トラジェクトリデカルト空間トラジェクトリ
補間対象関節角度エンドエフェクタ姿勢
補間関数多項式直線 / 円弧 / 測地線
速度特性関節速度が一定エンドエフェクタ速度が一定

「関節 vs デカルト」は両方のレベルで議論されますが、最もよく問われるのはパスレベルです — それがアームが「何をするか」を決める鍵だからです。

パスの方が注目される理由

タスクどのパスを選ぶか理由
溶接デカルト(直線)溶接ビードが直線だから
塗装デカルト(特定の曲線)塗装面をきちんと覆う必要があるから
パレタイジングどちらでも(関節空間)終端の経路は重要でない
自由搬送関節空間終端の経路を気にする必要がない
ピック後の配置関節空間直線経路の要求がない
警告

デカルト空間トラジェクトリはタスクを記述するうえでは自然ですが、実行するうえでは計算コストが高くなります:サンプリングされた各姿勢ごとに IK を解く必要があります。デカルト空間で計画し、その結果得られる関節トラジェクトリが関節リミットを守り、特異点から離れているかを確認する — あるいは、パスをデカルト空間で生成し、タイミングを関節空間で生成します。 execute it: every sampled pose needs an IK solution. Plan in Cartesian space, then check that the resulting joint trajectory respects the joint limits and stays away from singularities — or generate the path in Cartesian space and the timing in joint space.

25.4 線形補間​

なぜ線形補間はガクッとするのか

関節空間トラジェクトリ:

θ(t)=θstart+(θend−θstart) t\theta(t) = \theta_{start} + (\theta_{end} - \theta_{start})\,t

関節は 0 度から 90 度まで滑らかに動き、その途中を 10% ごとに取った値になります。

位置空間トラジェクトリ:

p(t)=pstart+(pend−pstart) t\mathbf{p}(t) = \mathbf{p}_{start} + (\mathbf{p}_{end} - \mathbf{p}_{start})\,t

エンドは (0,0,0)(0, 0, 0) から (1,0,0)(1, 0, 0) まで直線的に動きます;中間位置は pstart+s (pend−pstart)\mathbf{p}_{start} + s\,(\mathbf{p}_{end} - \mathbf{p}_{start}) で表され、比率 ss は 0 から 1 まで変化します。

長所と短所

問題は速度プロファイルです:関節は一定の非ゼロ速度で動き、最後に瞬時に停止します。

θ˙(t)=θend−θstartT≠0,θ¨(t)=0\dot{\theta}(t) = \frac{\theta_{end} - \theta_{start}}{T} \ne 0, \qquad \ddot{\theta}(t) = 0

長所:

  • シンプルで計算が容易
  • 1 行のコードで実装できる
  • リアルタイム性能が高い

短所:

  • 開始と終了で速度が飛ぶ(そこで速度がゼロではない)
  • アームが開始/停止時に「ガクッ」とする
  • 高精度タスクには不向き

開始/停止時の「ガクッ」が本質的な問題です — そのため、より精密なトラジェクトリでは 3 次/5 次多項式が使われます。

25.5 多項式補間​

なぜ多項式が必要なのか

線形・3次・5次多項式

本質的な違い

次元線形3次5次
開始/停止時の速度飛ぶ00
開始/停止時の加速度飛ぶ飛ぶ0
滑らかさ低い中程度高い
計算負荷最小中程度中程度
最適な用途荒い動き汎用高精度

ロボットアームでの用途

シナリオどれを使うか
荒い搬送、パレタイジング3次
溶接、組立5次
協働ロボット5次(人のそばで安定している必要がある)
高速動作3次(十分)
研究 / デモ5次(最も滑らか)
線形:θ(t)=a0+a1t3次:θ(t)=a0+a1t+a2t2+a3t35次:θ(t)=a0+a1t+a2t2+a3t3+a4t4+a5t5\begin{aligned} \text{線形:}\quad \theta(t) &= a_0 + a_1 t \\ \text{3次:}\quad \theta(t) &= a_0 + a_1 t + a_2 t^2 + a_3 t^3 \\ \text{5次:}\quad \theta(t) &= a_0 + a_1 t + a_2 t^2 + a_3 t^3 + a_4 t^4 + a_5 t^5 \end{aligned}

静止から静止への境界条件を持つ 5 次 — アームは静止状態から始まり、静止状態で終わります:

θ(0)=0,θ˙(0)=0,θ¨(0)=0θ(T)=90∘,θ˙(T)=0,θ¨(T)=0\begin{aligned} \theta(0) &= 0, & \dot{\theta}(0) &= 0, & \ddot{\theta}(0) &= 0 \\ \theta(T) &= 90^\circ, & \dot{\theta}(T) &= 0, & \ddot{\theta}(T) &= 0 \end{aligned}

6 つの条件と 6 つの未知数 a0,a1,…,a5a_0, a_1, \ldots, a_5 — 解は一意に定まります。

25.6 フィードフォワード、フィードバック、重力補償​

フィードフォワードとフィードバックの比較

モーターに送られるトルクは、2 つの要素の合計です:

τcmd=τfeedforward⏟事前に計算される。重力補償を含む+τfeedback⏟誤差から補正され、起きた問題を修正する\tau_{cmd} = \underbrace{\tau_{feedforward}}_{\text{事前に計算される。重力補償を含む}} + \underbrace{\tau_{feedback}}_{\text{誤差から補正され、起きた問題を修正する}}

フィードフォワード:モデルに基づき事前に送る

トラジェクトリとアームのパラメータが与えられれば、各瞬間にどれだけのトルクが必要かを計算できます:

モデルに含まれる項目的
慣性項加速時に慣性を打ち消す
コリオリ項回転時の結合効果を打ち消す
重力項アームが静止していても存在し、重力を直接打ち消す

重力項は特に重要です — アームは静止している間もこれを送り続けなければなりません。そうしないと重力で下に引っ張られてしまいます。

たとえ話:今日は 5 km の上り坂があると分かっているので、あらかじめ力を入れておくイメージです。

フィードバック:問題が起きたときに修正する

どれだけモデルが正確でも、誤差や外乱は存在し、→ 実際の位置はずれていきます。

フィードバックはリアルタイムで比較し、リアルタイムで補正することです:

  • どれだけずれたか -> その分だけ足す(位置フィードバック)
  • どれくらいの速さでずれているか -> その分だけ減衰させる(速度フィードバック)

たとえ話:今日は上り坂があると分かっているが、道に穴が空いているので — 見えたらその都度ハンドルを切って避けるイメージです。

2 つがどのように協調するか

ソース役割割合(典型値)
フィードフォワードトルクの大部分80~95%
フィードバック小さな誤差を補償5~20%

フィードフォワードが大部分を処理し、フィードバックが残りの小さな部分を処理する — この2つを組み合わせることで、高速かつ高精度になります。

比較

次元フィードフォワードフィードバック
タイミング事前に計算するリアルタイムで補正する
依存するものモデルの精度センサの読み取り値
応答即時1フレーム遅れる
外乱除去弱い強い
含まれるもの重力補償を含む含まない

実際のコントローラの形

τcmd=τfeedforward+τfeedback=[M(q) q¨+C(q,q˙) q˙+G(q)]⏟feedforward (incl. gravity)+[Kp e+Kd e˙]⏟feedback\begin{aligned} \tau_{cmd} &= \tau_{feedforward} + \tau_{feedback} \\ &= \underbrace{\big[ M(q)\,\ddot{q} + C(q, \dot{q})\,\dot{q} + G(q) \big]}_{\text{feedforward (incl. gravity)}} + \underbrace{\big[ K_p\,e + K_d\,\dot{e} \big]}_{\text{feedback}} \end{aligned}

重力はフィードフォワードの中に含まれている — 別途計算する必要はありません。

一文でまとめると

フィードフォワードはモデル(重力を含む)に基づいてトルクを事前に送出し、フィードバックは誤差に基づいてリアルタイムに補償する;重力を別に言及する必要はない — アームが静止しているときでさえ計算しなければならない、フィードフォワード内のサブ項だからです。

  • パス = 幾何、トラジェクトリ = タイミング;まずパスを計画し、その後にタイミングを計画する。
  • 関節空間補間は計算コストが低く特異点もない;デカルト空間補間はタスクが通常要求するものです。
  • 線形補間はガクッとする;3次は速度の不連続を取り除き、5次は加速度の不連続も取り除きます。
  • トルク指令は フィードフォワード(モデル + 重力)とフィードバック(誤差補正)の和 であり、重力はフィードフォワードの中に存在します。
  • 次の章では、これらすべてを Pinocchio と MeshCat を用いて実際の reBot Arm モデル上で動かします。
Loading Comments...