Решил по быстрому накидать блог на английском чтобы был. Буду туда дублировать все посты отсюда. https://xrabbit.dev
Решил по быстрому накидать блог на английском чтобы был. Буду туда дублировать все посты отсюда. https://xrabbit.dev
У меня прям горит от того что NVIDIA выпилила аппаратный энкодер h264 из jetson хотя позиционирует его как edge ai device с двумя csi портами под камеры. Софтварным кодеком нагрузка на CPU на 1080p@30fps доходит до 40% и потребление ватт сильно взлетает.
Немного изучив топик сложилось ощущение что rapsberry pi 5 тоже лишился аппаратного энкодера из за шортэджа кристаллов, но rpi4 все еще имеет его. У меня кстати он есть и использовался в роботе пока я не переработал его на jetson. На том же разрешении и частоте кадров rpi4 потребляет на больше 5W и загрузка CPU не больше 5% переваривая поток без затыков.
Теперь появляются мысли о том, что разгрузить jetson перенеся все узлы для контроля механикой и стриминг камеры с jetson на rpi объединив их в кластер не такая уж и плохая идея. Кажется что дополнительные 5W погоду не сделают но освободят все ресурсы для Хуанга.
Возникает вопрос как объединить их вместе так как где то должен подниматься сервер NATS. Ethernet + мини свитч или ethernet over usb?
Из за того что baseline стереопары довольно широкий она может измерять глубину только от 30см. Что создает слепой участок перед роботом. Терпимо но не очень приятно. Возможно можно подумать в сторону лидара или или проксимити сенсора для obsticle avoidance.
Не удержался и решил поиграться с points cloud и depth measurment. Пока попробовал самую легкую модель.
То что на экране снизу это еще не SLAM а просто stateless point cloud который с частотой 30hz паблишится из робота в nats и рисуется с помощью treejs в браузере. Чем дальше точка тем ближе она к зеленому. Это всего лишь для удобства но в кода это просто 3 или 4 мерная матрица (4 если хочется сохранить оригинальный цвет с камеры)
Из сложного оказалось что 1280x720 слишком тяжело и просто байтовый блоб этой матрицы весит 70+Mb. Прокачивать такой массив 30 раз в секунду невозможно из за ограничения в 64Mb на сообщение и ограничения канала. Уменьшив разрешения до 320p и сжав его zlib получилось получить пару сотен килобайт что выглядит ок. Плюс эта матрица sparse поэтому можно еще выкинуть нули из нее. Хотя может и нет смысла если все равно сжимать.
Теперь приходится схлопнуть все обратно в один узел который эксклюзивно имеет доступ к камере и делает все.
Из за этого идея вытекают несколько других проблем. Изначально я думал сделать несколько узлов которые работают с камерой. Из за того что к камере может иметь доступ только один процесс я подумал о локальном стриминге через ZED SDK. То есть к камере коннектится один процесс и стримит пожатый h264 поток. Так же SDK позволяет и читать все другие параметры через стриминг словно используешь камеру локально. Но проблема в том что стриминг через SDK сильно завязан на аппаратное сжатие и без него крашится и не работает.
Очередное разочарование, в NVIDIA Jetson Orin nano нет аппаратного сжатия h264.
Сегодня поймал себя на мысли что столько классных идей которые хочется попробовать реализировать при этом уже куча технического долга который тоже бы по хорошему решить сейчас.
Как минимум хочется прямо сейчас закончить механику чтобы перейти к perception.
Большой мэилстоун. Он может передвигаться и управляться удаленно.
Из проблем:
Сегодня развел все провода и компоненты. Пришлось 5 раз его разобрать и собрать заного потому что каждый раз какая то новая херня возникала.
Из хорошего батарея вообще огонь. Во первых может пропускать ток когда подключена к зарядки и может заряжаться и питать робот одновременно.
Завайрил контроллер задних моторов, сенсор напряжения, 2 step down регулятора, один для серво руля, другой для моторов и контроллера и запустил от батареи. Кажется ничего не задымилось, хороший знак.
Перфекционизм - главный враг продуктивности
Слегка напоминает на робота из фильма «ВАЛЛ-И». В целом я доволен как выглядит и как все влезло. Теперь надо подключить провода и проверить что все работает.
Батарея конечно делает его горбатеньким а стереокамера добавляет выражение лица. С рукой будет еще забавнее смотреться. Перед немного пустоват но там будет контроллер руки. В будущем еще будет лидар но это чуть позже. Проблема что камера имеет предел измерения глубины от 30см, то есть прям перед роботом у него слепая зона. Эту проблему надо будет тоже как то решать.
Собрал все вместе но еще не соединял провода. Хотел увидеть как это будет смотреться в сборке. Пока без руки, ее добавлю чуть позже или пока вообще отложу до следующего мейлстоуна.
Дальше четырехканальная INA. Про нее чуть позже напишу. Сегодня запаял 4 шунта по 0.01 Ом для измерения тока и напряжения на разных узлах.
С jetson чуть посложнее так как у него нет отверстий на dev board. Пришлось просверлить дырки, надеюсь ничего не задел и он все еще работает.
Получилась такая пластина со стендоффами на которые буду монтировать компоненты.
После этого нарезал резьбу чтобы не закручивать гайки с обратной стороны.
CAD я не осилил и решил все разрисовать в Figma. Почти на все компоненты были даташиты с размерами но некоторые пришлось измерять вручную чтобы точно разместить отверстия. Потом сходил к Денису и распечатал расположение компонентов и дырок. Приклеил к листам которые нарезал лазером и просверлил отверстия.
Сегодня весь день не выходил из дома и занимался роботом. После 2 недель без прогресса снова загорелся и продвинулся неплохо так вперед. Нашел оптимальный лейаут компонентов чтобы минимизировать провода и уместить все компакненько.
Весь робот в сборке будет около 3.5кг. Нифигово так конечно.
Медитативное занятие нарезание резьбы.
Есть конечно еще шанс что спеки батареи врут и в реальности она отдает гораздо меньше. Очень не хочется этого потому что возвращаться на RC lipo с большой токотдачей из за возни с зарядкой BMS и всякими другими защитами и безопасностью.
Попробовал еще несколько heavy workloads. Jetson стабильно репортит «System throttled due to over-current». Я сомневаюсь что она жалуется на слишком большой ток вызванный включение GPU. Скорее всего это просто стандартная ошибка защиты и реальная проблема - under voltage. Батарея по спекам должна спокойно отдавать 10A а в пике даже больше что должно хватить за глаза джетсону. Прична может быть в слишком тонких и длинных проводах. Я купил barrel jack не глядя на толщину кабелей. Приехали AWG22 метровой длины. Падение напряжения на таком сетапе при скачках тока может доходить до 1V что точно будет заметно и скорее всего jetson включает throttling даже несмотря на то, что напряжения ему хватает.
На выходных попробую померить токи и напряжения при разной нагрузке. В лучшем случае обрежу провода. Если не поможет и причина реально в проводах то надо будет уже в 4 раз заказать новый barrel jack с AWG18.
В SDK есть модели для построения point cloud которые будут полезны для SLAM (одновременная локализация и маппинг) когда робот определяет свое положение и поддерживает карту местности.
В камере еще есть IMU. Акселерометр гироскоп и магнитометр.
Немного поигрался с depth estimation.
При устанвке ZED SDK он решил что надо оптимизировать neural depth models что повысило потребление до 7W и 1.4A
При минимальной нагрузке на режиме питания MAXN_SUPER потребление не больше 1A. Попробую нагрузить его камерой и посмотреть сколько он один проработает от батареи.
С 3 раза заказал правильный барель джек для питания и dupont коннекторы. По быстрому обжал и проверил как оно работать. По спеке dev борда может питаться 9-20V. Батарея на 96% выдает 16.2V что в пределах поэтому можно питать без step down конверторов.
Как же бесит что nvidia так хреново тестирует jetpack. Вчера я окончательно сломал свой jetson и решил заново его прошить. После часа свежий jetpack не смог запустить chrome и любой другой браузер. После пары часов разговоров с chat gpt и claude ни к чему не пришел кроме как установить chrome из flatpak.
Решил попробовать gemini + deep research сегодня с утра и оно прям 🔥. Проблема в snap и самый простой способ решить ее откатом snap на версию назад. Это уже второй раз когда очень простой юзкейс ломается в jetpack и решается простым откатом версий.
Из других обновлений так же дождался 5G гейтвей. Уже разобрал так он более компактный и удобнее крепить плату на стендоффы на корпус робота. Думал в комплекте будут GNSS и 5G антенны но их не оказалось, придется заказывать отдельно.
Забрал сегодя послыку из штатов в которой пришла стереокамера ZED 2i. Выглядит она конечно офигенно. Моя версия с фокусным расстоянием 2.1mm, я подумал что в помещении это будет чуть лучше чем 4mm. Из интересных оснобенностей:
Решил немного обновить интерфейс и порефакторить кода. Хочу сделать UI в ретро стиле и немного пиксель арта. Накидал базовых компонентов, определился с шрифтами, накидал встроенный отладочный терминал (думаю использовать его для отправки кастомных сообщений в nats) и добавил няшный лоадер.
Плюс для сенсоров и телеметрии nats -> telegraf -> influxdb -> grafana просто офигенно просто
После пары дней которые я просидел с nats я в восторге от него. Настолько простой, легкий и удобный что я не понимаю как я до сих пор не пересекался с ним. У меня ощущение что это nginx из мира pubsub.
Вздохнул свежим воздухом и перешел полностью на nats. Это мне дало:
выкинул webrtc (это прям гигантский кусок)
сигналинг сервер для webrtc
ros2 (куча кода)
странные билд скрипты для того чтобы запускать ros2 в докере и локально
на клиенте теперь websocket и nats
доступ ко всем топикам на клиенте
отсутствие сборки кастомных сообщений
видео передаются как кадры отдельными сообщениями
все отлично работает в докере и мониторится стандартными средствами типо prometheus и influxdb
узлы робота на любом языке в том числе typescript
кода стало в разы меньше, нет непонятных автосгенерированных файлов, все чистенько и аккуратно
выкинуть ros2 стало лучшим решением
почти все библиотеки обработки изображений, slam и навигации доступны как библиотеки и не привязаны к ros2 что не будет блогером их использования
из минусов пришлось отказаться от foxglove, но я думаю что попробу написать для него bridge
Может быть когда нибудь я сформулирую свои мысли и постараюсь максимально нейтрально описать все свои претензии к нему но пока мне лень.
Вчера я удалил полностью из репозитория весь код который я и ллм написали за неделю (несколько тысяч строк).
Спустя примерно неделю изучения и ROS2 как фреимворка и экосистемы я сдался и пока забил на него. Меня удивляет как это стало стандартом индустрии. Я попробовал отделить ощущения которые я испытывал из за отвержения чего то нового от реальных сложностей которые новички испытывают при изучении ROS2.
Оно настолько кривое и бойлерплейтное что становится плохо. Конечно экосистема, контракты, подходы бла бла бла. Но я не вижу ни одной причины его использовать кроме как в целях изучения и выписывания строчки в свое резюме.
Начинается веселье с jetson orin nano. Свежий docker не работает и падает с ошибкой:
failed to solve: process "/bin/sh -c uv sync" did not complete successfully: failed to create endpoint laixim2p0a4udq2v8p15ez4p2 on network bridge: Unable to enable DIRECT ACCESS FILTERING - DROP rule: (iptables failed: iptables --wait -t raw -A PREROUTING -d 172.17.0.2 ! -i docker0 -j DROP: iptables v1.8.7 (legacy): can't initialize iptables table `raw': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
https://forums.developer.nvidia.com/t/iptables-error-message/333007
Советуют
downgrade the docker to avoid the error
Я понимаю этого автора: My Problems with ROS 2 and Why I’m Going My Own Way (and Salty About It)
На сегодня пока все. Он все еще не ездит но кажется что следующий мэилстон уже виден.
При этом серво руля подключается через PCA9685 и напрямую к пинам jetson. Но распаивать много проводов не очень хочется поэтому купил i2c expansion board. Удобно еще добавлю i2c. К тому же ground гребенка оказалась очень удобной чтобы замкнуть все GND вместе на всех платках.
Хочу 4 таких сенсора. Один между роботом и батареей, и 3 других после step down dc конверторов:
4 сенсора и все они по умолчанию имеют один и тот же i2c адрес. Это можно поменять запаяв перемычки на breakout плате. Но мне не очень нравится. Поэтому я купил i2c multiplexer. Изначально я думал что этот мультиплексор работает как роутер и поддерживает виртуальные адреса. То есть например сам мультиплексор имеет адрес 0x40 и поддерживает внутреннее виртуальные пространство адресов и позволяет подключать чипы с одними именами обращаясь к ним по индексам групп пинов при этом можно писать и читать во все устройства одновременно. Но это работает не так. По сути это просто 8 канальный свитч который программно можно переключать. Но это тоже не проблема потому что чтение со всех сенсоров можно очень просто реализовать циклом который проходит по всем включенным каналом читает показание с одного и того же адреса и записывает в ros2 топик и потом в influxdb. Все это примерно 20 строк на питоне и можно запустить в отдельном докер контейнере.
Разобрался как работает ina226 - сенсор тока который можно читать по i2c. Все достаточно несложно но по умолчанию в китайской breakout board идет R100 шунт что слишком много для измерения токов больших 819.175 mA. Хотя мощности хватает и с ним ничего не будет но данные будут отрезаны. Но это очень просто пофиксить перепаяв шунт на R010 (мΩ). После этого за счет падения точности можно будет мерить токи до 8.2A. Это конечно оверкилл то но 0.8A тоже слишком мало. Заказал R010 2512 (в SMD форм факторе) на алике потому что в jaycar как обычно ничего нету.
Заказал новые с Амазона уже нужного размера. Через несколько дней пришли такого же размера🤦♂️ как блин так получается?
Надо написать setup.sh чтобы бутстрапить робота с нуля. В четвертый раз настраивать ssh, wg и все пакеты я не осилю.
Прикинул все платы на акриле и закрепил некоторые из них на стендоффы. Вроде все влезло, но надо будет еще подумать над лейаутом.
Еще сегодня забрал порезанный лазером акрил. Получилось идеально и очень аккуратно. Для этой версии буду сверлить отверстия вручную, а для следующий версии разрисую в CAD все отверстия чтобы все получилось идеально.
Пытался подружить камеру от rpi с jetson но ничего не получилось. Ну да ладно, дождусь zed и тогда уже сделаю нормально.
Доехала литиевая смазка. Смазал все двигающие части.
Купил мини дрель чтобы быстро сверлить отверстия.
Чет не очень нравится как получается резать листы акрилла лобизком. Решил попробовать заказать лазерную резку.
Поменял пластиковые ступицы рулевого управления на алюминиевые и под цвет механической руки.
На сегодня все, вот так это пока выглядит, но будет еще будет еще промежуточный этаж где будет находится nvidia jetson и пара других плат.
Дальше хочу разместить все платы на акриловых пластинах. Выпилил лобзиком нужную форму, просверлил дырки и нарезал резьбу чтобы вкрутить стендоффы.
Вот так это выгляди в первом приближении. Основание яуть позже подпилю чтобы углы не выпирали так сильно.
Очень повезло с тем что отверстия на металлической пластине почти идеально совпали с v plate. Единственное для надежности просверлил пару дырок M4.
Разобрал полностью робота и начал собирать руку
Кажется пришла пора разбирать первый прототип и начать собирать новый v0.0.2
И последнее - диски по металлу и тапы для нарезания резьбы. Попробую разместить все электронику компактно и надежно.
И наконец доехали шариковые наконечники для рулевого линка. Сам линк и хабы пока не доехали. Не помню писал или нет но хочу заменить весь пластик этими металлическими апгрейдами.
Так как i2c поддерживает адресацию можно просто распараллелить пины поменяв адреса устройств. Для этого есть такой маленький и удобный 10 канальный девайс.
Из более интересного - ina226 i2c. Простыми словами сенсор напряжения чтобы читать напряжение и ток по i2c и выводить напряжение на дешборде робота. Телеметрии никогда не бывает много.
Так же продолжался с barel jack для питания jetson. Приехал не тот диаметр 🤦♂️
Так же доехали короткие провода dupont и разноцветные пины. Не терпится уже начать сборку версии 0.0.2
Каждый раз заказывая с AliExpress я получаю что то не то. Это уже становится смешно. Я хотел чуть получше развести gpio пины и заказ 40 пиновый хедер. Но вместо это получил хедер с двумя рядами по 40 вместо 40 суммарно. Окей, til.
А это безумный контроллер моторов roboclaw 2x30 который поддерживает до 30 ампер и может работать с энкодерами через uart или usb. Можно было бы наверное обойтись чем то попроще но выглядит он конечно внушительно и классно.
Силиконовые standoffs оказались невероятно удобными для монтажа плат на роботе.
Просто незаменимая вещь при прототипировании. Даже не знаю что бы без нее делал.
Немного еще фоток которые забыл запостить в самом начале процесса
Вот кстати зарядник с балансировкой для lipo который мне уже не нужен. Может быть когда нибудь займусь дронами или rc машинами тогда может еще пригодиться.
Спустя 2 дня разобрался с webrtc протоколам который собираюсь использовать для стрима картинки с камеры робота и управления роботом из браузера. Конечно это не просто http сервер с запросами и ответами. К этому моменту уже наткнулся на кучу эджкейсов и поведении при реконнектах и перезагрузках. Начинал с умного сигналинг сервера но пришел к тупому бродкасту сообщение через websocket.
Результат на экране. Терминал снизу слева это скрипт на питоне который шлет offer, браузер слева - ui робота к которому подключен dualsense. После установки соединения команды с джойстика отправляются через webrtc в python скрипт через data channel и там пока просто логируются.
Очень долго пытался подружить эти rpi csi камеру с ubuntu но нифига не получилось. Решил попробовать с официальным линуксом для rpi и все завелось с первого раза. Видимо долго еще я буду с ней мучаться пока не накоплю денег на zed 2i. Плюс у jetson немного другой разъем под csi и придется заказывать переходник.
GPD WIN4 выглядит как идеальный контроллер для робота. Цена конечно конская но полноценный компьютер с клавой довольно привлекательный.
Вот кстати jetson в recovery mode при перепрошивке. Для перевода в этот режим надо замкнуть 2 контакта.
Она довольно тяжелая и высокая, поэтому придется завести ее на 3 этаж. Для установки PCB купил оргстекло и вырезал лобзиком такую же форму что и металлические пластины чтобы можно было просверлить дырки просто в любых местах.
Так же я взял V plate к ней чтобы надежно закрепить его на роботе.
Насчет питания. Изначально я думал использовать rc lipo на 7000mah но решил отойти от этой идеи. Меня немного напрягает что эти батареи могут быть (хотя и маловероятно) довольно опасными. Заряжать их надо под присмотром, в них нет встроенного BMS. Но они дают куда больший ток разрядки (мне скорее всего не надо будет > 10А) и намного легче чем стопка 18650. Долго выбирал и в итоге наткнулся на V mount батареи которые используются в профессиональной видеосъемке. Это уже собранные аккумы 18650 со встроенной BMS. Они могут выжать 14.45В при 14А что выглядит более чем достаточно при этом имеют очень неплохой объем.
В конечном итоге увидел этот заветный экран. В итоге система грузится с nvme и кажется все работает. Теперь надо перенести все что есть на новую платформу и подключить и распаять все провода.
Смог прошить его только с 3 раза, при этом каждый раз это занимало минут 30. Каждый раз отваливалось что то новые. Оказалось проблемы были из за wireguard, ufw то ssh отвалится.
В итоге вернулся к варианту с nvidia sdk manager
Для этого использовал свой cube с ubuntu. Из за того что у cube только 1 слот под nvme m.2 пришлось загружать систему со флешки используя try ubuntu. После этого поправил конфиги лоадера и bios. Но система отказывалась загружаться. Посидев часа 2 с ChatGPT так и не смог пофиксить это.
Потратил 2 дня чтобы поставить L4T на jetson. Это оказалось куда сложнее чем я думал. Сначала наивно полагал что смогу просто нарезать образ для SD карты на nvme и подправить BIOS чтобы загрузиться с него но это не получилось.
Обзовется NVIDIA Jetson Orin Nano super dev kit. Пока не столько из за того что уперся в потолок rpi4 а скорее чтобы представлять размер и будущее расположение печатных плат на роботе.
Расписал и разрисовал немого схему и план того что делаю чтобы не теряться во всем этом
Нашел свои оригинальные кулачки: RC 02013 02014 02015 Plastic Steering Hub
Чтобы понимать примерно лейаут располжения компонентов надо было примерно определиться с батарей. Пока остановился на следующих моделях из котрыйх скорее всего посмотрю на Gens Ace Redline 4S от 5000mAh с bullet разъемом. Хотя мне не надо такой большой ток разрадки но найти что то меньше с похожим объекмом сложно. Gens Ace Redline 4S
Кривая разряда батарей не совсем линейная но тем не менее можно примерно оценить оставшийся заряд в процентах. Этот экран будет стоять на роботе чтобы примерно представлять не глядя в UI. Для отображения телеметрии на дешборде надо будет добавить делитель напряжения и АЦП. Он будет через I2C отправлять данные на rpi где уже будет простая математика чтобы посчитать проценты по вольтажу и отправлять данные в топик ros2. Откуда оно уже будет читаться дешбордами или контролплейном.
На реле можно задать параметры напряжения UP/DOWN. Реле включается если напряжение больше 11.4V и выключается при напряжении ниже 10.5V. Такой своеобразный гистерезис чтобы не мигать при переходе через порог.
Возвращаясь к электрике. Собрал на коленке то, как хочу сделать электрику. Идея использовать реле для отключения и включения цепи только в пределах каких то порогах чтобы предотвратить переразряд батареи. И для бонуса отдельно включать каждый компонент независимо для облегчения тестирования и прототипирования.
Еще одна рандомная мысль что можно загонять машину в дрифт за счет этого. Никогда раньше об этом не задумывался но когда делаешь это своими руками приходит осознание вещей которые раньше казались банальными.
Кажется я начинаю уходить в сторону и распыляться на такие штуки. Это не плохо но надо бы сначала доделать базовую кинематику и уже потом заниматься такой тонкой доработкой.
Пока искал детали подумал зачем мне нужно 2 мотора сзади и почему просто не оставить один и поставить ось или дифференциал. Но потом пришла идея немного регулировать скорости вращения колес в зависимости от поворота руля. По сути тот же дифференциал но электронный. Например при повороте вправо слегка замедлять скорость правого мотора. Реализовать это тривиально надо только подобрать хорошую функцию так как оно вроде не линейное.
Будет классно конечно переделать весь руль и избавиться от пластика совсем
С линками тоже нет проблем и стоят копейки
Надо посмотреть по размер и форме но найти алюминиевый или медный кулачок вроде не проблема.
Немного подбешивает что steering knuckle и steering linkage пластиковые и хлипкие. Особенно кулачок в steering linkage. Мне кажется я уже сорвал с него резьбу пока несколько раз разбирал рулевой механизм пока настраивал и менял серво. Решил посмотреть что есть на алике и открыл для себя целый новый мир.
Ах да, пока не забыл надо будет в баннингс купить какой нить металлический бокс для хранения lipo и обшить его огнеупорным материалом. Просто чтобы успокоить моего параноика.
Думаю купить несколько акриловых пластин и вырезать в аккурат с этой пластиной чтобы было аккуратнее и сделать многослойную вафлю и маунтить компоненты с обоих сторон.
Я освободил переднюю часть чтобы чуть позже установить туда руку и как видно сейчас становится тесновато. Надо будет на выходных сгонять в баннингс и купить акриловые пластины и заменить прототипные борды ими. Идея с прототип бордами оказалась бесполезная потому что один хер на ней не паяю ничего.
Так же дождался наконец то с алика 3 штуки которые хотел спаять до перевода робота на lipo 4s
Слево discharge контроллер с экраном на который можно вывести напряжение и процент заряда и эстимейт по времени если задать параметры батареи. При достижении нижнего порога реле обесточивает цепь чтобы не переразряжать батарею. Это не очень полезно для lipo.
Снизу просто массив выключателей чтобы можно было питать все ноды по отдельности и выключать некоторые при необходимости. Их уже сейчас 4 а скоро будет минимум 8.
И справа АЦП (ADC) чтобы воткнуть его в цепь уже считывать напряжение на rpi и слать в топик ros2. Чтобы няшно отображать уровень батареи в UI.
Как видно отзывчивость руля в разы увеличилась. Так же bldc намного тише.
Заменил дешевый серво новым от гоночного rc для более быстрого и точного руля.
Список покупок:
Как раз у меня еще много свободных пинов в в PCA9685.
Идея разместить ее на 2 серво чтобы управлять обзором через стик джоя. Называется это pan tilt servo kit.
Нашел у себя CSI камеру для rpi которую купил для какого то проекта но никогда не использовал. Попробовал подключить и написать простенький webrtc сервер чтобы стримить поток в браузер на девайс с джоем. После 3 часов пока что получил только зеленый экран.
Dualsense отличный джой но там нет экрана что не очень удобно. Кажется неплохой кандидат - анберник на линуксе и запуск UI в вебе rg552
На следующей неделе попробую перевести проект на ros2 но без их сборщика и структуры проекта. Попробую использовать docker и ros2 как библиотеку.
Идея что джой шлет события в трубу и другие ноды просто подписываются на топики и реагирует прекрасна.
Вообще приходит потихонечку осознание причин по который ros2 похож на микросервисы с трубами. В моем скрипте не очень удобно что компоненты сильно зависят друг от друга и знают все обо всех.
Есть еще docker compose watch mode но пока чет не разобрался с ним, может вернусь попозже
Перевел весть проект на docker compose и uv стало попроще менеджить зависимости и можно удобно прокнить девайсы через маппинг:
services:
rabbit:
build: .
volumes:
- ./src:/app/src
devices:
- '/dev/input/event0:/dev/joy'
- '/dev/ttyAMA0:/dev/roboclaw'
privileged: true
command: uv run /app/src/main.py
stdin_open: true
tty: true
Надо бы закрепить PCBишки на vertical/horizontal mount на акрилловую или другую пластину на которой можно будет легко сверлить отверстия и прикрутить к ней другие компоненты. При этом шасси робота не будет сверлиться и не будет повреждено в случае переделки.
По идее можно заменить моторы и поставить bldc но надо будет менять контроллер.
Первая поездка. Руль немного не сбалансирован, угол поворота слишком маленький, надо бы увеличить и подрегулировать импульсы pwm. Моторы чет медленные, надо или увеличить колеса или взять другие редукторы. Но в целом очень рад что он поехал.
Сервы я уже тестировал до этого но сейчас нормально подключил к контроллеру и допили питон скрипт.
Для питания LM2596 step down dc dc на 6V
Управлять сервой буду через PWM, i2c и PCA9685
Серво у меня 1501MG довольно дешевая и громкая. Как придет поменяю но пока что есть.
А да, я сначала начал писать код прямо на rpi через ssh но многие вещи не работали нормально в vscode поэтому решил разрабатывать локально на mac но синкать файлы с помощью mutagen. Довольно простая и классная тулза. Еще один инструмент в тулбокс.
Теперь надо заняться серво и подружить его со стиками.
Я добавил настроку в 1с таймаута в roboclaw чтобы моторы останавливался если контроллер не получал команды в течении 1 секунды. Это надо чтобы избежать залипаний если вдруг программа крашится или есть как то баг.
В итоге получился просто питон скрипт с 3 классами (rabbit, joy и roboclaw) и 2 треда с циклами (один слушает джой обновляя стейт, другой посылает команды в бесконечном цикле в roboclaw по UART)
При подключении всего робот поехал назад а не вперед, но исправляется просто умножением на -1 или перестановкой проводов.
Подключить контроллер оказалось просто и завелось все с первого раза. На R2 курок думаю сделать движение вперед. Диапазон значений от 0 до 255 можно нормализовать для диапазона для roboclaw (-32767, 32767) простой формулой.
Для управления через PS5 dualsense пока решил не заморачиваться с bluetooth тем более что конечная цель - управление через интернет для bluetooth.
Вообще интересно вспоминать все что когда проходил в школе, универе и слышал от папы и применять это в реальном мире.
Резисторы для 5V -> 3.3V делителя. Пришлось вспомнить закон Ома 🤔
Первый запуск прошел не очень удачно так как один провод был плохо спаян и долго искал проблему но после прозванивая мультиметром нашел косяк и все завелось.
Сначала думал питать rpi напрямую от gpio 2 или 4 но решил отказаться от этой идеи чтобы случайно не спалить. В итоге взял степ даун регулятор polou 5V D24V90F5 и распаял usbc кабель чтобы соединить их. Наверное это тоже можно сделать чуть аккуратнее.
До этого еще распаял делитель напряжения чтобы соединить RX rpi и roboclaw из за того что они работают на разных уровнях: 3V и 5V. Но уже заменил на понижайку.
Для сервы добавил LM2596 и настроил его на 6В как посоветовал папа. Надо будет заказать еще несколько таких только с экранчиком чтобы было удобно мониторить вольтаж без мультиметра.
Распаял общий GND для всех элементов по дупонт пины
Немного пришлось увеличить дырки под M3
rpi я разобрал сняв с него heating sink но наклеив радиаторы
Возвращаясь назад к плате. Я очень удачно заказал с амазона нейлоновые стендоффы. Во первых я пофиксил рулевой механизм немного удлинив плечи. Во вторых с помощью них очень удобно разместить все pcbишки на прототипной борде.
Про это немного позже, но оказалось что забыл повысить ограничение по току в блоке питания когда тестировал запуск робота в первый раз. В итоге при тестировании джойстика когда резко ражимал на курок ток скакал и rpi вырубалась. Немного посидев с логами нашел:
May 25 01:36:39 rabbit kernel: hwmon hwmon2: Undervoltage detected!
May 25 01:36:41 rabbit kernel: hwmon hwmon2: Voltage normalised
что говорит о проблеме. Попробую поднять максимум до 3 - 4 А и посмотрим как пойдет дело.
Сегодня прям неплохой прогресс. Купил 3 прототайп борты и соединил вместе.
Пока думаю остановиться на prototype board и пока все собрать на ней. Хотя бы будет понятен лейаут и будет чуть проще потом разложить все.
Серво тоже работает, но жду более тихий и точный brushless-серво с AliExpress. Как приедет - заменю.
Пока конечно все на соплях и макетке - надо наверное все это распаять на нормальном текстолите с правильными дорожками вместо проводов. Но сначала надо хотя бы заставить это все ехать. Один шаг за раз!
Проблема была в том, что я по глупости купил TXB0104, думая, что этот преобразователь уровней заработает с UART и позволит подключить RX RoboClaw (который работает на 5V), но не получилось. Отключил и оставил только TX 3.3V от Raspberry Pi.
Наконец-то запустил двигатели через UART! Первый признак жизни.
RoboClaw не останавливается, если скрипт крашнулся - опасно! Надо обязательно включать RC timeout и слать команды в цикле.
Узнал, что есть 2 способа работать с DualSense из браузера: Gamepad API (стандартный, но ограниченный) и WebHID API (полный доступ к всем фичам).
Как оказалось, у Raspberry Pi всего один PWM-выход, что ОК для тестов, но я все-таки заказал 16-канальный PWM-драйвер PCA9685, чтобы уж наверняка на случай, если еще добавлю серво. Лучше переборщить, чем потом паять костыли.
Планировал сегодня запустить рулевой серво и попробовать его повернуть через Raspberry Pi, но Amazon не довез олово, и придется подождать с пайкой.
Заказал с AliExpress и Amazon некоторые базовые компоненты и инструменты для сборки.
Решил немного вспомнить, как держать в руках паяльник, и совместить это с теми знаниями, которые накопил, работая фулстеком. Хочу построить робота с управлением через интернет и рулевым управлением Аккермана. Вторым шагом - поглубже погрузиться в ROS2 и автономную навигацию.