関節の速さが手先の速さになる
ヤコビ行列は、関節がどれだけ速く動くと、手先がどれだけ速く動くかを表す、数の表です。腕の先を滑らかに動かすには、角度だけでなく、速さの関係も必要です。
このレッスンでは、ヤコビ行列を、関節を少し動かして数えるやり方で求めます。シミュレーションの計算です。
このレッスンのゴール
メモ
関節を少し動かして手先の動きを測り、ヤコビ行列を数値で求め、手先の速さを計算できる。
キーワード
| ことば | いみ |
|---|---|
| 速さ | 1秒あたりに動く量 |
| ヤコビ行列 | 関節の速さを手先の速さに変える2行2列の表 |
| 数値微分 | 少し動かして、変わり方を数で測る方法 |
| 特異点 | ヤコビ行列が働かなくなる腕の形 |
| 行列式 | 2行2列の表から作る、1つの数 |
学生が入力するセルは、このプレビューでは空白です。
少し動かして、手先の動きを測る
関節1を 0.01 度だけ前に、0.01 度だけ後ろに動かし、手先の位置を2回求めます。その差を 0.02 で割ると、関節1が1度動いたときの手先の動きが分かります。
この方法を数値微分といいます。関節2にも、同じ測り方を使います。
例: l1 が 2、l2 が 1、a1 が 0度、a2 が 90度
| 動かす関節 | 1度動かしたときの手先の x | 手先の y |
|---|---|---|
| 関節1 | 約 -0.01745 | 約 0.03491 |
| 関節2 | 約 -0.01745 | 0 |
学生が入力するセルは、このプレビューでは空白です。
この4つの数を並べたものがヤコビ行列
上の表の4つの数を、2行2列に並べたものが、ヤコビ行列です。1列目が関節1、2列目が関節2の分です。
手先の速さは、各列に関節の速さをかけて足します。vx は「1行1列 × s1 + 1行2列 × s2」、vy は「2行1列 × s1 + 2行2列 × s2」です。
数値微分を1回測る
docker exec jupyter python3 -c "import numpy as np; f = lambda t: 2 * np.cos(np.radians(t)); print(round((f(30.01) - f(29.99)) / 0.02, 5))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
関節1が毎秒10度のときの手先の速さ
docker exec jupyter python3 -c "import numpy as np; j = np.array([[-0.01745, -0.01745], [0.03491, 0]]); print(j @ np.array([10, 0]))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
数値微分を Python で
import math
# 手先の位置を求める関数です(前のレッスンと同じ計算)。
def hand_x(l1, l2, a1, a2):
return l1 * math.cos(math.radians(a1)) + l2 * math.cos(math.radians(a1 + a2))
# 関節1を 0.01 度だけ前後に動かして、手先の x の変わり方を測ります。
h = 0.01
before = hand_x(3, 2, 20 - h, 50)
after = hand_x(3, 2, 20 + h, 50)
print(round((after - before) / (2 * h), 5))
# 20 を 0 に変えて、もう一度実行します。
# 変わり方は、大きくなりますか、小さくなりますか。
腕がまっすぐ伸びると、動けない向きがある
腕がまっすぐ伸びきると、手先は腕の向きには動けません。関節を回しても、手先は横にしか動かないからです。
このとき行列式は 0 になります。この形を特異点といい、ヤコビ行列からは、求めたい関節の速さが決まりません。
例: 行列式の計算
| 行列 | 行列式の計算 | 行列式 |
|---|---|---|
| [[2, 1], [1, 1]] | 2×1 − 1×1 | 1 |
| [[2, 1], [4, 2]] | 2×2 − 1×4 | 0(特異) |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
関節の速さと手先の速さは、同じ単位だと考えがちです。実際は、関節は度/秒で、手先は長さ/秒です。1度あたりで測ったヤコビ行列に、度/秒をかければ、長さ/秒になります。