23.12.2017

Акселерометр

На самом деле, первым моим желанием было написать не кренометр, а акселерометр, что бы замерять ускорение с места, с 0 до 100 км/ч.
Дело в том, что пару лет назад (о, как время-то летит) я прикупил себе маленький кроссовер, Tiguan. А автопроизводители, как известно, барыги жадные, вовсю используют ценовую дискриминацию для того, что бы максимизировать прибыль. Например, за порт USB в мультимедиа-системы некоторые просят доплатить 10 тыс. рублей или больше.
Или за форсирование двигателя просят несколько сотен тысяч рублей. Ну, то есть физически двигатель один и тот же, меняется только константы в блоке управления (может быть, и сам алгоритм в каких-то случаях, но мне известно только про данные). Разница в мощности одного и того же дефорсированного двигателя и его самой мощной модификации может составлять в районе сотни л.с., а разница в ценнике - в несколько сотен тысяч рублей. Это вот как раз мой случай.
Ну, а коли изменение параметров двигателя меняется так легко, то (спрос рождает предложение) появились мелкие конторки, которые за гораздо меньшую сумму, чем автопроизводитель, меняют прошивку в блоке управления двигателем на более мощную. Естественно, именно так я и поступил.
Не менее естественно, мне было интересно, реально ли были внесены изменения в прошивку или я заплатил деньги за воздух? Проще всего проверить это можно, замерив разгон до 100 км/ч. Если разгон занял меньше времени, чем по заводским характеристикам, значит, прошивка прошла успешно.
Понятно, что первым делом я выполнил такой замер, правда, вручную. Ручной замер показал, что прошивка прошла удачно. Одновременно с этим (банально, да?), выяснилось, что вручную замерять очень не удобно, соответственно, страдает точность измерений. Захотелось написать программку для замера ускорения, но так получилось, что сначала я сделал кренометр.
Но оно и к лучшему. Дело в том, что пользуясь калибровочной информацией кренометра можно очень точно получить информацию о момента начала заезда. Это можно сделать, во-первых, автоматически, а во-вторых, гораздо точнее, чем при использовании данных GPS.
Вот один из последних результатов, полученных при проверке готовой версии:
По-моему, неплохой результат, с учетом того, что он был получен на зимней шипованной резине при температуре +8 и на мокром асфальте. Заводские данные для дефорсированного мотора - 9.9 сек. Летом повторю заезд в сухих условиях и на нормальной резине. По идее, должен выехать из 8.5 сек, так это время соответствует 200 л.с., а у меня, теоретически, должно быть 239.
Теперь об особенностях разработки акселерометра. Основная проблема - получение точных данных. Несколько моментов:
1. GPS координаты могут быть очень неточны. Например, в условиях плотной застройки точность может быть около 5 м. Это значит, что с вероятность 68% реальное местонахождение находится в окружности радиусом 5 м вокруг переданных системой GPS координат. И с вероятностью 32%, что за пределами этого радиуса. Максимальная точность, что удавалось мне получить на моем смартфоне - 2 м. И если для больших скоростей (и больших перемещений за единицу времени) такая погрешность относительно не высока, то для медленных перемещений может приводить к совершенно не корректным результатам.
Вертикальная точность может быть еще хуже. Например, при отладке приложения я прошел пешком около 20-30 минут, от Октябрьского по Дружбе до Тольятти и далее в сторону Кирова. Так данные GPS показали, что за это время по высоте я переместился на несколько сотен метров, хотя реальный перепад высот не превышает и 10 метров.
Но в этом отношении есть и хорошая новость. С 2018 года некоторые смартфоны будут оснащаться новыми GPS-приемниками, которые принимают сигнал L-5, что повысить точность даже в условиях плотной застройки до нескольких десятков сантиметров.
2. Частота опроса GPS-приемника у большинства смартфонов не превышает 1 Гц. Для замера ускорения достаточно медленных машин, с разгоном более 10 сек. проблем тут особых нет. А вот если разгон занимает меньше 5-6 сек, то точность уже оставляет желать лучшего. Попытался найти смартфоны, которые могут возвращать данные GPS чаще, но найти их не смог. Но знаю, что есть профессиональные GPS-приемники, которые выдают сигнал 5 и 10 раз в секунду. Их периодичности будет вполне достаточно для автомобильного акселерометра даже в случае спортивного автомобиля.

Для более точного определения скорости я сначала планировал аппроксимировать траекторию автомобиля с помощью полинома. У меня есть серьезные основания полагать, что такой подход даст более точные результаты. Однако он усложняет автоматическое определение завершение заезда и повышает требование к торможение.
Поэтому пока остановился на самой простой схеме. Скорость определяется по левым производным по узлам траектории, а точное значение в заданных точка (40, 60, 80, 90, 100, 200 км/ч) - линейным приближением между рассчитанными скоростями в узлах.
Может быть, имеет смысл перейти на центральные производные, вроде бы у них меньше погрешность. Однако не понятно, даст ли это существенное улучшение при столь крупном шаге по времени.


06.12.2017

Кренометр

Как-то у одного френда в бложике увидел загадочную штуковину на торпеде с двумя круглыми шкалами-индикаторами. Поинтересовался у него, что это такое. Оказалось - кренометр.
Короче, такой приборчик, который замеряет крен и тангаж автомобиля в процессе движения. На самом деле при движении по шоссе вообще не нужен. А вот при движении вне дорог может пригодиться. Что бы ненароком не сделать уши перевернуться. Хотя опытные джиперы говорят, что настоящим профессионалам такие приборчики вообще ни к чему, у них отменные опыт и интуиция. 😉
У меня у самого скромненький паркетник, тем не менее, бывает, езжу по всяким буеракам. И реально не очень понимаю, не перевернется ли машина на сильном уклоне. Поэтому решил, что для меня кренометр - вещь полезная.
Посмотрел, таких приборчиков вагон и маленькая тележка, да и стоят не дорого. Но надо как-то их крепить, да и место занимают, а у меня и так там наставлено: радар-детектор, видеорегистратор, ну и иногда смартфон в качестве навигатора.

О! У меня же смартфон! А из него можно сделать отличный кренометр. 😀 В общем, решил запилить кренометр своими руками.
Сначала, по привычке, пытался писать на Delphi под Android. Но очень скоро понял, что это - совсем не торт. Поэтому перешел на нативный инструмент - Android Studio.

В общем, долго-долго я с ним возился, сделал более-менее рабочую версию. Думаю, дай-ка закину ее в Google Play. Зашел туда, глянул, а там - мама моя дорогая - этих кренометров/inclinometers каких только нету. И платных, и бесплатных, и с рекламой и без нее... Все такие красивые, с продвинутым интерфейсом и работают получше моего, похоже.
Но, тем не менее, закинул, пусть лежит.

В общем, основная проблема, с которой я столкнулся при разработке, это сглаживание данных с акселерометра. Дело в том, что ДВС нехило так вибрирует при работе. Гибкий подвес смартфона может частично гасить вибрации, а может и наоборот, войти в резонанс и добавить еще своих чуток. Жесткий попроще, но все  высокочастотные помехи от двигателя ловит только так.
Когда я разрабатывал свой кренометр, еще про фильтры особо ничего не знал, решил зайти со стороны сглаживания и сейчас использую для фильтрации данных двойное экспоненциальное сглаживание.
На самом деле скорее такое сглаживание относится к прогнозированию временных рядов. Но, пожалуй, слегка похоже на рекурсивный низкочастотный фильтр. А особенностью всех достаточно сильных фильтров является появление серьезных фазовых искажений. Вот и мой сглаживающий фильтр слегка отстает по фазе от реальной дороги.
Впрочем, когда передвигаешься по дороге с серьезным поперечным уклоном, то едешь медленно, там эта фазовая задержка не так заметна.
В общем, пока думаю, как ее побороть, идеи имеются, главное, как-нибудь добраться до их проверки и реализации.

Кстати, очень интересны всякие датчики в смартфонах, можно собирать и обрабатывать данные и что-нибудь с ними делать. Что  касается акселерометра, то он меня с одной стороны удивил своей чувствительностью, а с другой - своей неточностью.
В частности, вектор гравитации по длине может превышать 10 м/с2, а с другой стороны, его длина еще зависит от ориентации смартфона относительно поверхности Земли. Хотя, возможно, это особенность лишь моего экземпляра.