位置と向きを数で表す
座標は、ものの位置を数の組で表す方法です。ロボットアームを動かす計算は、手先がどこにあり、どちらを向くかを、座標と角度で表すことから始まります。
このモジュールの動きは、すべてコンピュータの中のシミュレーションです。実際のロボットは動かしません。
このレッスンのゴール
メモ
点の位置を座標で表し、原点を中心に回した点の新しい座標を求められる。
キーワード
| ことば | いみ |
|---|---|
| 座標 | 位置を表す数の組。(x, y) と書く |
| 原点 | 座標が (0, 0) の基準の点 |
| 角度 | どれだけ回ったかを表す数。単位は度 |
| 回転 | 原点を中心に、点を角度だけ回すこと |
| ラジアン | 角度のもう1つの単位。180度は約3.14 |
| 向き | ものが、どちらを向いているか |
学生が入力するセルは、このプレビューでは空白です。
位置は x と y の2つの数
平面の上の点は、座標 (x, y) で表します。x は原点から右へ、y は上へ進んだ長さです。原点は (0, 0) です。
原点から点までの距離は、直角三角形の斜めの辺として求まります。向きは、x 軸から左回りに測った角度で表します。
例: 点の距離と向き
| 点 | 原点からの距離 | 向き(x 軸から) |
|---|---|---|
| (5, 0) | 5 | 0度 |
| (0, 2) | 2 | 90度 |
| (-4, 0) | 4 | 180度 |
| (3, 4) | 5 | 約 53.13度 |
学生が入力するセルは、このプレビューでは空白です。
距離と向きはコマンドで確かめる
np.hypot(x, y) は原点までの距離を、np.arctan2(y, x) は向きを返します。向きは、ラジアンという単位で返るので、np.degrees で度に直します。
点 (3, 4) の距離と向き
docker exec jupyter python3 -c "import numpy as np; print(np.hypot(3, 4), round(np.degrees(np.arctan2(4, 3)), 2))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
回転すると、距離は変わらず向きだけ変わる
点を原点のまわりに a 度回すと、原点からの距離は同じで、向きだけ a 度増えます。新しい座標は、次の2つの式で求まります。
新しい x は「x × cos a − y × sin a」、新しい y は「x × sin a + y × cos a」です。cos と sin は、角度から決まる数です。
例: 点を回した結果
| もとの点 | 回す角度 | 回したあと |
|---|---|---|
| (1, 0) | 90度 | (0, 1) |
| (1, 0) | 180度 | (-1, 0) |
| (2, 1) | 90度 | (-1, 2) |
| (0, 3) | -90度 | (3, 0) |
学生が入力するセルは、このプレビューでは空白です。
Python の cos と sin はラジアンで受け取る
Python の cos と sin は、度ではなくラジアンで角度を受け取ります。180度が約 3.14159 ラジアンです。
度からラジアンへは math.radians で変えます。この教材で言葉に出てくる角度は、すべて度です。
180度は何ラジアンか
docker exec jupyter python3 -c "import numpy as np; print(np.radians(180))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
点 (2, 1) を90度回す
docker exec jupyter python3 -c "import numpy as np; a = np.radians(90); print(round(2 * np.cos(a) - 1 * np.sin(a), 3), round(2 * np.sin(a) + 1 * np.cos(a), 3))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
回転を Python で書く
import math
# 点 (3, 0) を、原点を中心に 60 度回します。
x = 3
y = 0
angle = 60
a = math.radians(angle)
new_x = x * math.cos(a) - y * math.sin(a)
new_y = x * math.sin(a) + y * math.cos(a)
print(round(new_x, 3), round(new_y, 3))
# angle を 180 に変えて、もう一度実行します。
# 点はどこへ動きますか。
よくある間違い
注意
度のまま cos や sin に渡すと考えがちです。実際は、ラジアンで渡す決まりです。90度を渡したつもりでも、90ラジアンとして計算されます。必ず math.radians で変えます。