Я хочу получить текущую ориентацию телефона следующим способом:
- Сначала введите начальную ориентацию (азимут) через
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.
Оценочные ответы не помогут.