Авторизация
Регистрация

Напомнить пароль

3D-сканер из хлама: метод структурированного света. Генерируем VGA паттерны на на ESP32 S3

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

Для начала — как работает 3D-сканер с технологией SLS (Structured Light Scanning)? Метод вроде как кажется заумным, нынче модно — оббежал вокруг объекта с телефоном — и вот у тебя готовая  3D фигурка, которую можно печатать. Но мы же не ищем легких путей — мы создаем себе трудности, которые будем героически преодолевать.
Сам метод популярен для дорогих сканеров, которые стоят тысячи убитых енотов. Но он быстр и точен — точность до десятков-сотен микрон, и в некоторых применениях позволяют сканировать в движении. Мы жлобствовать не станем, а сделаем нечто подобное и сильно упрощенное из глины и палок.

Принцип кажется элементарным: сканер проецирует на объект серию заранее известных световых узоров — обычно полосы, сетки или точки, созданные с помощью LCD-, DLP-проектора или лазерного интерферометра. Камеры или одна камера фиксируют, как эти узоры деформируются поверхностью объекта.

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

Чем это отличается от других методов?

  • Лазерное сканирование (Laser Triangulation) — там проецируется одна линия лазера, а у нас вместо одной линии проецируется сразу весь узор, стало быть сканирование в десятки-сотни раз быстрее, кадр за 1–2 секунды против секунд на одну линию.
  • Фотограмметрия —  требует множество перекрывающихся фотографий и текстур, на однотонных и блестящих поверхностях «слепнет».
  • Time-of-Flight (ToF и LiDAR) — лучше подходит для больших объектов и расстояний десятки-сотни метров, но даёт разрешение лишь в несколько миллиметров или сантиметров.
  • Координатно-измерительные машины — во все точки тыкают щупом, не каждому объекту это понравится.

 

У SLS-сканеров тоже хватает недостатков — не любят внешней засветки, но зато высокая скорость и хорошая точность.
И если чуть-чуть приложить голову, но цена такого сканера может оказаться копеечной.

Итак, для начала нам нужно спроецировать картинку на объект. Если уж совсем никуда не спешите, то хоть фильмоскоп использовать можно. Но лучше все-таки проектор, будет значительно быстрее. Старые проекторы со смешным по нынешним временам разрешением 1024х768 можно купить совсем дешево. У меня, как у истинного Плюшкина, такой завалялся в гараже.  Когда-то хотел сделать SLA 3D принтер, но пока собирался — они подешевели до такой степени, что делать самодельный уже было похоже на извращение. А проектор остался валяться. Во время последней генеральной уборки хотел его свезти на свалку, но рука не поднялась, оставил до следующего раза. А тут он возьми и пригодись!

Проектор лучше выбирать с микрозеркалами — DLP. Чёткие края полос, высокая контрастность даже в бюджетных моделях, нет «желе-эффекта» и сдвига пикселей между RGB-слоями, как у LCD и 3LCD. У LCD — видимая сетка пикселей, размытые края полос из-за наложения трёх матриц, низкая контрастность.

Короче, DLP-проекторы 10–15-летней давности идеально подходят — почти всегда дают хороший контраст и очень резкую картинку. Разрешение 1024×768 — достаточно, но меньше лучше не брать.  Для объектов до 30–40 см это даёт реальное разрешение облака точек 0,1–0,2 мм — куда уж лучше?
Но не без проблем — а куда от этого денешься? — старые проекторы имеют только VGA, при подключении к современному ПК через дешевый HDMI/VGA-переходник часто появляется лёгкий «сдвиг» или «дрожание» полос на 1–2 пикселя. Подключать к старому компьютеру с родным VGA-выходом? Слишком уж много хлама получается, музей прямо какой-то.

Решение, которое я хочу предложить — ESP32 S3, как VGA-генератор. Я убил на этот безнадежный проект больше недели. В интернете нашел только один примерно аналогичный проект, но, несмотря на заверение автора, он с  1024×768@60 Гц VGA работать не будет, там много подводных камней, которые он не потрудился обойти.
 

 

Почему это возможно на S3 относительно просто? Во-первых, у  ESP32-S3 появился новый блок — LCD-CAM. В итоге видеосигнал можно получить одним движением левой руки. Ну, почти.
И у него много памяти — помимо основной SRAM — 512 KB, на дешевой плате стоит до 16MB Flash и 8MB PSRAM.
Нам нужна цветность на выходе, поэтом 1 бит на пиксель — не вариант. Нужно хотя бы 1 байт, в котором закодируем все цвета в формате  3R3G2B. Но даже с этим убогим форматом емкости  SRAM уже не хватит даже на один кадр. Зато в  8MB PSRAM входит 10 кадров — то, что доктор прописал.

 

В итоге маленькая плата ESP32-S3 выдаёт чистый 1024×768@60 Гц VGA-сигнал прямо с пинов, без ПК и без переходников вообще, надо только несколько резисторов добавить. Стабильность — пиксель в пиксель.

Что делает программа? Кадры 0–8 — горизонтальные Gray-коды (9 бит → 512 уникальных столбцов), кадр 9 — трёхфазная синусоида (самая точная для фазового метода).
Для переключение кадров используется USB, виртуальный последовательный порт — просто посылаете единственную цифру — номер картинки и изображение на следующем кадре уже переключится.

WiFi подключать даже не пытайтесь —  DMA гонит байты из PSRAM непрерывным потоком, при подключении стандартных WiFi библиотек — краш немедленно.

Ограничение программы — генерирует только 1024×768@60 Гц, других проекторов у меня нет, зачем терять на них время?

Кое-какие детали для тех, кто захочет копнуть поглубже, а исходники изучать лень.

VGA-сигнал — напрямую через LCD_CAM-периферию ESP32-S3.
8-битный 3R3G2B 1024×768@60 Гц, частота пикселей 60 МГц — всё на железе, без I²S-трюков. 10 полных кадров 1024×768 = 7.5 МБ — полностью в PSRAM
Здесь есть ловушка: ардуино не желает статически выделять память в  PSRAM, приходится делать статично-динамическое выделение через ps_malloc() — кому надо, в коде это увидят. 
Переключение кадров — мгновенно и без мерцания
Во время VSYNC просто меняется указатель на новый массив указателей строк → новый кадр появляется ровно со следующего поля. Никакого копирования данных.
Работа с SD-картой — действительно быстрая, 4-bit SD-MMC (хотя это для такого случая не актуально, копируется раз при запуске), в отличие от 99 % «ардуино-проектов», где SD ходит через SPI. 
Gray-коды (9 бит) + одна трёхфазная синусоида — это тот минимум, который даёт максимальную точность при фазовом методе и Gray-кодах одновременно. Варианта два — если хотите свои картинки, запишите их на карточку. Питон-скрипт, который генерирует такие картинки, найдете в исходниках. При обнаружении карты загрузятся картинки оттуда, если карты нет — будут сгенерированы по умолчанию.

И небольшая ложка меда в бочке дегтя.

1024×768@60 Гц требует 65 МГц для видео, но ESP32-S3 может выдать ровно 60 МГц.
Решение — нестандартные тайминги. Проектор всё принимает и показывает — по крайней мере мой, но у старых DLP 1024×768 запас по горизонтали приличный.

 

В завершении немного городских баек про самодельные  SLS сканеры и иже с ними. Есть в Китае одна девушка — китайский аналог Гаечки, Naomi Wu, она же SexyCyborg — типа хакерша и программист из Шэньчжэня, всегда в комбинезоне (ну Гаечка же), снимает ролики про самоделки и всякие технические прибамбасы, делает всякую чушь: нижнюю подсветку для юбки и тому подобное. Она одной из первых (может, Чип и Дейл помогли?) собрала самодельный сверхдешёвый structured-light body-сканер (старый DLP-проектор + веб-камера + DAVID-Scanner), отсканировала себя почти в чем мама родила и всю эту техно-эротику  разместила в Thingiverse. Впрочем, ее очень быстро там вычистили.

Ее проекты можно посмотреть здесь, ее ролики на youtube, если есть возможность смотреть.

Мой проект лежит тут, если вдруг кому-нибудь придет в голову сделать что-то подобное. Ну или не делать — так покритиковать бедного пенсионера.

Добавить в избранное
+3 +3
свернутьразвернуть
Комментарии (4)
RSS
+
avatar
0
Спасибо… Очень интересно…
+
avatar
+2
Вопрос использования самодельных SLS сканеров всегда упирается в качество итоговых моделей. Как показывает практика — арендовать готовый сканер на несколько часов или просто отнести нужную деталь для сканирования моделеррам проще, быстрее и дешевле, чем собирать свой.
+
avatar
+2
Забыл еще упомянуть, в посте нет ссылок на результаты сканирования… Хотелось бы посмотреть итоговое качество.
+
avatar
+1
Забыл еще упомянуть, в посте нет ссылок на результаты сканирования…
А их и не будет, потому, что нормальное качество начинается со входным билетом от 35 тысяч рублей.
С материалами с ближайшей барахолки можно получить просто шум.
Давным-давно уже все придумано за нас: RangeVision в пакете DIY+маркеры.
Итог:
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.