File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 44
55import numpy as np
66import requests
7+ import scipy .spatial .transform
78
89
910def is_connect_to_network (url = "https://www.google.com" , timeout = 5 ):
@@ -222,6 +223,44 @@ def R_to_euler(R):
222223 return np .stack ([x , y , z ], axis = - 1 )
223224
224225
226+ def R_to_Q (R ):
227+
228+ _valid_shape_rotation_matrix (R )
229+ # scipy's Rotation class uses (x, y, z, w) format for quaternions
230+ return scipy .spatial .transform .Rotation .from_matrix (R ).as_quat ()
231+
232+
233+ def sample_from_trajectory (
234+ xyz ,
235+ qxyzw ,
236+ delta_pos = 1.5 , # meter
237+ delta_angle = np .deg2rad (2 ), # radian
238+ ):
239+
240+ assert len (xyz ) == len (qxyzw )
241+
242+ R = Q_to_R (qxyzw )
243+
244+ sampled_idx = [0 ]
245+ last_pos = xyz [0 ]
246+ last_R = R [0 ]
247+
248+ for i in range (1 , len (xyz )):
249+ d_pos = np .linalg .norm (xyz [i ] - last_pos )
250+ dR = last_R .T @ R [i ]
251+ d_angle = np .arccos (R_to_Q (dR )[- 1 ]) * 2
252+
253+ if d_pos >= delta_pos or d_angle >= delta_angle :
254+ sampled_idx .append (i )
255+ last_pos = xyz [i ]
256+ last_R = R [i ]
257+
258+ if sampled_idx [- 1 ] != len (xyz ) - 1 :
259+ sampled_idx .append (len (xyz ) - 1 )
260+
261+ return np .array (sampled_idx )
262+
263+
225264def _valid_shape_rotation_matrix (R ):
226265
227266 if R .ndim < 2 or np .shape (R )[- 2 :] != (3 , 3 ):
You can’t perform that action at this time.
0 commit comments