Dudarion

Dudarion

Люблю все, что связано с технологиями, наукой. Инженер. https://www.instagram.com/dudarion t.me/dudarion
Пикабушник
15К рейтинг 656 подписчиков 0 подписок 12 постов 8 в горячем
20

Как создается электроника

В этом видео мы с нуля разработаем и изготовим несложное электронное устройство. Исходники платы, кода и 3д моделей на гитхабе: https://github.com/Dudarion/BLE_wheel.git

124

Самое понятное объяснение парадокса близнецов

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

В комментариях к моей предыдущей статье и в комментариях к ролику было много вопросов и некорректных замечаний по поводу парадокса близнецов. Как оказалось, мое объяснение оказалось не настолько понятным, как я надеялся, поэтому в этой статье я решил максимально наглядно, подробно и последовательно объяснить парадокс близнецов и ответить на некоторые другие вопросы.

Для иллюстраций и анимаций я написал интерактивный браузерный визуализатор, где можно двигать ползунки, менять режимы и наблюдать за преобразованиями Лоренца.

Кратко напомню суть парадокса

Берем двух близнецов, сажаем их на маленькую легкую планету (легкую, чтобы не учитывать влияние гравитации), одного оставляем неподвижным, а второго запускаем на ракете полетать и вернуться обратно. При их встрече оказывается, что летавший близнец постарел меньше, чем неподвижный.
Парадокс заключается в том, что неочевидно почему именно у летавшего время текло медленнее. Ведь, вроде бы, ситуация симметричная: в системе отсчета летавшего это планета с неподвижным близнецом полетала и вернулась, и это у них должно было натикать меньше времени.

Парадокс близнецов очень важен, т.к. это самый наглядный способ увидеть, что релятивистский эффект замедления времени не просто математический артефакт специальной теории относительности или иллюзия, а вполне реальное физическое явление.

Попросим бегущего кота пробежать вправо со скоростью 75% скорости света, потом развернуться и прибежать с той же скоростью назад.
Вот визуализация на диаграмме (по вертикали ось времени, по горизонтали - пространства):

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

На ней видно, что у бегущего кота натикало меньше времени, чем у неподвижного, но непонятно почему.

Чтобы понять что происходит с каждым из близнецов, нужно посмотреть на ситуацию от лица каждого из них.

Напомню, что в специальной теории относительности при изменении скорости наблюдателя, точки на диаграмме сдвигаются не только вдоль оси пространства, но еще и вдоль оси времени. Отсюда неизбежно вытекают все релятивистские эффекты (замедление времени, сокращения длин, относительность одновременности).

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

Слева классическое преобразование Галилея, справа - преобразование Лоренца, которое пришло ему на смену. Желтые прямые иллюстрируют скорость света в обоих направлениях.

Подробнее о том, почему так происходит, я рассказывал в предыдущей статье и видео.
Если коротко, то все дело в том, что, согласно экспериментам, один и тот же "пучок" света летит со скоростью 299 792 458 м/с относительно любого наблюдателя. Независимо от того, как быстро и в каком направлении этот наблюдатель движется относительно источника этого света. Иначе говоря, как бы быстро ты ни двигался, свет все равно улетает от тебя со скоростью света.

Этот факт противоречит привычному преобразованию Галилея:

Допустим, мы бежим на коте с огромной скоростью (30% скорости света). Затем мы с поверхности этого кота выбегаем на еще одном коте с такой же скоростью относительно первого кота. Потом делаем так же еще три раза.

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

В привычном Галилеевском мире получается, что расстояния между котами в каждый момент времени одинаковы, а от первого мы удаляемся быстрее, чем со скоростью света (тут скорость света показана бордовым).

Чтобы примирить факт постоянства скорости света с физикой, пришлось изменить преобразования Галилея (где при изменении скорости наблюдателя, точки на диаграмме смещаются горизонтально) и превратить их в преобразования Лоренца (где точки сдвигаются еще и во времени, ассимптотически приближаясь к линии скорости света). Кстати, математически это является вращением в 4-хмерном пространстве-времени с метрикой Минковского.

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

Обратите внимание на синие и красные отрезки. В Галилеевском варианте сохраняются их длины, которые считаются как(по теореме Пифагора), а в Лоренцевом - сохраняется интервал, который считается как (метрика Минковского).

Можно сколько угодно раз делать трюк с котом, но первый кот никогда не достигнет бордовой линии. Его линия будет лишь ассимптотически к ней приближаться и растягиваться. Сам свет, при этом, летит со скоростью света относительно любого из котов.

Итак, вернемся к парадоксу близнецов

Представим, что один близнец сидит на Земле, а второго мы попросили слетать в соседнюю галактику и вернуться. Пускай галактика находится на таком расстоянии, чтобы по часам подвижного близнеца на всё путешествие ушло 8 секунд.

Начнем с неподвижного близнеца на Земле:

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

Тут все просто. Мы ждем 8 секунд и ничего не происходит.

Теперь рассмотрим ситуацию от лица движущегося близнеца.

1) Сначала мы быстро набираем скорость (ускоряемся очень быстро, поэтому мы еще не успели пролететь значимое расстояние).

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

Видно, что время на галактике сместилось в будущее на 6 с лишним секунд. Но мы этого сразу не заметим, ведь это смещение времени увеличивается постепенно вдоль оси от нас к галактике.

График набега времени:

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

А еще расстояние до галактики уменьшилось (до ускорения между Землей и галактикой было 7 клеток, а стало ~3.5) и ход времени в галактике для нас замедлился (вертикальное расстояние между соседними изображениями галактики стало больше).

В этот момент летящему близнецу недоступна информация о том, что время на галактике сместилось в будущее и что расстояние уменьшилось. Ведь он видит только то, что непосредственно достигло его глаз.

Чтобы не было сомнений, что все по честному, все сдвиги точек на диаграмме происходят только по формулам преобразований Лоренца (это можно проверить по исходникам визуализатора).

Итак, скорость набрана. Теперь летим с этой скоростью пока не достигнем галактики. На это уйдет 4 секунды (для этого я добавил в визуализатор ползунок "Wait"):

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

Пока мы летели мы собирали этот ускоренный и сжатый свет от галактики и по ходу движения наблюдали ее эволюцию в быстрой перемотке. В итоге, в точке назначения мы видим, что по нашим часа прошло 4 секунды, а на галактике - 8.

Важный момент: Мы летим к галактике, поэтому ее время для нас замедлено. Но глазами мы видим ее наоборот ускоренной, потому что собираем испущенный от нее сплющенный свет. Иначе говоря, расстояние до галактики скукожилось сильнее, чем замедлилось ее время.

Теперь осталось развернуться, с такой же скоростью полететь обратно на Землю:

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

И остановиться:

Самое понятное объяснение парадокса близнецов Физика, Наука, Космос, Специальная теория относительности, Теория относительности, Парадокс близнецов, Релятивизм, Замедление времени, Время, Научпоп, Вселенная, Астрофизика, Гифка, Длиннопост, Кот

Что мы в итоге видим? Пока подвижный близнец бегал 8 секунд, у неподвижного прошло 16.

Когда подвижный близнец летит без ускорений, ситуация симметричная. Каждый из них считает, что время замедлено у другого. Но именно во время ускорений подвижного близнеца "съедается" время неподвижного, что можно видеть на анимациях.

Итог: Парадокс близнецов разрешен тем, что ускорение одного из котов вносит асимметрию в систему и приводит разнице их возраста. Этот эффект действительно существует, он измерен экспериментально и явно следует из преобразований Лоренца, как и все остальные релятивистские эффекты специальной теории относительности.

Нужна ли общая теория относительности для объяснения парадокса близнецов?

Нет, ОТО нужна там, где нужно учитывать гравитацию. В нашем случае в этом нет необходимости.

Визуализатор

Проект на гитхабе

Спасибо за внимание!

Показать полностью 11
46

Самое понятное объяснение Специальной теории относительности

Специальная теория относительности - удивительная теория, которая опровергла многие представления о мире, в которых человечество не сомневалось всю историю своего существования. Многие слышали про волшебства вроде замедления времени, сокращения длины, относительности одновременности, парадокса близнецов и т.д., но мало кто понимает почему так происходит.

Я потратил много времени на чтение статей и просмотр видеороликов, но все это не давало мне понимания, а лишь запутывало и вызывало новые вопросы. Многие материалы противоречат друг другу, некоторые вообще транслируют откровенную дезинформацию. Да, можно придерживаться принципа “Shut up and calculate” и просто пользоваться формулами преобразования координат из учебников, но мне хотелось получить более интуитивное понимание процессов. Все же теория относительности - не квантовая механика, ее должно быть возможно понять.

После долгого изучения, я смог отфильтровать и объединить разрозненную информацию в единую картину. Оказалось, все не так сложно, и сейчас я хочу поделиться результатом в формате видео.

Все цитаты ученых и исторические события намеренно искажены для упрощения повествования.

Для иллюстраций я написал интерактивный визуализатор СТО, работающий в браузере.

Ссылка на него: https://dudarion.github.io/Interactive-Minkowski-diagram/

Ссылка на исходники: https://github.com/Dudarion/Interactive-Minkowski-diagram

Показать полностью 1
5

Как мы внедрили GPT-4 в несколько сфер компании и научили его отвечать на специфичные вопросы

Меня зовут Дмитрий Дударев, я технический директор в компании, которая занимается разработкой медицинских VR симуляторов.
Статья написана кожаным мешком, желающим поделиться опытом автоматизации некоторых сфер компании с помощью ИИ.

Переводы с контекстом

Внутри симуляторов происходят обследования, диагностика и лечение виртуальных пациентов. Все это сопровождается тоннами медицинских текстов с диалогами, историями болезней, результатами анализов и тд. Для управления этими данными у нас есть свой веб сервис, где медицинские эксперты могут создавать новые сценарии и редактировать контент. Тексты должны быть переведены на восемь разных языков и все это осложняется постоянно обновляющимися данными.

Раньше для переводов мы использовали аутсорс переводчиков и системы краудтранслейтинга, где множество неизвестных людей в специальном онлайн сервисе накидывалось на куски текстов и переводили это за большие деньги и с кучей ошибок (после переводов данные проверяюстся мед экспертами - носителями языков).

А потом появился chatGPT, поразивший меня своими возможностями. Он сходу умеет переводить тексты лучше существовавших до него специализированных нейросетей - переводчиков, и, в отличие от них, способен еще и учитывать контекст.
Я сразу купил API и сделал телеграм бота для предварительного тестирования (API OpenAI в России пока работает без VPN). Результаты превзошли все ожидания. Мы использовали бота не только для переводов, но и для придумывания новых текстов вроде имен пациентов и их ответов на некоторые вопросы.

Как мы внедрили GPT-4 в несколько сфер компании и научили его отвечать на специфичные вопросы Технологии, Полезное, Программирование, IT, Разработка, Искусственный интеллект, ChatGPT, Инновации, Python, Openai, Telegram, Длиннопост

Следующим шагом мы встроили интерфейс нейронки в наш веб сервис и теперь можем нажатием одной кнопки перевести все десятки тысяч строк текста на 8 языков.

Конечно, задача переводов текстов для медицинских симуляторов очень ответственная. Мы не хотим, чтобы запись в виртуальную карту пациента из "неоформленный стул" превратилась в "undecorated chair", поэтому для каждого типа данных мы указываем контекст. Для диалогов, например, в начало каждого запроса добавляется текст:

Переведи следующе ответы пациента на вопросы доктора на арабский язык. Каждая строка - новый ответ. Сохраняй форматирование.

Конечно, критические вещи проверяются медицинскими экспертами, но от огромной части работы нейронка нас освободила.

Оператор техподдержки

В целом, с переводами все просто. Гораздо более интересно применение нейронки в качестве оператора техподдержки, способного работать 24/7 на любых языках, отвечать мгновенно и знать все тонкости наших проектов и способы разрешения технических проблем.

Для того, чтобы GPT мог отвечать на вопросы, специфичные для наших продуктов, нужно ему как-то скормить тонну текстов документаций, инструкций и траблшутингов. Для этого есть три способа:

1. Prompt-engineering.

Заключается, как и в задаче с переводами, в добавлении в начало каждого запроса все необходимые текстовые данные. Очевидно, при таком способе мы сразу упремся в максимальную длину контекста (обычно это 4096 токенов) или в 0 на банковском счету.

Токен - структурная единица текста, которой оперируют модели. Оплата так же производится за количество токенов как в запросах, так и в выдаче. Один токен примерно равен 3/4 слова.

2. Fine-tuning.

Это механизм дообучения нейронки, в котором меняются сами веса модели. Вы предоставляете ей множество примеров "запрос - ответ" и она учится их использовать уже без добавления контекста в каждый запрос. Для этого у OpenAI есть специальный API. Такой подход первым бросился мне в глаза, но у него есть недостатки:

  • Есть сложности с дообучением при изменениях в документах.

  • Предназначен не столько для накопления базы знаний, сколько для приобретения навыков общения.

  • Тоже стоит денег.

3. Использование LlamaIndex.

Это нечто среднее между первыми двумя вариантами. LlamaIndex - это система, которая может прочитать один раз кучу ваших документов и с помощью OpeanAI API создать индекс файл, содержащий ваши данные в виде векторов. Этот файл создается один раз и позволяет по запросу на естественном языке вытащить необходимый кусок текста, который далее можно скормить GPT в качестве начальной информации. Т.е. вместо того, чтобы в начало каждого сообщения от клиента добавлять все гигабайты ваших документов, вы можете добавить только маленький нужный кусок данных, связанный с вопросом клиента. Ну и плюс еще предыдущие сообщения для удерживания контекста.

Использовать LlamaIndex проще некуда:

Как мы внедрили GPT-4 в несколько сфер компании и научили его отвечать на специфичные вопросы Технологии, Полезное, Программирование, IT, Разработка, Искусственный интеллект, ChatGPT, Инновации, Python, Openai, Telegram, Длиннопост

Итого после прихода сообщения от пользователя можно сформировать запрос нейронке, соединив несколько частей:

  1. "Ты специалист техподдержки в компании ***. Компания занимается разработкой медицинских VR симуляторов. Вежливо отвечай на вопрос клиента на том же языке, на котором он говорит. Отвечай точно, не придумывай лишнего. В случае затруднения отвечай что позовешь специалиста.
    Ниже представлена информация о наших продуктах:"

  2. Информация, полученная из индекс файла в ответ на сумму последних нескольких сообщений в чате

  3. Сумма последних нескольких сообщений в чате

Подход оказался удивительно эффективным. Бот отвечает корректно на нужном языке и в полном соответствии с нашими документами. В случае сомнений нейронка говорит, что позовет оператора, что по ключевому слову "оператор" отслеживается ботом и передается уведомление уже нашим биологическим операторам.

Как мы внедрили GPT-4 в несколько сфер компании и научили его отвечать на специфичные вопросы Технологии, Полезное, Программирование, IT, Разработка, Искусственный интеллект, ChatGPT, Инновации, Python, Openai, Telegram, Длиннопост

Общие мысли о GPT

GPT - всего лишь языковая модель, обученная продолжать текст, но для успешного продолжения текста нужно иметь в голове глубокое понимание взаимосвязей между сущностями. Да, у нейронки пока нет визуальных, аудиальных, тактильных и других дополнительных ассоциаций со словами, но это не мешает ей уже сейчас уметь прикидываться человком с ограниченным объемом знаний и индивидуальными чертами характера.

GPT показал удивительную эмерджентность, когда количество переходит в качество. С повышением количества параметров умения росли скачкообразно:

Как мы внедрили GPT-4 в несколько сфер компании и научили его отвечать на специфичные вопросы Технологии, Полезное, Программирование, IT, Разработка, Искусственный интеллект, ChatGPT, Инновации, Python, Openai, Telegram, Длиннопост

Сами разработчики уже во всю заявляют о скором выходе действительно сильного искусственного интеллекта. Не знаю пока радоваться этому событию или сожалеть о грядущей утере какой либо ценности человеческих мозгов, но нас определенно ждет новый мир!

Показать полностью 4
246

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3

Очередной этап разработки гитары завершен и мы наконец запустили кампанию на Кикстартере!

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

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

Изготовление механической части заняло практически все время, было очень сложно. Но результат оказался достойным. Для изготовления использовалось множество техпроцессов: 3д печать разными пластиками с покраской, фрезеровка и анодирование алюминия, нанесение маркировки, литье и overmolding силикона.

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост
Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

Все заявленные в предыдущей статье функции удалось реализовать. Мы собрали очень много фидбека по UX, так что однозначно будут изменения в конструкции в случае успешного краудфандинга. Они коснутся расположения кнопок, распределения масс, чувствительности датчиков, надежности подпружиненных контактов и узла сгибания.

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

В результате работы над софтовой частью и приложением появилось несколько новых режимов:


Режим игры по табулатурам

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

В этом режиме можно выбрать песню из списка табулатур, после чего гитара будет показывать диодами как ее играть. На каждом шагу она ждет правильного выполнения и переходит к следующему. Приложение оценивает правильность игры и выдает баллы в конце.

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

Также можно создавать свои собственные табулатуры и мы даже сделали для этого специальную клавиатуру для ввода символов. В будущем планируем подключить парсинг стандартных табулатур Guitar Pro и облачную библиотеку. Предстоит большая работа с лицензиями на них. Если у кого-то из читателей есть опыт в вопросах лицензий, будем благодарны консультации.


Режим упрощенной импровизации

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

Этот режим импровизации оказался очень удачным. Благодаря подсвечиванию на грифе гитары связанных друг с другом нот (гамма или пентатоника), которые хорошо сочетаются друг с другом, пользователю не нужно тратить месяцы на изучение музыкальной теории. Достаточно просто выбрать нужную тональность на гитаре или в приложении. При желании неподходящие ноты могут быть вообще проигнорированы системой. Тогда на гитаре будет просто невозможно сыграть неправильные ноты.

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

Режим импровизации с помощью ИИ


Но мы захотели пойти дальше и сделать режим еще более простой импровизации. Задумка в том, чтобы даже случайное перебирание струн и ладов приводло к адекватной приятной мелодии в рамках выбранного жанра, причем характер перебирания нот влиял на темп и характер выдаваемой мелодии.


Один из вариантов решения задачи - использование нейронной сети, обученной на базе множества midi файлов внутри заданного жанра.


Пока этот режим будет работать только в нашем приложении, но если соберем достаточную сумму, то, может быть, поставим в гитару stm-ку пожирнее и засунем нейронку в нее.
Мы только в начале пути разработки этого режима. Если среди читателей Хабра есть специалисты по нейронным сетям, генеративной музыке или теории музыки, желающие поучаствовать в проекте, прошу написать мне.


Встроенный синтезатор


К встроенному в гитару jack 3.5мм можно подключить наушники или портативную колонку и играть без подключения к внешним устройствам. Встроенный звук, конечно, не ахти, но содержит более 70-ти инструментов от пианино и гитары до барабанов, органа и даже пистолетных выстрелов. При этом ничего не мешает подключить к телефону или компу и записывать миди параллельно.


Вибрато/бенды


Для полноценной игры многим не хватает поддержки таких гитарных техник, как бенды и вибрато. Я наивно думал, что можно использовать модуляцию питч бенда наклоном гитары по акселерометру, но привычные движения рукой это не заменит. Поэтому я решил встроить в гриф датчики силы и интерпретировать изменение силы нажатия на лады как натягивание струн поперек грифа и сдвигать pitch соответствующей струны.


Так что теперь можно забиндить наклон гитары к другим эффектам.


Режим драм машины


Теперь гитару можно положить на стол и настукивать биты на грифе прямо как на midi контроллерах. Осталось адаптировать корпус гитары так, чтобы он не шатался на плоском столе.

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

Режимы тренажера и обучения в игровой форме


Для изучения нот, аккордов, гамм и отработки мануальных навыков можно включить режим тренажера или аркадную игру в стиле Guitar Hero.

Как я учился играть на гитаре, а в итоге создал свою цифровую. Часть 3 Своими руками, Технологии, Музыка, Гитара, Электроника, Гаджеты, Arduino, Разработка, Стартап, Kickstarter, Краудфандинг, Midi, Гифка, Видео, YouTube, Длиннопост

Также за это время мы сняли финальное промо видео:

Мы только что запустили кампанию! Кому интересно следить за новостями проекта или оформить предзаказ – прошу пожаловать на Kickstarter и на наш сайт Sensy. Впереди еще очень много работы и мы надеемся на вашу поддержку.


Спасибо за внимание! Буду рад обратной связи в комментариях.

Показать полностью 10 1
15

Философия глазами технаря

Я технарь и сильно увлекаюсь естественными науками.

Периодически в разговорях с людьми всплывает тема философии (как академической области) и ее роли в познании мира.


При этом никто не может сказать чем именно занимается современная философия и какие практические или теоретические результаты она дает.


Изучив наиболее популярные вопросы философии (по версии разных источников), я пришел к выводу, что философскими принято называть такие вопросы, в которых просто недостаточно определены используемые термины.


Чтобы не быть голословным, попытаюсь ответить на некоторые вопросы и покажу, что ответы на них гораздо проще, чем думают философы.


В чем смысл жизни?


Понятие "смысл" в этом контексте автоматически подразумевает, что жизнь была создана кем-то разумным с некоторой целью.

Если жизнь зародилась без разумного замысла, то смысла нет. Иначе нужно спросить у создателя.

С практической точки зрения, ничто не мешает человеку придумать его самостоятельно.


Существует ли мир без наблюдателя?


Чтобы ответить на этот вопрос, нужно для начала определить термин "существует".

В толковом словаре это слово определено неоднозначно, из-за этого иногда возникают противоречия и зацикливания при попытках применять его формально.

Я бы определил слово "существует" так: Один объект существует для другого, если можно придумать такой эксперимент, в результате которого один из них повлияет на другой.

Таким образом, получается, что этот термин относительный.

Например:

Существует ли для меня Проксима Центавра? Да, излученный ей свет может попасть на меня.

Существует ли для меня виртуальный персонаж компьютерной игры? Да, не смотря на то, что это лишь состояния ячеек в памяти компьютера, я могу с ним взаимодействовать.

Представим параллельную вселенную, в которой тоже есть жизнь, но с которой наша вселенная в принципе не может взаимодействовать. Существует ли такая вселенная для нас? Нет. Но для меня существует образ такой вселенной у меня в голове.

Существует ли мир для наблюдателя, которого в этом мире нет? Нет.


Существует ли бог?


Что бы не понималось под этим термином, объективных оснований полагать, что он существует, не видно. Тут, по-моему, к месту утверждение "Бремя доказательства лежит на утверждающем".


Что есть человек?


Это организм, принадлежащий к одному из нескольких видов рода Homo (среди биологов есть разногласия в терминах по поводу вымерших видов). Можно возразить, что это лишь биологическое определение. Но я не знаю других определений, где человеком называется что-то, что не входит в род Homo или наоборот.

Возможно, в будущем появятся неоднозначные варианты. Например, человек с серьезными модификациями тела или компьютерная симуляция человека. Тогда нужно будет договориться о более детальном определении этого термина.


Что есть жизнь?


Это исключительно вопрос определения. Нужно просто договориться о критериях.

В словаре термин определен плохо, а интуитивное понимание имеет узкие границы применимости.

Все понимают, что человек, сороконожка, крапива и даже бактерия - жизнь. А вот вирусы уже под вопросом. А что насчет искусственных или виртуальных организмов?

Мое предложение:

Жизнь - система (не обязательно физическая), которая может в определенных условиях реплицироваться и эволюционировать.


Есть ли свобода воли?


Если свобода воли - это независимость от внешних факторов в принятии решений, то нет, т.к. мы являемся частью мира, в котором живем, и функционируем по тем же законам, что и всё в этом мире.


Познаваем ли мир?


Я бы перефразировал вопрос: Возможно ли в принципе создать математическую модель мира, со сколь угодно высокой точностью предсказывающую результат любого эксперимента?

Пока такой модели нет, но физика активно движется в эту сторону. Ждем "теорию всего".


Что есть хорошо и что плохо? Что такое добро и зло?


Слова "хорошо" и "плохо" бессмысленно использовать вне контекста. Необходимо указывать "для достижения какой цели?".

Допустим, мы придумали какую-то глобальную цель, приятную большинству. Например, максимизация среднего уровня счастья всех людей. Теперь можем взять любую модель поведения и представить что будет, если все люди будут ее придерживаться. Если в таком случае мы будем приближаться к цели, тогда такое поведение - добро. Часто добро для одной группы людей бывает злом для другой.

Обычно добро и зло, как и все этические вопросы, локально определяются договоренностями и устоями, актуальными в данное время в данном месте в данных культурных традициях и обстоятельствах.


Если все составные части исходного объекта были заменены, остаётся ли объект тем же объектом?


Представим владельца автомобиля, который каждый месяц меняет какую-то деталь на новую. Через 10 лет у него машина полностью состоит из новых деталей. Скажет ли водитель, что это та же машина? Скорее всего, да. Но если бы ему сразу дали машину, собранную из этих новых деталей, это была бы определенно другая машина.

Обычно мы взаимодействуем с составными объектами. Когда мы указываем на объект, мы ссылаемся на группу его составляющих (не обязательно материальных). Реальные объекты постоянно немного меняются. Если изменения происходят небольшие, то мы периодически подсознательно обновляем ссылку на эту группу и бесконечно можем говорить что это тот же объект. Но если быстро произошли достаточно масштабные изменения (быстрее, чем скорость обновления ссылки), то объект уже другой.

Ответ на вопрос субъективен, зависит от обстоятельств и человека, у которого мы спрашиваем.


Что есть сознание?


В словарях определения этого слова максимально невнятные и противоречащие. Неудивительно, что возникает столько споров на эту тему.

У меня этот термин ассоциируется с разными явлениями: с внутренним голосом, с моделированием внешнего мира, с реакцией на внешние стимулы, с чередованием мыслей и т.д.

Я бы этот вопрос перефразировал: Какие факторы влияют на то, как мы (и не только люди) мыслим, как ощущаем, запоминаем, каков механизм тех или иных процессов в мозгу? Этими вопросами занимаются уже соответствующие науки.

Очень часто люди, стремясь оправдать философию, относят к ней вопросы, которыми на самом деле занимаются другие науки и области знаний, такие как антропология, психология, социология, нейрофизиология, политология и даже математика.

У меня сложилось впечатление, что человеческий язык как таковой является источником философских вопросов.

Мы взяли большой непрерывный мир и разделили его на дискретные слова. Тем самым мы упростили передачу информации и само наше мышление. Но когда мы начинаем смотреть на эти слова слишком близко, граница их применимости становится размытой.

Картинка пример.

Ошибка философов в том, что они ставят слово первичнее, чем явление, с которым оно связано. Я считаю, что нужно слова подгонять под явления, а не наоборот. А для поиска связей между явлениями есть наука.


Почему так произошло?


Не так давно, до появления научного метода, все попытки изучать мир назывались философией. По мере накопления и систематизации знаний, начали появляться науки, которые со временем покрыли все направления изучения мира. Но философия осталась как рудимент, для которого уже нет определенной области изучения.

Интересно узнать мнение по поводу философии или примеры вопросов от читателей.

Показать полностью
409

Как я делал систему оптического трекинга

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Дело было в далеком 2015 году. В продаже только появились очки виртуальной реальности Oculus DK2, рынок VR игр быстро набирал популярность.


Возможности игрока в таких играх были невелики. Отслеживалось всего 6 степеней свободы движений головы — вращение (инерциалкой в очках) и перемещение в маленьком объеме в зоне видимости инфракрасной камеры, закрепленной на мониторе. Процесс игры представлял собой сидение на стуле с геймпадом в руках, вращение головой в разные стороны и борьбу с тошнотой.


Звучало не очень круто, но я увидел в этом возможность сделать что-то интересное, используя свой опыт в разработке электроники и жажду новых проектов. Как можно было эту систему улучшить?


Конечно, избавиться от геймпада, от проводов, дать возможность игроку свободно перемещаться в пространстве, видеть свои руки и ноги, взаимодействовать с окружением, другими игроками и реальными интерактивными предметами.


Видел я это так:


1) Берем несколько игроков, надеваем на них VR очки, ноутбук и датчики на руки, ноги и туловище.


2) Берем помещение, состоящее из нескольких комнат, коридоров, дверей, оборудуем его системой трекинга, вешаем датчики и магнитные замки на двери, добавляем несколько интерактивных предметов и создаем игру, в которой геометрия виртуальной локации точно повторяет геометрию реального помещения.


3) Создаем игру. Игра представляет собой многопользовательский квест, в котором несколько игроков надевают на себя оборудование и оказываются в виртуальном мире. В нем они видят себя, видят друг друга, могут ходить по локации, открывать двери и совместно решать игровые задачи.


Эту идею я рассказал своему товарищу, который неожиданно воспринял ее с большим энтузиазмом и предложил взять на себя организационные вопросы. Так мы решили мутить стартап.


Для реализации заявленного функционала, нужно было создать две основные технологии:


1) Костюм, состоящий из датчиков на руках, ногах и торсе, отслеживающий положения частей тела игрока


2) Система трекинга, отслеживающая игроков и интерактивные объекты в 3D пространстве.


Про разработку второй технологии и пойдет речь в этой статье. Может быть, позже напишу и про первую.


Система трекинга.


Бюджета на все это, конечно, у нас не было, поэтому нужно было сделать все из подручных материалов. Для задачи отслеживания игроков в пространстве я решил использовать оптические камеры и светодиодные маркеры, закрепленные на VR очках. Опыта подобных разработок у меня не было, но я уже что-то слышал про OpenCV, Python, и подумал, что справлюсь.


По задумке, если система знает где расположена камера и как она ориентирована, то по положению изображения маркера на кадре можно определить прямую в 3D пространстве, на которой этот маркер находится. Пересечение двух таких прямых дает итоговое положение маркера.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Соответственно, камеры нужно было закрепить на потолке так, чтобы каждая точка пространства просматривалась минимум двумя камерами (лучше больше, чтобы избежать перекрытия обзора телами игроков). Для покрытия трекингом предполагаемого помещения площадью около 100 кв.м., требовалось около 60 камер. Я выбрал первые попавшиеся дешевые на тот момент usb вебки.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Эти вебки нужно к чему-то подключать. Эксперименты показали, что при использовании usb удлинителей (по крайней мере, дешевых), камеры начинали глючить. Поэтому решил разделить вебки на группы по 8 штук и втыкать их в системники, закрепленные на потолке. На моем домашнем компе как раз было 10 usb портов, так что пришло время начинать разработку тестового стенда.


Архитектуру я придумал следующую:

На каждые очки вешается акриловый матовый шарик от гирлянды с вклеенным внутрь RGB светодиодом. Одновременно в игре предполагалось несколько игроков, так что для идентификации решил разделять их по цвету – R, G, B, RG, RB, GB, RB. Вот так это выглядело:

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Первая задача, которую нужно выполнить – написать программу поиска шарика на кадре.


Поиск шарика на кадре


Мне нужно было в каждом кадре, пришедшем с камеры, искать координаты центра шарика и его цвет для идентификации. Звучит несложно. Качаю OpenCV под Python, втыкаю камеру в usb, пишу скрипт. Для минимизации влияния лишних объектов на кадре, выставляю экспозицию и выдержку на камере в самый минимум, а яркость светодиода делаю высокой, чтобы получить яркие пятна на темном фоне. В первой версии алгоритм был следующий:


1) Переводим изображение в градации серого


2) Бинаризуем по порогу (если яркость пикселя больше порога, он становится белым, иначе – черным). При этом размытое пятно от шарика превращается в кластер белых пикселей на черном фоне


3) Находим контуры кластеров и их центры. Это и есть координаты шарика на кадре


4) Определяем усредненный цвет пикселей кластера (на исходном цветном изображении) в окрестности его центра для идентификации

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Вроде, работает, но есть нюансы.


Во-первых, на дешевой камере матрица довольно шумная, что приводит к постоянным флуктуациям контуров бинаризованных кластеров и соответственно к дерганью центра. Нельзя, чтобы у игроков дергалась картинка в VR очках, поэтому нужно было эту проблему решать. Попытки применять другие виды адаптивной бинаризации с разными параметрами не давали большого эффекта.


Во-вторых, разрешение камеры всего лишь 640*480, поэтому на некотором расстоянии (не очень большом) шарик виден как пара пикселей на кадре и алгоритм поиска контуров перестает нормально работать.


Пришлось придумывать новый алгоритм. В голову пришла следующая идея:


1) Переводим изображение в градации серого


2) Размываем картинку мощным Gaussian blur –ом так, чтобы изображения светодиодов превратились в размытые пятна с градиентом яркости от центра к периферии


3) Находим самые яркие пиксели на изображении, они должны соответствовать центрам пятен


4) Так же определяем средний цвет кластера в окрестности центра


Так работает гораздо лучше, координаты центра при неподвижном шарике неподвижны, и работает даже при большом расстоянии от камеры.


Чтобы убедиться, что все это будет работать с 8-ю камерами на одном компе, нужно провести нагрузочный тест.


Нагрузочный тест


Подключаю 8 камер к своему десктопу, располагаю их так, чтобы каждая видела светящиеся точки и запускаю скрипт, где описанный алгоритм работает в 8-ми независимых процессах (спасибо питонской либе «multiprocessing») и обрабатывает все потоки сразу.


И… сразу натыкаюсь на фейл. Изображения с камер то появляются, то исчезают, framerate скачет от 0 до 100, кошмар. Расследование показало, что часть usb портов на моем компе подключены к одной шине через внутренний хаб, из-за чего скорость шины делится между несколькими портами и ее уже не хватает на битрейт камер. Втыкание камер в разные порты компа в разных комбинациях показало, что у меня всего 4 независимых usb шины. Пришлось найти материнку с 8-ю шинами, что было довольно непростым квестом.


Продолжаю нагрузочный тест. На этот раз все камеры подключились и выдают нормальные потоки, но сразу сталкиваюсь со следующей проблемой – низкий fps. Процессор загружен на 100% и успевает обрабатывать лишь 8-10 кадров в секунду с каждой из восьми вебок.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Похоже, нужно оптимизировать код. Узким местом оказалось Гауссово размытие (оно и не удивительно, ведь нужно на каждый пиксель кадра производить свертку с матрицей 9*9). Уменьшение ядра не спасало ситуацию. Пришлось искать другой метод нахождения центров пятен на кадрах.


Решение удалось найти внезапно во встроенной в OpenCV функции SimpleBlobDetector. Она делает прямо то, что мне нужно и очень быстро. Преимущество достигается благодаря последовательной бинаризации изображения с разными порогами и поиску контуров. Результат – максимальные 30 fps при загрузке процессора меньше 40%. Нагрузочный тест пройден!


Классификация по цвету


Следующая задача – классификация маркера по его цвету. Усредненное значение цвета по пикселям пятна дает RGB компоненты, которые очень нестабильны и сильно меняются в зависимости от расстояния до камеры и яркости светодиода. Но есть отличное решение: перевод из RGB пространства с HSV (hue, saturation, value). В таком представлении пиксель вместо «красный», «синий», «зеленый», раскладывается на компоненты «тон», «насыщенность», «яркость». В этом случае насыщенность и яркость можно просто исключить и классифицировать только по тону.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

И так, на данный момент я научился находить и идентифицировать маркеры на кадрах с большого количества камер. Теперь можно перейти к следующему этапу – трекингу в пространстве.


Трекинг


Я использовал pinhole модель камеры, в которой все лучи падают на матрицу через точку, находящуюся на фокусном расстоянии от матрицы.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

По этой модели будет происходить преобразование двухмерных координат точки на кадре в трехмерные уравнения прямой в пространстве.


Для отслеживания 3D координат маркера нужно получить минимум две скрещивающиеся прямые в пространстве от разных камер и найти точку их пересечения. Увидеть маркер двумя камерами не сложно, но для построения этих прямых нужно, чтобы система знала все о подключенных камерах: где они висят, под какими углами, фокусное расстояние каждого объектива. Проблема в том, что все это неизвестно. Для вычисления параметров требуется некая процедура калибровки.


Калибровка трекинга


В первом варианте решил сделать калибровку трекинга максимально примитивной.


1) Вешаю первый блок из восьми камер на потолок, подключаю их к системнику, висящему там же, направляю камеры так, чтобы ими покрывался максимальный игровой объем.


2) С помощью лазерного нивелира и дальномера измеряю XYZ координаты всех камер в единой системе координат


3) Для вычисления ориентаций и фокусных расстояний камер, измеряю координаты специальных стикеров. Стикеры вешаю следующим образом:


В интерфейсе отображения картинки с камеры рисую две точки. Одну в центре кадра, другую в 200 пикселях справа от центра:

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Если смотреть на кадр, эти точки падают куда-то на стену, пол или любой другой объект внутри помещения. Вешаю в соответствующие места бумажные наклейки и рисую на них точки маркером.

Измеряю XYZ координаты этих точек с помощью тех же нивелира и дальномера. Итого для блока из восьми камер нужно измерить координаты самих камер и еще по две точки на каждую. Т.е. 24 тройки координат. А таких блоков должно быть около десяти. Получается долгая муторная работа. Но ничего, позже сделаю калибровку автоматизированной.

Запускаю процесс расчета на основе измеренных данных.


Есть две системы координат: одна глобальная, связанная с помещением, другая локальная для каждой камеры. В моем алгоритме результатом для каждой камеры должна получиться матрица 4*4, содержащая ее местоположение и ориентацию, позволяющая преобразовать координаты из локальной в глобальную систему.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Идея следующая:


1) Берем исходную матрицу с нулевыми поворотами и смещением.


2) Берем единичный вектор в локальной системе камеры, который смотрит из объектива вперед и преобразуем его в глобальные координаты по исходной матрице.


3) Берем другой вектор в глобальной системе, который из камеры смотрит на центральную точку на стене.


4) С помощью градиентного спуска поворачиваем исходную матрицу так, чтобы после преобразования эти векторы были сонаправлены. Таким образом, мы зафиксировали направление камеры. Осталось зафиксировать вращение вокруг этого направления. Для этого и измерялась вторая точка в 200 пикселях от центра кадра. Поворачиваем матрицу вокруг главной оси, пока два вектора не станут достаточно параллельны.


5) По расстоянию между этими двумя точками вычисляю фокусное расстояния в пикселях (учитывая, что расстояние между проекциями этих точек на кадре составляет 200 пикселей).


Наверняка эту задачу можно было решить аналитически, но для простоты я использовал численное решение на градиентном спуске. Это не страшно, т.к. вычисления будут проводиться один раз после монтажа камер.


Для визуализации результатов калибровки я сделал 2D интерфейс с картой, на которой скрипт рисует метки камер и направления, в которых они видят маркеры. Треугольником обозначаются ориентации камер и углы обзора.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Тестирование трекинга


Можно приступать к запуску визуализации, которая покажет правильно ли определились ориентации камер и правильно ли интерпретируются кадры. В идеале, линии, идущие из значков камер должны пересекаться в одной точке.


Вот что вышло:

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Похоже на правду, но точность явно могла быть выше. Первая причина несовершенства, которая пришла в голову – искажения в объективах камер. Значит, нужно эти искажения как-то компенсировать.



Калибровка камеры


У идеальной камеры важный для меня параметр только один – фокусное расстояние. У реальной кривой камеры нужно учитывать еще дисторсии объектива и смещение центра матрицы.


Для измерения этих параметров есть стандартная процедура калибровки, в процессе которой измеряемой камерой делают набор фотографий шахматной доски, на которых распознаются углы между квадратами с субпиксельной точностью.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Результатом калибровки является матрица, содержащая фокусные расстояния по двум осям и смещение матрицы относительно оптического центра. Все это измеряется в пикселях.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

А также вектор коэффициентов дисторсии, который позволяет компенсировать искажения объектива с помощью преобразований координат пикселей.


Применяя преобразования с этими коэффициентами к координатам маркера на кадре, можно привести систему к модели идеальной pinhole камеры.


Провожу новый тест трекинга:

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Уже гораздо лучше! Выглядит настолько хорошо, что даже вроде будет работать.


Но процесс калибровки выходит очень муторным: напрямую измерить координаты каждой камеры, запустить отображение картинки с каждой камеры, повесить наклейки, измерить координаты каждой наклейки, записать результаты в таблицу, откалибровать объективы. Все это занимало пару дней и килограмм нервов. Решил разобраться с трекингом и написать что-то более автоматизированное.



Вычисление координат маркера


И так, я получил кучу прямых, разбросанных по пространству, на пересечениях которых должны находиться маркеры. Только вот прямые в пространстве на самом деле не пересекаются, а скрещиваются, т.е. проходят на некотором расстоянии друг от друга. Моя задача – найти точку, максимально близкую к обеим прямым. Формально говоря, нужно найти середину отрезка, являющегося перпендикуляром к обеим прямым.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Длина отрезка AB тоже пригодится, т.к. она отражает «качество» полученного результата. Чем он короче, тем ближе друг к другу прямые, тем лучше результат.


Затем я написал алгоритм трекинга, который попарно вычисляет пересечения прямых (внутри одного цвета, от камер, находящихся на достаточном расстоянии друг от друга), ищет лучшее и использует его как координаты маркера. На следующих кадрах старается использовать ту же пару камер, чтобы избежать скачка координат при переходе на трекинг другими камерами.


Параллельно, при разработке костюма с датчиками, я обнаружил странное явление. Все датчики показывали разные значения угла рысканья (направления в горизонтальной плоскости), как будто у каждого был свой север. В первую очередь полез проверять не ошибся ли я в алгоритмах фильтрации данных или в разводке платы, но ничего не нашел. Потом решил посмотреть на сырые данные магнитометра и увидел проблему.

Магнитное поле в нашем помещении было направлено ВЕРТИКАЛЬНО ВНИЗ! Видимо, это связано с железом в конструкции здания.


Но ведь в VR очках тоже используется магнитометр. Почему у них такого эффекта нет? Иду проверять. Оказалось, что в очках он тоже есть… Если сидеть неподвижно, можно заметить, как виртуальный мир медленно, но верно вращается вокруг тебя в рандомную сторону. За минут 10 он уезжает почти на 180 градусов. В нашей игре это неминуемо приведет к рассинхрону виртуальной и реальной реальностей и сломанным об стены очкам.


Похоже, что помимо координат очков, придется определять и их направление в горизонтальной плоскости. Решение напрашивается само – ставить на очки не один, а два одинаковых маркера. Оно позволит определять направление с точностью до разворота на 180 градусов, но с учетом наличия встроенных инерциальных датчиков, этого вполне достаточно.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Система в целом работала, хоть и с небольшими косяками. Но было принято решение запустить квест, который как раз был близок к завершению нашим gamedev разработчиком, присоединившимся к нашей миникоманде. Была затречена вся игровая площадь, установлены двери с датчиками и магнитными замками, изготовлено два интерактивных предмета:

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Игроки надевали очки, костюмы и рюкзаки-компьютеры и заходили в игровую зону. Координаты трекинга отсылались им по wi-fi и применялись для позиционирования виртуального персонажа. Все работало достаточно неплохо, посетители довольны. Приятнее всего было наблюдать ужас и крики особо впечатлительных посетителей в моменты, когда на них из темноты нападали виртуальные призраки =)

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Масштабирование


Внезапно нам прилетел заказ на большой VR шутер на 8 игроков с автоматами в руках. А это 16 объектов, которые нужно тречить. Повезло, что сценарий предполагал возможность разделения трекинга на две зоны по 4 игрока, поэтому я решил, что проблем не будет, можно принимать заказ и ни о чем не волноваться. Протестировать систему в домашних условиях было невозможно, т.к. требовалась большая площадь и много оборудования, которое будет куплено заказчиком, поэтому до монтажа я решил потратить время на автоматизацию калибровки трекинга.


Автокалибровка


Направлять камеры, вешать все эти наклейки, вручную измерять координаты было невероятно неудобно. Хотелось избавиться от всех этих процессов – повесить камеры от балды, произвольным образом пройтись с маркером по пространству и запустить алгоритм калибровки. Теоретически это должно быть возможно, но как подойти к написанию алгоритма – непонятно.


Первым делом нужно было централизовать всю систему. Вместо разделения игровой зоны на блоки по 8 камер, я сделал единый сервер, на который приходили координаты точек на кадрах всех камер сразу.


Идея следующая:


1) вешаю камеры и на глаз направляю их в игровую область


2) запускаю режим записи на сервере, в котором все приходящие с камер 2D точки сохраняются в файл


3) хожу по темной игровой локации с маркером в руках


4) останавливаю запись и запускаю расчет калибровочных данных, при котором вычисляются расположения, ориентации и фокусные расстояния всех камер.


5) в результате предыдущего пункта получается единое пространство, наполненное камерами. Т.к. это пространство не привязано к реальным координатам, оно имеет случайное смещение и поворот, которое я вычитаю вручную.


Пришлось перелопатить огромное количество материала по линейной алгебре и написать многие сотни строк питонского кода. Настолько много, что я уже почти не помню как оно работает.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост
Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Вот так выглядит напечатанная на принтере специальная палка-калибровалка.



Тестирование большого проекта


Проблемы начались во время тестирования на объекте за пару недель до запуска проекта. Идентификация 8-ми разных цветов маркеров работала ужасно, тестовые игроки постоянно телепортировались друг в друга, некоторые цвета вообще не отличались от внешних засветок в помещении торгового комплекса. Тщетные попытки что-то исправить с каждой бессонной ночью все сильнее вгоняли меня в отчаяние. Все это осложнялось нехваткой производительности сервера при расчете десятков тысяч прямых в секунду.


Когда уровень кортизола в крови превысил теоретический максимум, я решил посмотреть на проблему с другой стороны. Как можно сократить количество разноцветных точек, не сокращая количество маркеров? Сделать трекинг активным. Пускай у каждого игрока, например, левый рог всегда корит красным. А второй иногда загорается зеленым по приходу команды с сервера так, что в один момент времени он горит только у одного игрока. Получается, что зеленая лампочка будет как-будто перепрыгивать с одного игрока на другого, обновляя привязку трекинга к красной лампочке и обнуляя ошибку ориентации магнитометра.


Для этого пришлось бежать в ближайший чипидип, покупать светодиоды, провода, транзисторы, паяльник, изоленту и на соплях навешивать функционал управления светодиодами на плату костюма, которая на это рассчитана не была. Хорошо, что при разводке платы я на всякий случай повесил пару свободных ног stm-ки на контактные площадки.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Алгоритмы трекинга пришлось заметно усложнить, но в итоге все заработало! Телепортации игроков друг в друга исчезли, нагрузка на процессор упала, засветки перестали мешать.

Проект был успешно запущен, первым делом я сделал новые платы костюмов с поддержкой активного трекинга, и мы произвели обновление оборудования.

Чем все закончилось?

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

За 3 года мы открыли множество развлекательных точек по всему миру, но коронавирус внес свои коррективы, что дало нам возможность сменить направление работы в более общественно-полезную сторону. Теперь мы довольно успешно занимаемся разработкой медицинских симуляторов в VR. Команда у нас все еще маленькая и мы активно стремимся расширять штат. Если среди читателей есть опытные разработчики под UE4, ищущие работу, пожалуйста, напишите мне.



Традиционный забавный момент в конце статьи:


Периодически при тестах с большим количеством игроков возникал глюк, при котором игрока внезапно на короткое время телепортировало на высоту несколько метров, что вызывало соответствующую реакцию. Дело оказалось в том, что моя модель камеры предполагала пересечение матрицы с бесконечной прямой, идущей от маркера. Но она не учитывала, что у камеры есть перед и зад, так что система искала пересечение бесконечных прямых, даже если точка находится за камерой. Поэтому возникали ситуации, когда две разные камеры видели два разных маркера, но система думала, что это один маркер на высоте в несколько метров.

Как я делал систему оптического трекинга Своими руками, Программирование, Стартап, Технологии, Разработка, Электроника, Гаджеты, Gamedev, Виртуальная реальность, Python, Математика, Камера, Видео, Длиннопост

Система в прямом смысле работала через задницу =)

Показать полностью 23 1
Отличная работа, все прочитано!