Tôi có một chuỗi thời gian, trong đó mỗi phép đo là một bậc bốn. Tôi muốn ước tính vận tốc góc giữa hai phép đo. Hiện tại tôi sử dụng cách tiếp cận khá đơn giản:
wheel_angular_dists = []
for pair in wheel_quats:
diff = t[0] * np.conj[t[1]]
angle = diff.angle
wheel_angular_dists.append[angle]
df_wheel_dists = pd.Series[wheel_angular_dists]
Nó phù hợp với nhu cầu của tôi, nhưng bây giờ tôi tò mò về một cách giải quyết nhiệm vụ này thích hợp. Ví dụ: tôi đã tìm thấy một chức năng
quaternion.quaternion_time_series.anglular_velocity [r, t]
Nhưng tôi đã không sử dụng nó do lỗi:
import quaternion as Q
import numpy as np
orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]]
orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]]
R = np.array[[orient_prev, orient_cur]]
t = np.array[[0.0, 1.0]]
vel = Q.quaternion_time_series.angular_velocity[R, t]
...
error: [m>k] failed for hidden m: fpcurf0:m=2
Ai đó có thể nêu bật một giải pháp thích hợp từ kinh nghiệm thực tế?
Lớp Appals_arrayappending_array
appending_array[shape, dtype=, initial_array=None]
Nguồn: Đệ tứ/tứ kết_time_series.py
Phương pháp
nối
append[self, row]
Nguồn: Đệ tứ/tứ kết_time_series.py
một
a
Nguồn: Đệ tứ/tứ kết_time_series.py
angular_velocity
angular_velocity[R, t]
Nguồn: Đệ tứ/tứ kết_time_series.py
Vận tốc góc gần đúng của khung quay
Thông số
8:minimal_rotation[R, t, iterations=2]
2import quaternion as Q import numpy as np orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]] orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]] R = np.array[[orient_prev, orient_cur]] t = np.array[[0.0, 1.0]] vel = Q.quaternion_time_series.angular_velocity[R, t] ... error: [m>k] failed for hidden m: fpcurf0:m=2
Mảng bậc bốn để sửa đổi
5:slerp[R1, R2, t1, t2, t_out]
8,appending_array[shape, dtype=, initial_array=None]
7slerp[R1, R2, t1, t2, t_out]
Trục dọc theo đó các bậc bốn liên tiếp sẽ được so sánh. Giá trị mặc định là trục cuối cùng của mảng bậc bốn.
Trả lại
1:squad[R_in, t_in, t_out, unflip_input_rotors=False]
2import quaternion as Q import numpy as np orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]] orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]] R = np.array[[orient_prev, orient_cur]] t = np.array[[0.0, 1.0]] vel = Q.quaternion_time_series.angular_velocity[R, t] ... error: [m>k] failed for hidden m: fpcurf0:m=2
Một mảng có hình dạng chính xác giống như mảng đầu vào, chỉ khác nhau bởi các yếu tố chính xác -1 trong một số yếu tố.
Lớp Appals_array
integrate_angular_velocity
integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
Nguồn: Đệ tứ/tứ kết_time_series.py
Phương pháp
Thông số
8:minimal_rotation[R, t, iterations=2]
2import quaternion as Q import numpy as np orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]] orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]] R = np.array[[orient_prev, orient_cur]] t = np.array[[0.0, 1.0]] vel = Q.quaternion_time_series.angular_velocity[R, t] ... error: [m>k] failed for hidden m: fpcurf0:m=2
Mảng bậc bốn để sửa đổi
5:slerp[R1, R2, t1, t2, t_out]
8,appending_array[shape, dtype=, initial_array=None]
7slerp[R1, R2, t1, t2, t_out]
Trục dọc theo đó các bậc bốn liên tiếp sẽ được so sánh. Giá trị mặc định là trục cuối cùng của mảng bậc bốn.
8:slerp[R1, R2, t1, t2, t_out]
8,appending_array[shape, dtype=, initial_array=None]
6minimal_rotation[R, t, iterations=2]
Nếu đúng, hãy sửa đổi dữ liệu tại chỗ mà không tạo một bản sao; Nếu sai [mặc định], một mảng mới được tạo và trả về.
Trả lại
1:squad[R_in, t_in, t_out, unflip_input_rotors=False]
2import quaternion as Q import numpy as np orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]] orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]] R = np.array[[orient_prev, orient_cur]] t = np.array[[0.0, 1.0]] vel = Q.quaternion_time_series.angular_velocity[R, t] ... error: [m>k] failed for hidden m: fpcurf0:m=2
Một mảng có hình dạng chính xác giống như mảng đầu vào, chỉ khác nhau bởi các yếu tố chính xác -1 trong một số yếu tố.
Lớp Appals_array
Trả lại
1:squad[R_in, t_in, t_out, unflip_input_rotors=False]
2import quaternion as Q import numpy as np orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]] orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]] R = np.array[[orient_prev, orient_cur]] t = np.array[[0.0, 1.0]] vel = Q.quaternion_time_series.angular_velocity[R, t] ... error: [m>k] failed for hidden m: fpcurf0:m=2
Một mảng có hình dạng chính xác giống như mảng đầu vào, chỉ khác nhau bởi các yếu tố chính xác -1 trong một số yếu tố.
minimal_rotation
minimal_rotation[R, t, iterations=2]
Nguồn: Đệ tứ/tứ kết_time_series.py
Lớp Appals_array
Thông số
Một mảng có hình dạng chính xác giống như mảng đầu vào, chỉ khác nhau bởi các yếu tố chính xác -1 trong một số yếu tố.
Lớp Appals_array
1:squad[R_in, t_in, t_out, unflip_input_rotors=False]
2import quaternion as Q import numpy as np orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]] orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]] R = np.array[[orient_prev, orient_cur]] t = np.array[[0.0, 1.0]] vel = Q.quaternion_time_series.angular_velocity[R, t] ... error: [m>k] failed for hidden m: fpcurf0:m=2
Một mảng có hình dạng chính xác giống như mảng đầu vào, chỉ khác nhau bởi các yếu tố chính xác -1 trong một số yếu tố.
Lớp Appals_array
Phương pháp
nối
slerp[R1, R2, t1, t2, t_out]
Nguồn: Đệ tứ/tứ kết_time_series.py
một
Thông số
6:a
9appending_array[shape, dtype=, initial_array=None]
Đệ tứ khi bắt đầu nội suy
8:a
9appending_array[shape, dtype=, initial_array=None]
Đệ tứ ở cuối nội suy
5:appending_array[shape, dtype=, initial_array=None]
4appending_array[shape, dtype=, initial_array=None]
Thời gian tương ứng với R1
2:angular_velocity[R, t]
4appending_array[shape, dtype=, initial_array=None]
Thời gian tương ứng với R2
4:angular_velocity[R, t]
5 củaangular_velocity[R, t]
6,angular_velocity[R, t]
4appending_array[shape, dtype=, initial_array=None]
Thời gian mà các cánh quạt nên được nội suy
Đội hình
squad[R_in, t_in, t_out, unflip_input_rotors=False]
Nguồn: Đệ tứ/tứ kết_time_series.py
Sự nội suy hình cầu "hình tứ giác" của các cánh quạt với một spline khối, đây thường là cách tốt nhất để nội suy thời gian quay. Nó sử dụng chất tương tự của một spline khối, ngoại trừ việc nội suy bị giới hạn trong đa tạp rôto một cách tự nhiên. Các phương pháp thay thế liên quan đến nội suy các tọa độ khác trên nhóm xoay hoặc bình thường hóa các giá trị nội suy cho kết quả xấu. Các kết quả từ phương pháp này có giá trị liên tục và dẫn xuất đầu tiên ở khắp mọi nơi, bao gồm cả xung quanh các vị trí lấy mẫu. Các cánh quạt
angular_velocity[R, t]
8 đầu vào được giả sử là liên tục hợp lý [không có lật dấu hiệu] và các mảng import quaternion as Q
import numpy as np
orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]]
orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]]
R = np.array[[orient_prev, orient_cur]]
t = np.array[[0.0, 1.0]]
vel = Q.quaternion_time_series.angular_velocity[R, t]
...
error: [m>k] failed for hidden m: fpcurf0:m=2
3 đầu vào được giả định là được sắp xếp. Không có kiểm tra được thực hiện cho cả hai trường hợp và bạn có thể nhận được kết quả tồi tệ nếu các điều kiện này bị vi phạm. Kích thước đầu tiên của angular_velocity[R, t]
8 phải có cùng kích thước với integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
1, nhưng có thể có các trục bổ sung sau. Hàm này đơn giản hóa cuộc gọi, so với integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
2 [có một bộ bốn bậc bốn tạo thành các cạnh của "tứ giác" và thời gian chuẩn hóa a
5] và integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
4 [có cùng một đối số, nhưng ở dạng mảng và các vòng lặp hiệu quả trên họ].Thông số
8:angular_velocity[R, t]
5 củaangular_velocity[R, t]
7integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
Một chuỗi thời gian của các cánh quạt [Đệ tứ] sẽ được nội suy
1:integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
5 củaangular_velocity[R, t]
4appending_array[shape, dtype=, initial_array=None]
Những lần tương ứng với r_in
4:angular_velocity[R, t]
5 củaangular_velocity[R, t]
4appending_array[shape, dtype=, initial_array=None]
Thời gian mà r_in nên được nội suy
4:minimal_rotation[R, t, iterations=2]
8,appending_array[shape, dtype=, initial_array=None]
6minimal_rotation[R, t, iterations=2]
Nếu đúng, chức năng này gọi
7 trên đầu vào, để đảm bảo rằng các cánh quạt liên tục hơn không. Mặc định là sai.minimal_rotation[R, t, iterations=2]
unflip_rotors
import quaternion as Q
import numpy as np
orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]]
orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]]
R = np.array[[orient_prev, orient_cur]]
t = np.array[[0.0, 1.0]]
vel = Q.quaternion_time_series.angular_velocity[R, t]
...
error: [m>k] failed for hidden m: fpcurf0:m=2
0Nguồn: Đệ tứ/tứ kết_time_series.py
Sự nội suy hình cầu "hình tứ giác" của các cánh quạt với một spline khối, đây thường là cách tốt nhất để nội suy thời gian quay. Nó sử dụng chất tương tự của một spline khối, ngoại trừ việc nội suy bị giới hạn trong đa tạp rôto một cách tự nhiên. Các phương pháp thay thế liên quan đến nội suy các tọa độ khác trên nhóm xoay hoặc bình thường hóa các giá trị nội suy cho kết quả xấu. Các kết quả từ phương pháp này có giá trị liên tục và dẫn xuất đầu tiên ở khắp mọi nơi, bao gồm cả xung quanh các vị trí lấy mẫu. Các cánh quạt
angular_velocity[R, t]
8 đầu vào được giả sử là liên tục hợp lý [không có lật dấu hiệu] và các mảng import quaternion as Q
import numpy as np
orient_prev = Q.from_float_array[[0.100846663117, 0, 0, -0.994901955128]]
orient_cur = Q.from_float_array[[0.100869312882, 0, 0, -0.994899690151]]
R = np.array[[orient_prev, orient_cur]]
t = np.array[[0.0, 1.0]]
vel = Q.quaternion_time_series.angular_velocity[R, t]
...
error: [m>k] failed for hidden m: fpcurf0:m=2
3 đầu vào được giả định là được sắp xếp. Không có kiểm tra được thực hiện cho cả hai trường hợp và bạn có thể nhận được kết quả tồi tệ nếu các điều kiện này bị vi phạm. Kích thước đầu tiên của angular_velocity[R, t]
8 phải có cùng kích thước với integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
1, nhưng có thể có các trục bổ sung sau. Hàm này đơn giản hóa cuộc gọi, so với integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
2 [có một bộ bốn bậc bốn tạo thành các cạnh của "tứ giác" và thời gian chuẩn hóa a
5] và integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
4 [có cùng một đối số, nhưng ở dạng mảng và các vòng lặp hiệu quả trên họ].Thông số
8:angular_velocity[R, t]
5 củaangular_velocity[R, t]
7integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
Một chuỗi thời gian của các cánh quạt [Đệ tứ] sẽ được nội suy
1:integrate_angular_velocity[Omega, t0, t1, R0=None, tolerance=1e-12]
5 củaangular_velocity[R, t]
4appending_array[shape, dtype=, initial_array=None]
Những lần tương ứng với r_in
4:angular_velocity[R, t]
5 củaangular_velocity[R, t]
4appending_array[shape, dtype=, initial_array=None]
Thời gian mà r_in nên được nội suy
minimal_rotation[R, t, iterations=2]
4: appending_array[shape, dtype=, initial_array=None]
8, minimal_rotation[R, t, iterations=2]
6
minimal_rotation[R, t, iterations=2]
appending_array[shape, dtype=, initial_array=None]
minimal_rotation[R, t, iterations=2]
Nếu đúng, chức năng này gọi
7 trên đầu vào, để đảm bảo rằng các cánh quạt liên tục hơn không. Mặc định là sai.minimal_rotation[R, t, iterations=2]
Các dấu hiệu lật của bậc bốn dọc theo trục để đảm bảo các bậc bốn liên tục tạo thành "nắp kép" của nhóm xoay, có nghĩa là nếu
8 biểu thị một vòng quay, thìminimal_rotation[R, t, iterations=2]
9 đại diện cho cùng một vòng quay. Điều này rõ ràng từ cách một bậc bốn được sử dụng để xoay một vectơminimal_rotation[R, t, iterations=2]
0: vectơ xoay làslerp[R1, R2, t1, t2, t_out]
1, chính xác giống như vectơ kết quả từslerp[R1, R2, t1, t2, t_out]
2. Một số cách xây dựng các bậc bốn [như chuyển đổi từ ma trận xoay hoặc các biểu diễn khác] có thể dẫn đến các lựa chọn dấu hiệu bất ngờ. Đối với nhiều ứng dụng, điều này sẽ không phải là một vấn đề. Nhưng nếu, ví dụ, các bậc bốn cần được nội suy hoặc phân biệt, kết quả có thể đáng ngạc nhiên. Hàm này lật các dấu hiệu của các bậc bốn liên tiếp [dọc theo một số trục được chọn, nếu có liên quan], do đó các bậc bốn liên tiếp càng gần càng tốt trong khi vẫn đại diện cho cùng một vòng quay.slerp[R1, R2, t1, t2, t_out]