18 def normalize_angle(angle):
20 Normalize the angle to between [0, 2pi).
24 The angle to normalize in radians
28 The normalized angle in the range [0,2pi)
31 while angle >= 2*np.pi:
40 def angle_difference(angle_1, angle_2, left_turn=None):
42 Calculate the difference between two angles based on a given direction.
46 The starting angle in radians
48 The ending angle in radians
50 The direction of turn. True if left, false if right
51 and None if smallest angular difference should be
56 The angular difference between the two angles according to
57 the specified turn direction
61 dif = abs(angle_1 - angle_2)
63 return dif
if dif <= np.pi
else 2 * np.pi - dif
67 if angle_2 >= angle_1:
68 return abs(angle_1 - angle_2)
70 return 2 * np.pi - abs(angle_1 - angle_2)
73 if angle_1 >= angle_2:
74 return abs(angle_1 - angle_2)
76 return 2 * np.pi - abs(angle_1 - angle_2)
79 def interpolate_yaws(start_angle, end_angle, left_turn, steps):
81 Create equally spaced yaws between two angles.
89 The direction of turn. True if left, False otherwise
91 The number of yaws to generate between start and end
96 An array of yaws starting at start angle and ending at end
97 angle with steps number of angles between them
101 if start_angle > end_angle:
102 end_angle += 2 * np.pi
104 if end_angle > start_angle:
105 end_angle -= 2 * np.pi
107 yaws = np.linspace(start_angle, end_angle, steps)
108 yaws = np.vectorize(normalize_angle)(yaws)
113 def get_rotation_matrix(angle):
115 Return a rotation matrix that is equivalent to a 2D rotation of angle.
119 The angle to create a rotation matrix for
123 A 2x2 matrix representing a 2D rotation by angle
126 return np.array([[np.cos(angle), -np.sin(angle)],
127 [np.sin(angle), np.cos(angle)]])