Hướng dẫn quaternion to angular velocity python - quaternion sang vận tốc góc python

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ố

  • minimal_rotation(R, t, iterations=2)
    
    8:
    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
    
    2

    Mảng bậc bốn để sửa đổi

  • slerp(R1, R2, t1, t2, t_out)
    
    5:
    appending_array(shape, dtype=, initial_array=None)
    
    8,
    slerp(R1, R2, t1, t2, t_out)
    
    7

    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

  • squad(R_in, t_in, t_out, unflip_input_rotors=False)
    
    1:
    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
    
    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ố

  • minimal_rotation(R, t, iterations=2)
    
    8:
    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
    
    2

    Mảng bậc bốn để sửa đổi

  • slerp(R1, R2, t1, t2, t_out)
    
    5:
    appending_array(shape, dtype=, initial_array=None)
    
    8,
    slerp(R1, R2, t1, t2, t_out)
    
    7

    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.

  • slerp(R1, R2, t1, t2, t_out)
    
    8:
    appending_array(shape, dtype=, initial_array=None)
    
    8,
    minimal_rotation(R, t, iterations=2)
    
    6

    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

    squad(R_in, t_in, t_out, unflip_input_rotors=False)
    
    1:
    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
    
    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

  • squad(R_in, t_in, t_out, unflip_input_rotors=False)
    
    1:
    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
    
    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

  • squad(R_in, t_in, t_out, unflip_input_rotors=False)
    
    1:
    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
    
    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ố

  • a
    
    6:
    appending_array(shape, dtype=, initial_array=None)
    
    9

    Đệ tứ khi bắt đầu nội suy

  • a
    
    8:
    appending_array(shape, dtype=, initial_array=None)
    
    9

    Đệ tứ ở cuối nội suy

  • appending_array(shape, dtype=, initial_array=None)
    
    5:
    appending_array(shape, dtype=, initial_array=None)
    
    4

    Thời gian tương ứng với R1

  • angular_velocity(R, t)
    
    2:
    appending_array(shape, dtype=, initial_array=None)
    
    4

    Thời gian tương ứng với R2

  • angular_velocity(R, t)
    
    4:
    angular_velocity(R, t)
    
    5 của
    angular_velocity(R, t)
    
    6,
    appending_array(shape, dtype=, initial_array=None)
    
    4

    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ố

  • angular_velocity(R, t)
    
    8:
    angular_velocity(R, t)
    
    5 của
    integrate_angular_velocity(Omega, t0, t1, R0=None, tolerance=1e-12)
    
    7

    Một chuỗi thời gian của các cánh quạt (Đệ tứ) sẽ được nội suy

  • integrate_angular_velocity(Omega, t0, t1, R0=None, tolerance=1e-12)
    
    1:
    angular_velocity(R, t)
    
    5 của
    appending_array(shape, dtype=, initial_array=None)
    
    4

    Những lần tương ứng với r_in

  • angular_velocity(R, t)
    
    4:
    angular_velocity(R, t)
    
    5 của
    appending_array(shape, dtype=, initial_array=None)
    
    4

    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

    Nếu đúng, chức năng này gọi

    minimal_rotation(R, t, iterations=2)
    
    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.

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
0

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ố

  • angular_velocity(R, t)
    
    8:
    angular_velocity(R, t)
    
    5 của
    integrate_angular_velocity(Omega, t0, t1, R0=None, tolerance=1e-12)
    
    7

    Một chuỗi thời gian của các cánh quạt (Đệ tứ) sẽ được nội suy

  • integrate_angular_velocity(Omega, t0, t1, R0=None, tolerance=1e-12)
    
    1:
    angular_velocity(R, t)
    
    5 của
    appending_array(shape, dtype=, initial_array=None)
    
    4

    Những lần tương ứng với r_in

  • angular_velocity(R, t)
    
    4:
    angular_velocity(R, t)
    
    5 của
    appending_array(shape, dtype=, initial_array=None)
    
    4

    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

  • Nếu đúng, chức năng này gọi

    minimal_rotation(R, t, iterations=2)
    
    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.

    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

    minimal_rotation(R, t, iterations=2)
    
    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ơ
    slerp(R1, R2, t1, t2, t_out)
    
    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.