Подключение камеры и запись таймлапсов в Klipper

13 января 2025

В 3D-принтерах под управлением Klipper есть возможность подключить камеру. Это позволяет следить за ходом печати удаленно, а также записывать таймлапсы. Рассмотрим настройку всего этого дела на примере моего Flying Bear Ghost 6.

Среди 3D-печатников популярна камера Logitech C270. На онлайн-барахолках она стоит 500 рублей. Logitech C270 обеспечивает адекватное качество видео. Она не занимает много места. Потребляемый ток составляет 100 мА. Для камеры существует модель крепления с возможностью поставить широкоугольную линзу.

Крепление распечатывается на 3D-принтере пластиком PETG. Оно состоит из резьбы для линзы M12, корпуса и магнитного кронштейна. Кронштейн использует круглые магниты 10x5. Рекомендую устанавливать их в последнюю очередь. Магниты сильные и притягивают как крепежные винты, так и отвертку. Помимо магнитов понадобятся нейлоновые стяжки, а также винты, шайбы и гайки M3. Общая стоимость апгрейда не превышает 15$.

Камеру разбираем и достаем плату. С платы снимаем объектив. Ставим на его место резьбовое соединение под широкоугольную линзу:

Крепление широкоугольной линзы для Logitech C270

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

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

Logitech C270 с новым объективом, новым корпусом и магнитным кронштейном:

Веб-камера Logitech C270 в принтере Flying Bear Ghost 6

Фиксируем камеру на корпусе 3D-принтера. Соединяем с одноплатником по USB.

Теперь нам нужно настроить стример видео. Разработчики Fluidd рекомендуют Crowsnest. Устанавливается он через KIAUH:

./kiauh/kiauh.sh

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

Нужно выяснить, как камера определилась в системе, а также какие разрешения и прочие настройки она поддерживает. В этом нам поможет пакет v4l-utils:

sudo apt install v4l-utils

# список доступных устройств
v4l2-ctl --list-devices

# список доступных форматов
v4l2-ctl -d /dev/video1 --list-formats

# список поддерживаемых разрешений и частот кадров
v4l2-ctl -d /dev/video1 --list-formats-ext

# доступные параметры камеры - яркость, контрастность и т.п.
v4l2-ctl -d /dev/video1 --list-ctrls

# текущее значение параметра NAME
v4l2-ctl -d /dev/video1 --get-ctrl=NAME

# установить параметр NAME в значение VALUE
v4l2-ctl -d /dev/video1 --set-ctrl=NAME=VALUE

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

ls -la /dev/v4l/by-id/

Видим символьные ссылки вроде:

usb-046d_C270_HD_WEBCAM_200901010001-video-index0 -> ../../video1
usb-046d_C270_HD_WEBCAM_200901010001-video-index1 -> ../../video2

Заходим во Fluidd и открываем crowsnest.conf. Редактируем секцию [cam 1]:

[cam 1]
mode: ustreamer
port: 8080
device: /dev/v4l/by-id/usb-046d_C270_HD_WEBCAM_200901010001-video-index0
resolution: 1280x720
max_fps: 30

Пример установки дополнительных параметров есть в документации.

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

Нажимаем Save & Restart. Далее открываем Settings → Cameras → Add camera. Параметры указываем следующие:

Добавление камеры во Fluidd

Есть два варианта: MJPEG Stream и MJPEG Adaptive. В первом случае стример шлет видео клиенту с указанной частотой кадров. Если клиент не успевает забирать видео, то растет лаг. Притом, определить величину лага на клиентской стороне не представляется возможным. Во втором случае клиент сам забирает по одному кадру с той скоростью, с какой может. Имеются накладные расходы на лишние запросы по HTTP, зато лаг минимальный. Рекомендую MJPEG Adaptive.

Fun fact! Crowsnest также поддерживает аппаратное кодирование в H.264, однако на данный момент это работает только на одноплатниках Raspberry Pi. Насколько оправданно ради лучшего кодирования видео ставить в 3D-принтеры «малинки», принимая во внимание стоимость последних — вопрос дискуссионный.

Виджет камеры должен появиться на главной странице Fluidd:

Отображение видео с камеры во Fluidd

На скриншоте показано качество картинки ночью, когда свет в комнате выключен. Работает только светодиодная подсветка 3D-принтера и ее отражение от купола. Теперь можно следить за печатью по Wi-Fi хоть с компьютера, хоть со смартфона.

Для записи тайлапсов необходимо поставить плагин к Moonraker:

git clone https://github.com/mainsail-crew/moonraker-timelapse.git
cd ~/moonraker-timelapse
make install

В процессе работы скрипт предлагает установить ffmpeg. Соглашаемся.

Во Fluidd открываем printer.cfg и дописываем:

[include timelapse.cfg]

В moonraker.conf добавляем:

[timelapse]

Нажимаем Save & Restart.

Настройки таймлапсов доступны в Settings → Timelapse. Помимо прочего, здесь можно выбрать между режимами Hyperlapse и Layer Macro. В первом случае снимок с камеры берется раз в заданный интервал времени, а во втором — при переходе на новый слой. Первый вариант может быть выгоден при печати плоских моделей. Второй интересен тем, что на видео голова принтера склонна оставаться примерно на одном месте, перемещаясь «вверх» по шву модели.

Еще здесь можно настроить парковку головы перед снятием каждого кадра. Идея совершать лишние перемещения ради красивого видео не кажется мне удачной. Подозреваю, что эта настройка в основном существует для «дрыгостолов», где иначе снимать таймлапсы может быть проблематично. Мой 3D-принтер имеет кинематику CoreXY. Неплохие таймлапсы получаются и без парковок.

Был выбран режим Layer Macro. В отличие от Hyperlapse, ему требуется помощь со стороны слайсера. Открываем OrcaSlicer. В свойствах принтера переходим во вкладку Machine G-code, в ней находим Before layer change G-Code.

Добавляем строчку:

TIMELAPSE_TAKE_FRAME

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

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.