Вот как в реале выглядит всевидящее око


Кстати, сканер дороже автомобиля. Tesla S. С авиадоставкой до подъезда в Москве

В этом посте будет описание самого дорогого (наверное) в мире и самого дешевого в мире 3d-сканера.

Благодаря компании 3d.ru мне удалось потестировать и разобраться, как работает крутейший в мире 3d-сканер. Они мне рассказали, что обычно такие точные круговые 3d-сканеры их клиенты используют в авиастроении, аэрокосмической промышленности, при сканировании музеев и галерей, реконструкции старых помещений, геодезии и т.д.
(И да, я спросил сколько стоит доменное имя из двух букв, ребята хитро промолчали.)


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



Вот такие красивые штуки создаются при помощи сканера


3D сканер Surphaser 25HSX


3D сканер Surphaser 25HSX является трехмерным лазерным сканером со сферической системой отклонения луча, предназначенным для формирования 3-х мерных моделей реальных объектов для последующего использования в различных областях:

— изготовление чертежей проектируемых деталей по прототипам;
— создание резервных копий музейных экспонатов и интерьеров;
— разработка компьютерных игр и рекламной мультипликации;

Работа сканера основана на использовании «Сканирующей головки» (hardware сканера) и управляющего компьютера, на котором установлено «Программное обеспечение» (software сканера), с помощью которого компьютер запускает процесс сканирования, принимает поток данных измерений из сканирующей головки, а после окончания сканирования обрабатывает эти данные, переводя их в форму облака точек объекта.



ТТХ
Сканирующая головка является входным устройством 3d сканера, которое является, по сути, электронным прибором для измерения геометрических величин.

При этом головка позволяет обеспечивать 3d сканеру Surphaser 25HSX следующие параметры:

  • Дальность до измеряемого объекта – 1.5 – 60 м;
  • Зона обзора сканирующей головки со сферической системой отклонения — большая часть поверхности сферы с угловыми размерами 240х180 град;
  • Дискретность измерений – 200 000 -1 000 000 точек в секунду;
  • Плотность распределения точек отсчета дальности -17-100 точек на градус
  • Время сканирования всей зоны обзора ~ 2 минуты (при плотности 17 точек на градус и дискретности 200 000 точек в секунду);
  • Точность измерения продольная – 1 мм и менее; поперечная 20-60 угловых секунд.
  • Сканирующая головка питается от источника постоянного тока 18-22 В, обеспечивающим ток до 3,3 А.


Одновременно сканирующая головка является устройством ввода-вывода. При этом головка обеспечивает передачу данных в цифровом виде со скоростью до 200 Мбайт/с.

Интерфейс связи с управляющим компьютером: USB-2.



Составные части Сканирующей головки для 3D сканера сферического типа
расшифровка
1- Модуль оптической развертки (выделен штриховой линией)
1.1- Дальномерная головка (выделена штриховой линией)
1.1.1- Лазерный модуль
1.1.2- Фотопри?мный модуль
1.1.3- Объектив.
1.1.4- Радиотехнический модуль
1.1.5- Плата контроля луча
1.1.6- Коммутационная плата
1.2. – Система отклонения
1.2.1- Узел быстрого вращения
1.2.1.1- Вращающееся зеркало
1.2.2- Узел медленного вращения
1.3- Шасси
2.- Устройство выделения «полезного» сигнала
2.1- Плата АЦП
2.2- Цифровая плата
3- Плата питания
4- Кожух Сканирующей головки

Работа сканирующей головки состоит в том, что луч дальномерной системы (аналоговой частью которой является Дальномерная головка) с постоянной угловой скоростью поворачивается в пространстве. Развертка луча вокруг вертикальной оси путем поворота шасси производится медленно (0,05-0,2 об/мин), а развертка луча вокруг горизонтальной оси с помощью вращающегося зеркала — быстро (4-40 об/сек). При этом непрерывно с частотой около 200 кГц (при необходимости до 1 МГц) производится отсчет времени распространения света до текущей точки объекта (точнее фазовых сдвигов у отраженного луча на частотах модуляции интенсивности света). Данные фазовых измерений, а также данные о текущих значениях углов поворота передаются во внешнее устройство – управляющий компьютер для накопления этих данных и
последующего расчета по ним геометрии отражающей поверхности объекта.




Модуль оптической развёртки для сферического 3d сканера с системой отклонения с вращением только вокруг горизонтальной оси, подготовленный для транспортировки.


Оптическая схема Модуля оптической развертки
описание по элементам


Обозначения на схеме:
Оптические элементы из стекла
3 –линза 47464
4 – оптический фильтр 690.0 IF 40 U
7 – фокусирующая линза 46377
8 – защитное окно 18.105
11 – зеркало 18.106
14 – линза 18.101.
15 – линза 18.102.
16 – линза 47911 или 48692
17 – оптический фильтр 38 02 27 032
Прочие элементы
1 – корпус фотоприемного модуля
2 – приемный фотодиод
5 – корпус лазерного модуля
6 – лазерный диод
9 – деталь крепления защитного окна
10 – вращающееся зеркало
12 – фотодиод на плате контроля луча
13 – корпус объектива



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


Плата BP фотоприемного модуля предназначена для приема модулированного по интенсивности лазерного излучения с помощью лавинного фотодиода. В рабочем режиме Плата обеспечивает выделение модулирующего свет сигнала и его усиление.


Плата BR Радиотехнического модуля, являющегося частью модуля оптической развертки 3D сканера, предназначена для формирования комбинированного сигнала, модулирующего по интенсивности световой луч, преобразование (перевод на низкую частоту 1 МГц и усиление) принятого отраженного ВЧ сигнала и опорного ВЧ сигнала, выделение и усиление отраженного НЧ сигнала


Плата BS, являющаяся частью модуля оптической развертки 3D сканера, предназначена для формирования сигнала о наличии луча на выходе лазерного модуля. Для формирования сигнала используется только рассеянное излучение. В рабочем режиме выходное напряжение превышает 0,1 В при мощности луча более 3 мВт.

Сканирование



Вот так видит комнату 3д-сканер в предварительном режиме (можно выбрать нужную область, которую сканер будет зондировать)


Мир глазами 3д-сканера. Кто может разглядеть человека?


Та же комната в 3д-редакторе


Вот так видит череп обычный человек


Вся комната на этот раз не нужна, поэтому мы выбираем только тот участок с черепом в режиме предсканирования. Затем минут 5-10 сканер крутит своим оком, ищет хоббитов. Главное не попадаться на его пути, а то сожжет будет дефект. Сканер захватывает не только сам череп, но и участки которые далеко за ним. Это легко правится в редакторе.


Мимо человек проходил, попал в зону лазерного луча. Видите полосу? Не вставайте на пути когерентного света. С человеком все в порядке, а вот на скане это отразилось как «битый пиксель»

Немного про использование Surphaser`a в реальной жизни




еще фото














боевой корабль






часть системы охлаждения атомной станции

размер детали — несколько десятков метров


выявленные дефекты



3d-сканер за 3 доллара





  • Arduino с Arduino IDE
  • Processing IDE
  • немного LEGO
  • шаговый двигатель (например из принтера)
  • драйвер шагового двигателя и питание
  • лазер
  • веб-камера
  • работающая Meshlab


по компонентам
image
из старого OKI принтера. Делает полный оборот за 48 шагов (7,5 градусов за шаг),
3,7V, 200-250mA

image
Питание, драйвер и редуктор



image



image
CD, резиночки, клей, LEGO зеленая бумага

image
Камера — Creative Webcam Vista. она устаревшая и с плохим сенсором (640x480), и плохой оптикой (plastic lenses). Но есть одно преимущество. Автор ее имел в наличии.

image
Низкокачественный и дешевый лазер (~1$)приделан к цилиндрической линзе, сделанной из стеклянного стержня. (стержень из химической лаборатории). Угол между лазером и камерой 30 градусов

image
code
#include <Stepper.h>
Stepper oki(48,8,9); //see stepper tutorial in arduino.cc for info about that
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte; // a variable to read incoming serial data into

void setup() {
// initialize serial communication:
Serial.begin(9600);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
oki.setSpeed(60);
}

void loop() {
// see if there's incoming serial data:
if (Serial.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'S') {
digitalWrite(ledPin, HIGH);
oki.step(4);
}
// if it's an L (ASCII 76) turn off the LED:
if (incomingByte == 'K') {
digitalWrite(ledPin, LOW);
}
}
}


image

Processing
code:
import codeanticode.gsvideo.*;
import processing.serial.*;

//objects
PFont f;
GSCapture cam;
Serial myPort;
PrintWriter output;

//colors
color black=color(0);
color white=color(255);

//variables
int itr; //iteration
float pixBright;
float maxBright=0;
int maxBrightPos=0;
int prevMaxBrightPos;
int cntr=1;
int row;
int col;

//scanner parameters
float odl = 210; //distance between webcam and turning axle, [milimeter], not used yet
float etap = 120; //number of phases profiling per revolution
float katLaser = 25*PI/180; //angle between laser and camera [radian]
float katOperacji=2*PI/etap; //angle between 2 profiles [radian]

//coordinates
float x, y, z; //cartesian cords., [milimeter]
float ro; //first of polar coordinate, [milimeter]
float fi; //second of polar coordinate, [radian]
float b; //distance between brightest pixel and middle of photo [pixel]
float pxmmpoz = 5; //pixels per milimeter horizontally 1px=0.2mm
float pxmmpion = 5; //pixels per milimeter vertically 1px=0.2mm

//================= CONFIG ===================

void setup() {
size(800, 600);
strokeWeight(1);
smooth();
background(0);

//fonts
f=createFont(«Arial»,16,true);

//camera conf.
String[] avcams=GSCapture.list();
if (avcams.length==0){
println(«There are no cameras available for capture.»);
textFont(f,12);
fill(255,0,0);
text(«Camera not ready»,680,32);
}
else{
println(«Available cameras:»);
for (int i = 0; i < avcams.length; i++) {
println(avcams[i]);
}
textFont(f,12);
fill(0,255,0);
text(«Camera ready»,680,32);
cam=new GSCapture(this, 640, 480,avcams[0]);
cam.start();
}

//Serial (COM) conf.
println(Serial.list());
myPort=new Serial(this, Serial.list()[0], 9600);

//output file
output=createWriter(«skan.asc»); //plik wynikowy *.asc


}

//============== MAIN PROGRAM =================

void draw() {

PImage zdjecie=createImage(cam.width,cam.height,RGB);
cam.read();
delay(2000);
for (itr=0;itr<etap;itr++) {
cam.read();
zdjecie.loadPixels();
cam.loadPixels();
for (int n=0;n<zdjecie.width*zdjecie.height;n++){
zdjecie.pixels[n]=cam.pixels[n];
}
zdjecie.updatePixels();
set(20,20,cam);
String nazwaPliku=«zdjecie-»+nf(itr+1, 3)+".png";
zdjecie.save(nazwaPliku);
obroc();
delay(500);
}
obroc();
licz();
noLoop();

}

void licz(){
for (itr=0; itr<etap; itr++){

String nazwaPliku=«zdjecie-»+nf(itr+1, 3)+".png";
PImage skan=loadImage(nazwaPliku);
String nazwaPliku2=«odzw-»+nf(itr+1, 3)+".png";
PImage odwz=createImage(skan.width, skan.height, RGB);
skan.loadPixels();
odwz.loadPixels();
int currentPos;
fi=itr*katOperacji;
println(fi);

for(row=0; row<skan.height; row++){ //starting row analysis
maxBrightPos=0;
maxBright=0;
for(col=0; col<skan.width; col++){
currentPos = row * skan.width + col;
pixBright=brightness(skan.pixels[currentPos]);
if(pixBright>maxBright){
maxBright=pixBright;
maxBrightPos=currentPos;
}
odwz.pixels[currentPos]=black; //setting all pixels black
}

odwz.pixels[maxBrightPos]=white; //setting brightest pixel white

b=((maxBrightPos+1-row*skan.width)-skan.width/2)/pxmmpoz;
ro=b/sin(katLaser);
//output.println(b + ", " + prevMaxBrightPos + ", " + maxBrightPos); //I used this for debugging

x=ro * cos(fi); //changing polar coords to kartesian
y=ro * sin(fi);
z=row/pxmmpion;

if( (ro>=-30) && (ro<=60) ){ //printing coordinates
output.println(x + "," + y + "," + z);
}

}//end of row analysis

odwz.updatePixels();
odwz.save(nazwaPliku2);

}
output.flush();
output.close();
}

void obroc() { //sending command to turn
myPort.write('S');
delay(50);
myPort.write('K');
}


image
сканирование

image
облако точек

image
исходный объект

image
некое подобие облако точек и совы заметно невооруженным глазом

image
после обработки в MeshLab



еще один проект
image

image
hackaday.io/project/2021-3dollar-scanner

И все же у меня вопрос к знатокам: что составляет большую часть стоимости устройства за 8 миллионов рублей?

P.S.
Идея.
Есть задумка сделать обучающий проект (для школьников и студентов) с выходом на краудсорсинг. Можно вытащить 3d-сканер на ВДНХ и отсканировать «Рабочего и колхозницу», а потом напечатать много брелков и статуэток тем, кто сделал взнос. А еще фильм-обучалку снять и на youtube выложить.
Студентам — знания, компаниям — пиар, 3d-сообществу — полезная движуха.
Если есть ли у кого знакомые из администрации ВДНХ или может у кого есть подъемная платформа, пишите.

P.P.S.
Применение 3d-сканеров в играх



Комментарии (31)


  1. artoym
    17.08.2015 15:02
    +2

    Устройства бывают разными по стоимости. В цену входит: редкие компоненты, которые изготавливаются под заказ, сложность технологии, уникальность технологии, уникальность оборудования, гарантия производителя (производитель несёт ответственность за своё оборудование), а так же стоимость разработки. И если это штучное оборудование, то стоимость разработки делиться между этими штуками.
    Вот например так сказать «kinect» для медицины — система навигации по головному мозгу человека. Стоит всего в два раза дешевле (это без роботизированного кресла — его стоимость я слабо представляю).


    1. MagisterLudi
      17.08.2015 15:05

      Моторы, линзы и диод…
      Вот интересует, что именно такое редкое, уникальное и сделанное на заказ.


      1. artoym
        17.08.2015 15:08
        +5

        «Ресёрч» — раз. Программное обеспечение — два.


        1. MagisterLudi
          17.08.2015 15:23
          +1

          понятно, а само железо тыщ 300 стоит


          1. artoym
            17.08.2015 15:50

            Типа того. Что в общем тоже не копейки (всё ещё можно купить машину, пусть б/у и не тесла).


          1. Mrrl
            17.08.2015 16:02

            По нынешнему курсу — не меньше миллиона. Это не считая сборки и наладки.


      1. Mrrl
        17.08.2015 16:01
        +10

        Точность на больших расстояниях. 200 микрон на расстоянии 10 метров за 5 микросекунд всё ещё никто больше не даёт.
        На заказ делаются платы, металлическая основа (на неё очень жёсткие требования как по прочности, так и по реакции на изменение температуры — изгиб на 4 угловых секунды, а это 2 микрона на базе 10 см, для нас неприемлем). Ну, и сам пластиковый корпус.
        Дорогой деталью является панорамная развёртка — она должна выдержать 10 кг сканера, при этом ось не может отклоняться больше, чем на те же 4 угл.сек. И при этом поддерживать равномерное вращение на скорости до 0.01 RPM (1 оборот за 1.5 часа).


  1. encyclopedist
    17.08.2015 15:24
    +1

    Если я не ошибаюсь, известный тут Mrrl чем-то подобным занимается?


    1. Mrrl
      17.08.2015 17:11
      +12

      «Чем-то подобным» — мягко сказано, последние 16 лет занимаюсь именно этим сканером :)


  1. tzlom
    17.08.2015 15:40
    +6

    Оцифруйте 3х долларовым сканером 10 метровую трубу и ответьте на вопрос сами


  1. Finesse
    17.08.2015 15:43

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


    1. encyclopedist
      17.08.2015 15:46

      Его же можно переставлять. То есть сняли картинку из одной точки, переставили, снова сняли. А потом в редакторе картинки совмещают.


      1. klikalka
        17.08.2015 15:55

        Теоретически, я полагаю, сканер и/или софт могут совмещать «картинки» (исходные данные) на основе определения изначальных позиций. В автоматическом или полуавтоматическом режиме.
        То есть, можно добиться того что сканер сам определит, с высокой точностью, где он стоял ранее и будет достраивать сцену сам.
        Но это лишь моё мнение)


        1. Mrrl
          17.08.2015 16:06
          +2

          Теоретически можно. Но автоматическая глобальная регистрация по 3D-облакам — совсем непростая задача, это намного хуже, чем сшивка панорамы из фотографий.
          Пока совмещаем по специальным мишеням (сферы или квадраты, разделённые диагоналями на треугольники). Они ищутся довольно надёжно.
          После того, как примерное взаимное положение известно, уточнить его несложно. Если, конечно, дело происходит не в ровном туннеле.


    1. Mrrl
      17.08.2015 16:14
      +1

      Если так, то для каких целей его используют?

      На фотографиях же показано — строят модели кораблей и мамонтов :) И многого из того, что между. Лишь бы оно не двигалось, не слишком блестело, и было не очень чёрным. Хотя кто-то сканирует нефтяные резервуары изнутри…


  1. Mrrl
    17.08.2015 15:52
    +4

    Пожалуй, из лазерных сканеров дешевле будет только Faro Focus. Большинство наших конкурентов либо сравнимы по цене, либо заметно дороже, например 300K$ в мире сканеров — совсем не безумные деньги.


  1. Mrrl
    17.08.2015 16:49
    +5

    Большая часть стоимости (почти половина) — пересылка, таможня, оплата посредникам… В Штатах он в 1.5-2 раза дешевле.


  1. Sketch_Turner
    17.08.2015 16:57

    У Autodesk был проект облачного 3D-сканирование и построения модели, используя только вашу веб-камеру. Выходило весьма годно.Причем сразу строилась и модель, и проводилось текстурирование.


  1. Mrrl
    17.08.2015 17:30
    +2

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


    1. MagisterLudi
      17.08.2015 17:31

      надо попробовать


    1. webkumo
      17.08.2015 18:22

      А каким лучём (какая частотно-волновая характеристика луча лазера) он меряет? Надо же учитывать, чтобы стекло/другой материал для этого луча было прозрачным, а отражающая поверхность — отражающей (а не поглощающей)…


      1. Mrrl
        17.08.2015 18:31

        Сканер, который на фотографии (25-я модель) — красным лазером, 685 нм. Так что зеркало будет работать, как надо. Модели 105 и 10 будут на 1550 нм, для них, вроде бы, тоже всё в порядке. На ультрафиолетовый лазер пока переходить не планируем, он слишком агрессивный (и к фотоприёмнику, и к пользователям). Но и там такое тонкое стекло было бы достаточно прозрачным.


        1. encyclopedist
          17.08.2015 18:47

          А насколько они безопасны для глаз? (При случайном попадании, а не постоянно в него смотреть конечно).


          1. Mrrl
            17.08.2015 18:59

            Те, которые выпускаются — безопасны. Класс 3R (не знаю точно, что это значит). Но я всё равно стараюсь при сканировании в упор не смотреть. Хотя иногда бывает, что лучик попадёт, тогда на скане видна точка где-то в глубине глаза (сетчатка?)


            1. Meklon
              17.08.2015 19:09

              Вероятно, хрусталик.


            1. Raegdan
              17.08.2015 23:52

              Третий класс это достаточно злые лазеры. Осторожнее с ним. Возрастание класса — возрастание мощности. Первый класс — указка за 50 рублей, непишущий сидюк. DVD резак — насколько помню, второй. Блюрей-резаки — третий или даже четвёртый класс, а из них собирали турели против насекомых.


              1. Mrrl
                18.08.2015 06:52

                3R — те, которые безопасны, пока движутся. Их пятно проходит по зрачку довольно быстро, и вреда нанести не успевает. После чего зрачок сужается, и света в него попадает ещё меньше, даже, если луч снова проходит по тому же месту.


  1. Mrrl
    17.08.2015 19:06


    1. xakpc
      17.08.2015 19:17

      миллион баксов на полочке стоит )


      1. Mrrl
        17.08.2015 19:19
        +4

        Что характерно, большинство пришли на техобслуживание. Деньги давно получены, а работать всё равно надо.


  1. Sadler
    17.08.2015 20:40
    +12

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