Расчет новых углов поворота при вращении вокруг всех 3 осей - PullRequest
0 голосов
/ 10 февраля 2020

Я сейчас пытаюсь написать код, который вращает данные 3D акселерометра по осям X, Y и Z. Акселерометр отключен на 10, 5 и 25 градусов от GCS относительно оси X, Y и Z соответственно.

Проблема, с которой я столкнулся, заключается в том, что процесс не коммутативный, поэтому результаты, которые я генерирую Исходные измерения не верны. Как только данные акселерометра повернуты на первый угол, исходные измерения угла становятся неверными (я полагаю).

Можно ли рассчитать новый угол, необходимый после каждого поворота, чтобы обновить код и продолжить вращение данных?

В приведенном ниже коде я ввел значения в функцию только для иллюстрации точки в результате все выходные данные должны иметь одинаковую величину, если вектор был равноудален от каждой оси.

Любая помощь будет принята с благодарностью. Спасибо.

def rotation_matrix_3D(x_rotation_deg,y_rotation_deg,z_rotation_deg,acceleration_x_y_z):

    x_rotation_deg = np.radians(x_rotation_deg)
    y_rotation_deg = np.radians(y_rotation_deg)
    z_rotation_deg = np.radians(z_rotation_deg)

    ca,sa = np.cos(x_rotation_deg),np.sin(x_rotation_deg)
    cb,sb = np.cos(y_rotation_deg),np.sin(y_rotation_deg)
    cg,sg = np.cos(z_rotation_deg),np.sin(z_rotation_deg)

    R_x = ([[1,0,0],[0,ca,-sa],[0,sa,ca]])
    R_y = ([[cb,0,sb],[0,1,0],[-sb,0,cb]])
    R_z = ([[cg,-sg,0],[sg,cg,0],[0,0,1]])

    rotation_matrix = np.dot(np.dot(R_z,R_y),R_x)

    return np.round_(np.dot(acceleration_x_y_z,rotation_matrix),3)

rotation_matrix_3D(0,45,45,[10,0,0])

>>>> array([ 5.   , -7.071,  5.   ])
...