経路に時間をつけたものが軌道
軌道(トラジェクトリ)は、手先が通る道すじに、それぞれの点を通る時刻をつけたものです。ロボットアームは、2点を直線で結ぶ軌道を作って、決まった時間で動かします。
直線の道すじは、始点と終点を等しい間隔で区切るだけで作れます。ここでの動きは、シミュレーションです。
このレッスンのゴール
メモ
2点を結ぶ直線の経路を等しい間隔の点に区切り、最高速度から必要な時間を求められる。
キーワード
| ことば | いみ |
|---|---|
| 経路 | 手先が通る道すじ |
| 軌道 | 経路に、通る時刻をつけたもの |
| 補間 | 2点の間の点を、計算で作ること |
| 最高速度 | 手先が出してよい、最も速い速さ |
| 区間 | 隣り合う2つの点の間 |
学生が入力するセルは、このプレビューでは空白です。
始点から終点まで等間隔に点を作る
始点を A、終点を B とします。0 から 1 までの数 t を決めると、点は「A + t × (B − A)」です。t が 0 なら A、1 なら B です。
区間を n 個に分けるなら、t は 0、1/n、2/n、…、1 です。x と y に、同じ式を別々に使います。
例: (0, 0) から (4, 2) まで4区間
| 番号 | t | x | y |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1/4 | 1 | 0.5 |
| 2 | 2/4 | 2 | 1 |
| 3 | 3/4 | 3 | 1.5 |
| 4 | 1 | 4 | 2 |
学生が入力するセルは、このプレビューでは空白です。
0 から 1 を5つの点に分ける
docker exec jupyter python3 -c "import numpy as np; print(np.linspace(0, 1, 5))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
点 (0, 6) から (3, 0) へ、4つの点
docker exec jupyter python3 -c "import numpy as np; print(np.linspace(0, 3, 4), np.linspace(6, 0, 4))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
経路を Python で作る
# 点 (1, 0) から点 (4, 3) まで、3つの区間で進みます。
start = [1, 0]
end = [4, 3]
steps = 3
for i in range(steps + 1):
t = i / steps
x = start[0] + t * (end[0] - start[0])
y = start[1] + t * (end[1] - start[1])
print(i, round(x, 3), round(y, 3))
# steps を 6 に変えて、もう一度実行します。
# 点はいくつ表示されますか。
速さの上限から最短の時間が決まる
直線の長さは、x の差と y の差から、斜めの辺として求まります。最短の時間は、長さを最高速度で割った値です。
時間の刻みを dt とすると、必要な区間の数は、時間を dt で割った数です。割り切れなければ、切り上げます。
例: 長さ 5、最高速度 2
| 時間の刻み | 最短の時間 | 必要な区間 |
|---|---|---|
| 0.5 秒 | 2.5 秒 | 5 |
| 1 秒 | 2.5 秒 | 3(切り上げ) |
| 2.5 秒 | 2.5 秒 | 1 |
学生が入力するセルは、このプレビューでは空白です。
長さ 5、最高速度 2 の最短時間
docker exec jupyter python3 -c "import numpy as np; print(np.hypot(3, 4) / 2)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
区間が n 個なら、点も n 個だと考えがちです。実際は、点は n + 1 個です。始点と終点の両方を数えるからです。range(steps) だけでは、終点が抜けます。