Я хочу получить текущую ориентацию телефона следующим способом:
- Сначала введите начальную ориентацию (азимут) через
getRotationMatrix()иgetOrientation(). - Добавьте интеграцию показаний гироскопа со временем, чтобы получить текущую ориентацию.
Ориентация телефона:
Плоскость телефона x-y фиксирована параллельно плоскости заземления. то есть находится в ориентации "texting-while-walking".
"getOrientation()" Возвраты:
Android API позволяет мне легко получить ориентацию, то есть азимут, шаг, рулон, от getOrientation().
отметить, что этот метод всегда возвращает свое значение в пределах диапазона: [0, -PI] и [o, PI] > .
Моя проблема:
Так как интеграция показания гироскопа, обозначаемого dR, может быть довольно большой, поэтому, когда я делаю CurrentOrientation += dR, CurrentOrientation может превышать [0, -PI] и [o, PI].
Какие манипуляции необходимы, чтобы я мог ВСЕГДА получать текущую ориентацию в диапазонах [0, -PI] и [o, PI]?
Я попробовал следующее в Python, но я очень сомневаюсь в его правильности.
rotation = scipy.integrate.trapz(gyroSeries, timeSeries) # integration
if (headingDirection - rotation) < -np.pi:
headingDirection += 2 * np.pi
elif (headingDirection - rotation) > np.pi:
headingDirection -= 2 * np.pi
# Complementary Filter
headingDirection = ALPHA * (headingDirection - rotation) + (1 - ALPHA) * np.mean(azimuth[np.array(stepNo.tolist()) == i])
if headingDirection < -np.pi:
headingDirection += 2 * np.pi
elif headingDirection > np.pi:
headingDirection -= 2 * np.pi
Примечания
Это НЕ так просто, потому что в нем участвуют следующие нарушители:
- Чтение датчика ориентации идет от
0до-PI, а затем ПРЯМО СУДЬБЫ до+PIи постепенно возвращается к0через+PI/2. - Интеграция чтения гирокопов также приводит к некоторым проблемам. Следует добавить
dRк ориентации или вычестьdR.
Прежде чем давать подтвержденный ответ, обратитесь к документации Android.
Оценочные ответы не помогут.