-
Notifications
You must be signed in to change notification settings - Fork 111
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Cannot get sync state #73
Comments
Привет! Да, медленное мигание значит нет фикса. У модуля есть дебаг-режим, см вот здесь небольшое описание: #65 (comment) (и ниже по треду). |
Добрый день, Хотя данные вроде как уже выглядят лучше CyclePhaseClassifier: fix 16, phase 0, pulse_base_len 57.686787, history 0xcccccccc, avg error 1.1 us А комманды Не подскажите в чем может быть проблема ? |
ANG0 54069 200 <-- kCycleSynced = 200 - значит синхронизационные импульсы мы видим, а позиционные - нет. Вот здесь видно что импульсы все длинные (len = 50-150 мкс): Возможно threshold нужно сделать поменьше или станции поближе подвинуть. Удачи! |
Спасибо, весьма полезные замечания, благодаря этим им, мне удалось найти положение в котором появились короткие импульсы. В начале у одной станции, а после уменьшения дистанции между станциями в два раза получилось даже получить какую то позицию. Она походу уже валидная ? ANG0 822502 200 -0.0083 -0.3788 0.0626 -0.4191 Вопрос кроме трешолда что еще можно сделать что бы возможно было увеличить дистанцию ? |
Я нацепил гирлянду из светодиодов в (9 штук) и получилось таки расширить пятно в котором датчик получает данные с баз, но дистанция от базы варирует метр полтора, поэтому можно получить либо с одной базы либо с другой. А вот совместить их вместе пока не получилось. |
Логика классификации импульсов на короткие и длинные вот здесь https://github.com/ashtuchkin/vive-diy-position-sensor/blob/master/src/pulse_processor.cpp#L44 Все импульсы до 40мкс - короткие, от 40 до 300 - длинные. Но если импульсов нет в "sensor0 impulses show", то проблема раньше, надо смотреть какие входы используются и как. У Teensy есть два варианта входов - компаратор (с threshold) или обычный таймер, можно попробовать переключить на другой вариант и попробовать. Но в целом я думаю проблема в другом. Мне кажется нужно смотреть схематику фотодиода/усилителя - 16 мкс это слишком много для лазерного луча, не может он так рассеиваться. А вот фотодиод или усилитель может иметь нежелательный RC контур (сопротивление/ёмкость), такой, что сигнал "сглаживается" и вместо четкого короткого импульса получается длинный и гораздо слабее. На осциллографе это было бы хорошо видно. Я сам когда эту схему делал много экспериментировал с сопротивлениями и конденсаторами, чтобы получить хорошую чувствительность. Думаю с китайскими компонентами это нужно заново делать. Если не хочется этим заниматься, есть уже настроенные модули с гораздо большей чувствительностью - TS3633-CM1, если есть возможность их заказать то рекомендую. |
https://github.com/nairol/LighthouseRedox/blob/master/docs/Light%20Emissions.md С сигналом я поработал, форма получилась вполне хорошая, почти идеальная на больших импульсах хорошо видно, А насчет коротких импульсов я их заставил ходить весьма варваским ковырянием кода constexpr TimeDelta short_pulse_min_time = angle_center_len - cycle_period / 3; Только пока не разобрался, если синхроимпульс может быть таким большим как его сюда правильно стоило бы оформить ? |
Да, так и есть с таким набором параметров, вероятно конечно он не правильный, но мне удалось впервые получить правдоподобные координаты, при условии что базовые станции находятся на 5м друг от друга , правда пока только в определенных местах, почему то лучше работает по краям базовых станций. А центр почему то не охотно. constexpr TimeDelta min_long_pulse_len(70, usec); constexpr TimeDelta long_pulse_starts_accepted_range(72, usec); constexpr TimeDelta cycle_period(8333, usec); // Total len of 1 cycle. OBJ0 664579 1000 0.7672 0.0337 -1.7219 3.7041 OBJ0 664979 500 |
О другом - там 3 импульса должны регистрироваться каждый цикл (8333 мкс):
В коде я называю первые 2 импульса "long pulses", третий - "short". Не уверен что изменения в коде помогли - мне кажется они скорее делают так что второй импульс распознается как третий. Импульсы которые указаны выше мы можем классифицировать вот так:
Что мы видим здесь: По поводу изменений в коде: constexpr TimeDelta long_pulse_starts_accepted_range(72, usec); constexpr TimeDelta cycle_period(8333, usec); // Total len of 1 cycle. Почему /3? Внутри базовой станции лазеры вращаются синхронизировано с циклом 8333 мкс. За один цикл они делают 180 градусов поворот, причем так, чтобы в t0+4000 лазер светил прямо по центру. Т.к. светит станция на 120 градусов вперед (-60 до +60), то мы рассчитываем минимальную и максимальную позицию импульса в цикле как (4000 - 8333 * 60 / 180) и 4000 + (8333 * 60 / 180). Из этого и происходит cycle_period / 3. Побочный эффект этой проверки в том, что синхроимпульсы не конфликтуют с позиционным импульсом: short_pulse_min_time = 1222 мкс, больше чем 420 + max_long_pulse_len. Далее, вот это кажется как будто фикс, но скорее всего нет, т.к. последнее значение слишком большое. Это расстояние между рассчитанными линиями от базовых станций, в метрах. Это значение примерно показывает точность определения координат и должно быть ~0.01. |
Да, похоже Вы абсолютно правы, |
Рад был помочь, удачи! |
Добрый день, подскажите пожалуйста как отдебажить сенсор.
Я выставляю порог (threshold) на уровне 36, поскольку в указанной схеме ноль после усиления почему то не получается получить. И сигнал с базовых станций начинает читаться, декодер фрейма, выдает какие то циферки, которые меняются если передвигать сенсор. Но светодиод все равно мигает с интервалом в одну секунду.
По коду насколько понимаю это сигнализирует что лок станций не произошел и сама позиция не доступна.
Что можно еще ткнуть что бы понять что подправить ?
Благодарю.
The text was updated successfully, but these errors were encountered: