Я работаю с 3-осевым гироскопом и хотел бы интегрировать данные о скорости, чтобы определить ориентацию моего гироскопа как функцию времени. Гироскоп скорости измеряет мгновенный вектор вращения, который можно превратить в небольшое вращение dR ~ w*dt. Базовую интеграцию можно выполнить, отслеживая текущее вращение R и применяя мгновенное dR на каждом временном шаге. Я написал функцию Python, которая делает это:
Код: Выделить всё
from scipy.spatial.transform import Rotation as R
def rate_int_py(gyro_rates, R0, dt):
R_curr = R0
out = list()
for i, w in enumerate(gyro_rates):
dR = R.from_rotvec(np.deg2rad(w * dt))
R_curr = dR * R_curr #note left mult
out.append(R_curr)
return R.concatenate(out)
Однако эта функция не особенно быстра, и я надеялся получить большую скорость «numpy», а не скорость «Python». Я попытался сделать это с помощью numpy.cumprod, но получил немного другой ответ. Я считаю, что проблема в том, что композиция вращения не является коммутативной, и cumprod накапливает «вправо», а не влево, умножая текущее вращение на следующий dR. Вот код этой попытки:
Код: Выделить всё
from scipy.spatial.transform import Rotation as R
import numpy as np
def rate_int_scipy(gyro_rates, R0, dt):
rots = R.from_rotvec(gyro_rates*dt, degrees=True)
rots = R.concatenate([R0] + list(rots))
res = np.cumprod(rots, axis=0)
res = R.concatenate(res)
return res[1:]
В любом случае эта попытка была спорной, поскольку numpy при воздействии на неродные типы numpy по умолчанию использует «обычный» Python, и поэтому эта функция в любом случае работает медленнее, чем нативная функция Python.
Как люди работают с данными гироскопа в Python? Я не думаю, что мой вариант использования вообще нишевый. В итоге я написал программу на C, которая делала то, что мне нужно, но я бы предпочел использовать чистый Python.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... ith-python