15 from typing
import Any, Optional
18 from numpy.typing
import NDArray
21 def normalize_angle(angle: float) -> float:
23 Normalize the angle to between [0, 2pi).
27 The angle to normalize in radians
31 The normalized angle in the range [0,2pi)
34 while angle >= 2 * np.pi:
43 def angle_difference(angle_1: float, angle_2: float,
44 left_turn: Optional[float] =
None) -> float:
46 Calculate the difference between two angles based on a given direction.
50 The starting angle in radians
52 The ending angle in radians
54 The direction of turn. True if left, false if right
55 and None if smallest angular difference should be
60 The angular difference between the two angles according to
61 the specified turn direction
65 dif = abs(angle_1 - angle_2)
67 return dif
if dif <= np.pi
else 2 * np.pi - dif
71 if angle_2 >= angle_1:
72 return abs(angle_1 - angle_2)
74 return 2 * np.pi - abs(angle_1 - angle_2)
77 if angle_1 >= angle_2:
78 return abs(angle_1 - angle_2)
80 return 2 * np.pi - abs(angle_1 - angle_2)
83 def interpolate_yaws(start_angle: float, end_angle: float,
84 left_turn: bool, steps: int) -> Any:
86 Create equally spaced yaws between two angles.
94 The direction of turn. True if left, False otherwise
96 The number of yaws to generate between start and end
101 An array of yaws starting at start angle and ending at end
102 angle with steps number of angles between them
106 if start_angle > end_angle:
107 end_angle += 2 * np.pi
109 if end_angle > start_angle:
110 end_angle -= 2 * np.pi
112 yaws = np.linspace(start_angle, end_angle, steps)
113 yaws = np.vectorize(normalize_angle)(yaws)
118 def get_rotation_matrix(angle: float) -> NDArray[np.floating[Any]]:
120 Return a rotation matrix that is equivalent to a 2D rotation of angle.
124 The angle to create a rotation matrix for
128 A 2x2 matrix representing a 2D rotation by angle
131 return np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])