λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» Programming/Computer Vision

[python] 3차원 곡간 νšŒμ „ λ³€ν™˜ | scipy Rotation

by 뭅즀 2024. 3. 29.
λ°˜μ‘ν˜•

scipy의 Rotation ν΄λž˜μŠ€λŠ” 3D κ³΅κ°„μ—μ„œμ˜ νšŒμ „ λ³€ν™˜μ„ λ‹€λ£¨λŠ” 데 μ‚¬μš©λœλ‹€. νšŒμ „μ„ λ‚˜νƒ€λ‚΄λŠ” ν–‰λ ¬λ‘œλΆ€ν„° νšŒμ „μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜, νšŒμ „μ„ λ‚˜νƒ€λ‚΄λŠ” μΆ•κ³Ό 각도λ₯Ό μ‚¬μš©ν•˜μ—¬ νšŒμ „μ„ μˆ˜ν–‰ν•  수 μžˆμ–΄μ„œ 3D geometryλ₯Ό λ‹€λ£° λ•Œ ν•΄λ‹Ή 클래슀λ₯Ό 자주 μ‚¬μš©ν•˜κ³  μžˆλ‹€.

 

κ·Έ 쀑에도 Rotation.apply() λ©”μ„œλ“œλ₯Ό 자주 μ‚¬μš©ν•˜λŠ”λ°, 이 λ©”μ„œλ“œλŠ” νšŒμ „λœ 벑터λ₯Ό λ°˜ν™˜ν•œλ‹€. 

 

ν•΄λ‹Ή λ©”μ„œλ“œμ˜ κΈ°λŠ₯은 벑터에 νšŒμ „ 행렬을 κ³±ν•˜λŠ” 것이며, μˆ˜μ‹μ μœΌλ‘œλŠ” μœ„μ™€ 같이 κΈ°μ‘΄ 벑터에 νšŒμ „ν–‰λ ¬(R)을 κ³±ν•˜λŠ” 것과 κ°™λ‹€. νšŒμ „ 행렬을 벑터에 κ³±ν•¨μœΌλ‘œμ¨ νšŒμ „λœ 벑터λ₯Ό 얻을 수 μžˆλ‹€.

 

Rotation.inv().apply() λ₯Ό μ‚¬μš©ν•˜λ©΄ νšŒμ „ ν–‰λ ¬μ˜ 역행렬을 벑터에 μ μš©ν•˜μ—¬ νšŒμ „ ν–‰λ ¬μ˜ λ°˜λŒ€λ°©ν–₯으둜 νšŒμ „μ‹œν‚¬ μˆ˜λ„ μžˆλ‹€.

 

 

μ½”λ“œ 예제

from scipy.spatial.transform import Rotation as R
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 였일러 각 (yaw, pitch, roll) μ •μ˜ (λΌλ””μ•ˆ λ‹¨μœ„)
yaw = np.pi / 4  # z 좕을 κΈ°μ€€μœΌλ‘œ νšŒμ „ν•˜λŠ” 각도 (yaw)
pitch = np.pi / 6  # y 좕을 κΈ°μ€€μœΌλ‘œ νšŒμ „ν•˜λŠ” 각도 (pitch)
roll = np.pi / 3  # x 좕을 κΈ°μ€€μœΌλ‘œ νšŒμ „ν•˜λŠ” 각도 (roll)

# 였일러 각을 νšŒμ „ 객체둜 λ³€ν™˜
rot = R.from_euler('zyx', [yaw, pitch, roll])

# νšŒμ „μ„ μ μš©ν•  벑터 μ •μ˜
vec = [0.1, 0, 0]

# νšŒμ „ 적용
rotated_vec = rot.apply(vec)

# μ‹œκ°ν™”λ₯Ό μœ„ν•œ μ€€λΉ„
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# μ›λž˜ 벑터λ₯Ό μ‹œκ°ν™”
ax.quiver(0, 0, 0, vec[0], vec[1], vec[2], color='b', label='Original Vector')

# νšŒμ „λœ 벑터λ₯Ό μ‹œκ°ν™”
ax.quiver(0, 0, 0, rotated_vec[0], rotated_vec[1], rotated_vec[2], color='r', label='Rotated Vector')

# μΆ• λ ˆμ΄λΈ” μΆ”κ°€
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# λ²”λ‘€ μΆ”κ°€
ax.legend()

# κ·Έλž˜ν”„ 좜λ ₯
plt.show()

  • 였일러 각을 μ‚¬μš©ν•˜μ—¬ 벑터λ₯Ό νšŒμ „ν•˜λŠ” 예제 μ½”λ“œ
  • scipy.spatial.transform.Rotation 클래슀의 from_euler() λ©”μ„œλ“œλ₯Ό μ‚¬μš© - 였일러 각을 νšŒμ „ 객체둜 λ³€ν™˜
  • apply() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ νšŒμ „을 μ μš©ν•  λ²‘터에 νšŒμ „을 μ μš©

 

 

λ°˜μ‘ν˜•