<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
  <title>Robot Rabbit</title>
  <subtitle>Дневник сборки Rabbit, маленького робота с рулевым управлением Аккермана: Jetson и камера ZED, NATS, автономная навигация и исследование квартиры, свои платы и приводы. Короткие посты с фото, графиками и кодом.</subtitle>
  <link rel="self" type="application/atom+xml" href="https://rabbit0.dev/ru/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/"/>
  <id>https://rabbit0.dev/ru/</id>
  <updated>2026-10-12T00:00:00+11:00</updated>
  <author>
    <name>Sergey Alekseev</name>
    <uri>https://www.linkedin.com/in/seralexeev</uri>
  </author>
  <icon>https://rabbit0.dev/icon-192.png</icon>
  <logo>https://rabbit0.dev/media/og.jpg</logo>

  <entry>
    <title>#195 · Параллельно с deeproute попробовали научить нейросеть…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/195/"/>
    <id>https://rabbit0.dev/ru/p/195/</id>
    <published>2026-10-12T00:00:00+11:00</published>
    <updated>2026-10-12T00:00:00+11:00</updated>
    <summary>Параллельно с deeproute попробовали научить нейросеть разводить платы так, как это делают люди. Все за один день, 11 октября, на арендованных H100 и H200 в…</summary>
    <content type="html">&lt;p&gt;Параллельно с deeproute попробовали научить нейросеть разводить платы так, как это делают люди. Все за один день, 11 октября, на арендованных H100 и H200 в Runpod.&lt;/p&gt;
&lt;p&gt;Данные: 52 233 платы KiCad с GitHub, GitLab, Codeberg и открытых бенчмарков, 6.56 млн шагов разводки. Каждую трассу человека режем на шаги «направление, длина, слой или переход» и учим модель угадывать следующий шаг. Платы, похожие на тестовые, из выборки выкинули, а Rabbit в обучение вообще не попадал.&lt;/p&gt;
&lt;p&gt;Что попробовали:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CNN по картинке 64×64 вокруг конца трассы: следующий шаг угадывает в 72% случаев&lt;/li&gt;
&lt;li&gt;ViT по картинке в трех масштабах: 72.7%&lt;/li&gt;
&lt;li&gt;RouteTok, трансформер не по пикселям, а по объектам платы (площадки, дорожки, отверстия), 14.6M параметров: 73.8% на 4 тысячах плат, 79.5% на 26 тысячах, 80.2% на 52 тысячах&lt;/li&gt;
&lt;li&gt;та же модель на 40M параметров: 78.4%, хуже маленькой&lt;/li&gt;
&lt;li&gt;Qwen3-0.6B как основа: с предобученными весами 66.9%, со случайными 69.5%. Знание текста геометрии только мешает&lt;/li&gt;
&lt;li&gt;DAgger: модель сама ведет трассу, а классический A* на каждом шаге подсказывает, как было бы правильно. Это лучшее, что сработало: доля соединений, которые нейросеть разводит сама, выросла с 77% до 93%&lt;/li&gt;
&lt;li&gt;обучение с подкреплением GRPO: модель разводила больше соединений сама, но занимала место, и плата в целом разводилась хуже. Классический обман награды&lt;/li&gt;
&lt;li&gt;LLM, которая пишет координаты текстом: в 45 раз больше токенов, около 2% законченных трасс, бросили сразу&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Главные выводы: решают данные, а не размер модели. Точность угадывания шага почти ничего не говорит о том, разведет ли модель плату. И честно: лучшая сеть оставляет 35 неразведенных связей на 46 тестовых платах, классический алгоритм 2. Поэтому все рекорды deeproute ставит классическое ядро, а нейросети пока остаются исследовательской веткой.&lt;/p&gt;
&lt;p&gt;Цена всего этого по счету Runpod: $115.76, из них $103.69 за GPU, примерно 23-24 GPU-часа (H100 около 17 часов, H200 около 6). Одна модель на 14.6M учится примерно час на H100 и стоит пару долларов. Датасеты на диске: 64 ГБ сырых плат и около 50 ГБ подготовленных токенов.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/195-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/195-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;853&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/195-2.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/195-2-1280.webp&quot; width=&quot;1280&quot; height=&quot;533&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#194 · Плата развелась полностью: 0 неразведенных связей, 0…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/194/"/>
    <id>https://rabbit0.dev/ru/p/194/</id>
    <published>2026-10-12T00:00:00+11:00</published>
    <updated>2026-10-12T00:00:00+11:00</updated>
    <summary>Плата развелась полностью: 0 неразведенных связей, 0 ошибок DRC. В прошлый раз fastroute уперся в 24 связи и 5 ошибок, и я думал, что дальше только руками…</summary>
    <content type="html">&lt;p&gt;Плата развелась полностью: 0 неразведенных связей, 0 ошибок DRC. В прошлый раз fastroute уперся в 24 связи и 5 ошибок, и я думал, что дальше только руками.&lt;/p&gt;
&lt;p&gt;Пока он крутился, в соседнем окне Claude Code за один день написал свой трассировщик, deeproute: 14 тысяч строк на Rust, 115 коммитов. Идея другая, чем у Freerouting: все цепи разводятся сразу, им разрешено пересекаться, а за каждое пересечение растет штраф, пока они не разойдутся. Потом оставшиеся цепи вырываются вместе с теми, кто им мешает, и разводятся заново. На моей плате он за 4 минуты дошел до 15 неразведенных и 0 ошибок.&lt;/p&gt;
&lt;p&gt;Дальше два агента начали работать друг с другом. Мой агент гонял DRC и находил ошибки, deeproute после каждой правил роутер:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;силовые дорожки нельзя сужать до 0.15 мм в середине пути, только у самого вывода: сразу стало 69 неразведенных&lt;/li&gt;
&lt;li&gt;выводы контроллеров на силовых цепях это датчики, а не силовой путь, им хватит 0.25 мм: 53&lt;/li&gt;
&lt;li&gt;перекроили силовой слой по его диагностике (отдельная медь под Raspberry Pi, руку и запасной выход 5 V): 22&lt;/li&gt;
&lt;li&gt;вырывать застрявшие цепи вместе с соседями: 10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Он еще нашел, что KiCad при экспорте режет углы у L-образных площадок драйверов моторов, а я у него, что он ставит переходные отверстия в 0.04 мм друг от друга, что завод не сделает. Самое смешное: две связи никто не мог развести, потому что запретная зона вокруг выреза под шлейф камеры накрывала два резистора. Последние 10 связей добил руками и маленьким A*.&lt;/p&gt;
&lt;p&gt;Потом два независимых ревью. Питание: роутер честно ставил одно переходное отверстие там, где из заливки в слой питания идут 15 A. Добавил по 3-8 штук. Производство: медь заходила в неметаллизированный вырез, а внутренние сигнальные слои были залиты на 4% против 90% у силовых, и плата толщиной 2 мм могла выгнуться. Залил их землей.&lt;/p&gt;
&lt;p&gt;Цифры deeproute на открытом наборе из 1113 плат: 86.6% разведены чисто, у fastroute 69%, у Freerouting 66%, и в 5 раз быстрее Freerouting. Машинное обучение для роутера тоже пробовали, на 52 тысячах плат с GitHub, но рекорды выше ставит классическое ядро.&lt;/p&gt;
&lt;p&gt;Файлы для JLCPCB готовы: черная маска, металлизированный край, 8 слоев, 2 мм.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/194-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/194-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;884&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/194-2.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/194-2-1280.webp&quot; width=&quot;1280&quot; height=&quot;590&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/194-3.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/194-3-640.webp&quot; width=&quot;640&quot; height=&quot;1426&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/194-4.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/194-4-1280.webp&quot; width=&quot;854&quot; height=&quot;1600&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#193 · Плата для завода оказалась сложнее, чем думал</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/193/"/>
    <id>https://rabbit0.dev/ru/p/193/</id>
    <published>2026-10-11T00:00:00+11:00</published>
    <updated>2026-10-11T00:00:00+11:00</updated>
    <summary>Плата для завода оказалась сложнее, чем думал. Она заменяет RoboClaw, понижайки, драйвер сервоприводов и кучу проводов: STM32, два драйвера моторов, Raspberry…</summary>
    <content type="html">&lt;p&gt;Плата для завода оказалась сложнее, чем думал. Она заменяет RoboClaw, понижайки, драйвер сервоприводов и кучу проводов: STM32, два драйвера моторов, Raspberry Pi прямо на плате, у каждой нагрузки свой электронный предохранитель с измерением тока, рука xArm, 6 ToF датчиков, 3 лидара.&lt;/p&gt;
&lt;p&gt;Самое интересное началось на трассировке. Сначала взяли Freerouting: на этой плате он только раскладывал выводы под переходные отверстия 37 минут. Нашли fastroute, порт Freerouting на Rust: тот же этап за 25 секунд. Дальше гоняли эксперименты и смотрели, сколько связей остается неразведенными:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;6 слоев, силовые заливки отданы трассировщику как препятствия: 350 неразведенных после 4 часов&lt;/li&gt;
&lt;li&gt;8 слоев и заливки после трассировки: 91&lt;/li&gt;
&lt;li&gt;разделенный силовой слой, а цепи на 10-15 A только по внешней меди 2 oz: 76&lt;/li&gt;
&lt;li&gt;выкинули 92 детали из 763, обновили fastroute с 0.1.7 до 0.1.13: плато то же, но в 1.5-2 раза быстрее&lt;/li&gt;
&lt;li&gt;расширили плату до колес и удлинили хвост, +30% площади, подкрутили правила трассировщика: 56&lt;/li&gt;
&lt;li&gt;расстановку деталей с нуля сделал Fable: блок микроконтроллера ушел в хвост, вокруг мелких QFN кольцо 2 мм, между драйвером и разъемом мотора пустая полоса под медь: 27&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Интересно, что новая расстановка дала больше, чем лишние слои и площадь вместе. И Fable отдельно поймал, что дорожка 1.2 мм на 10 A сгорит, хотя DRC ее спокойно пропускает. Последние 27 связей добиваем руками.&lt;/p&gt;
&lt;p&gt;Делать будем на JLCPCB одним заказом, и руками там почти ничего: скрипт сам выгружает файлы для завода и сверяет каждую из 166 позиций со складом через их API, завод паяет все с обеих сторон. В ту же посылку едут 10 плат для датчиков, которые агент спроектировал за вечер (выяснилось, что VL53L8CX не живет от 3.3 V, нужен свой стабилизатор на 1.8 V и преобразователь уровней), и нейлоновые уголки, напечатанные там же. По прикидке ~$1.5-1.8k.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/193-3.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/193-3-1280.webp&quot; width=&quot;1280&quot; height=&quot;698&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/193-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/193-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;956&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/193-2.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/193-2-640.webp&quot; width=&quot;640&quot; height=&quot;1434&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#192 · Как устроен процесс</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/192/"/>
    <id>https://rabbit0.dev/ru/p/192/</id>
    <published>2026-10-11T00:00:00+11:00</published>
    <updated>2026-10-11T00:00:00+11:00</updated>
    <summary>Как устроен процесс. Все, что можно, это код, а агенты гоняют цикл «поправил, собрал, проверил»: механика: build123d поверх OpenCascade, живой просмотрщик на…</summary>
    <content type="html">&lt;p&gt;Как устроен процесс. Все, что можно, это код, а агенты гоняют цикл «поправил, собрал, проверил»:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;механика: build123d поверх OpenCascade, живой просмотрщик на three.js, проверка пересечений через manifold3d за 3 секунды вместо 8 минут на точных булевых операциях, рендеры для меня&lt;/li&gt;
&lt;li&gt;плата: схема и расстановка в design.py, KiCad собирает плату из скрипта, разводит fastroute (порт Freerouting на Rust, раскладка выводов за 25 s вместо 37 минут), DRC и файлы для завода через kicad-cli, склад и цены через API JLCPCB&lt;/li&gt;
&lt;li&gt;модели: Claude делает работу, независимые агенты делают ревью по даташитам, Fable дает второе мнение, Jev от TypeSafe сверял названия деталей шасси&lt;/li&gt;
&lt;li&gt;все даташиты теперь лежат в репозитории, и каждая цифра в схеме ссылается на страницу&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Главное правило: один агент делает, другой проверяет. Каждое ревью пишет отчет с номерами находок, а исправления записываются отдельно, так что видно, что нашли и что с этим сделали.&lt;/p&gt;
&lt;p&gt;И это очень классное чувство: под любую задачу программа пишется за минуты прямо по ходу дела. Понадобился 3D-рендерер, трассировщик лучей для датчиков, проверка пересечений, скрипт под склад JLCPCB, и вот он уже есть и заточен ровно под этот проект. Нам не важно, как такой код выглядит, мы его не публикуем: это одноразовые инструменты, чтобы дойти до цели. По сути, ничем не ограничен.&lt;/p&gt;
&lt;p&gt;Посчитал по логам, сколько это стоит. Со 2 по 11 октября 8 сессий за 6 рабочих дней: 3.3 млрд токенов, почти все это повторное чтение контекста из кэша, и 3.1 млн токенов ответов. Без подписки по ценам API Opus 5.5 это было бы ~$1200-1500.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/192-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/192-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;895&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#191 · Теперь дизайн робота меняют агенты</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/191/"/>
    <id>https://rabbit0.dev/ru/p/191/</id>
    <published>2026-10-11T00:00:00+11:00</published>
    <updated>2026-10-11T00:00:00+11:00</updated>
    <summary>Теперь дизайн робота меняют агенты. Модель шасси из STEP разобрали на 134 детали с именами, а все свое описано кодом на Python, так что любую правку можно…</summary>
    <content type="html">&lt;p&gt;Теперь дизайн робота меняют агенты. Модель шасси из STEP разобрали на 134 детали с именами, а все свое описано кодом на Python, так что любую правку можно собрать, измерить и проверить на пересечения за пару секунд.&lt;/p&gt;
&lt;p&gt;Самое прикольное это датчики приближения. Я сказал «хочу 8 по кругу», Claude написал трассировщик лучей: из каждой точки края платы пускает 8x8 зон датчика сквозь всю модель, с колесами, повернутыми на ±30°. Борта оказались закрыты колесами, редукторами и тягами на 20-100%, так что осталось 6 датчиков: спереди и сзади по центру и на скосах. Потом я сказал «хочу, чтобы уголки стояли ровно по краю», и плата поменяла форму: скосы развернулись ровно под датчики, нос вытянулся на 21 мм под камеру ZED 2i, а хвост на 23 мм.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/191-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/191-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;895&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/191-2.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/191-2-1280.webp&quot; width=&quot;1280&quot; height=&quot;895&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#190 · Хотел перейти на BLDC моторы, чтобы робот ездил быстрее и…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/190/"/>
    <id>https://rabbit0.dev/ru/p/190/</id>
    <published>2026-10-11T00:00:00+11:00</published>
    <updated>2026-10-11T00:00:00+11:00</updated>
    <summary>Хотел перейти на BLDC моторы, чтобы робот ездил быстрее и тише. Условие одно: drop-in, то есть встать в штатные кронштейны 37D без переделок. с Claude…</summary>
    <content type="html">&lt;p&gt;Хотел перейти на BLDC моторы, чтобы робот ездил быстрее и тише. Условие одно: drop-in, то есть встать в штатные кронштейны 37D без переделок.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;с Claude прошерстили всех, кто делает 37 мм BLDC. Готовых «как родной» с энкодером A/B нет: китайские JGB37 BLDC идут только с Холлами, Hiwonder их вообще не продает&lt;/li&gt;
&lt;li&gt;из maxon скачали весь каталог на 73 MB и разобрали в JSON все моторы, редукторы и энкодеры, чтобы подобрать комбинацию под 1.25 m/s. Победил ECX FLAT 22 + GPX 22 + ENX 22, но это €430 за штуку плюс переходная пластина, которую надо фрезеровать&lt;/li&gt;
&lt;li&gt;поставили maxon в 3D модель робота и проверили зазоры до палубы: 4.3 мм, влезает&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;А потом посчитал, что для квартиры 1.25 m/s и так хватает родным моторам. Вернулся к штатным JGB37 и просто выкинул RoboClaw, моторами теперь управляет своя плата.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/190-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/190-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;895&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#189 · Средний этаж робота теперь будет не акрилом с кучей…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/189/"/>
    <id>https://rabbit0.dev/ru/p/189/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Средний этаж робота теперь будет не акрилом с кучей модулей и проводов, а платой той же формы. Контур и отверстия под стойки сняли прямо с 3D модели шасси…</summary>
    <content type="html">&lt;p&gt;Средний этаж робота теперь будет не акрилом с кучей модулей и проводов, а платой той же формы. Контур и отверстия под стойки сняли прямо с 3D модели шасси, так что она встает на место акрила без переделок.&lt;/p&gt;
&lt;p&gt;На плате Raspberry Pi, RoboClaw, понижайки, предохранители на каждую ветку, INA4235 с шунтами, PCA9685 для руля, часы и все разъемы по краям, каждый смотрит в сторону своего устройства. Снизу пусто, там Jetson и моторы. 4 слоя, батарейная цепь держит ~16 A.&lt;/p&gt;
&lt;p&gt;Самое прикольное, что ее никто не рисовал мышкой. Плата описана кодом на Python, KiCad собирает ее из скрипта, сигналы разводит Freerouting, а проверки и файлы для завода делает kicad-cli. Поменял что-то в коде, перезапустил, получил новую плату. 5 штук с монтажом на JLCPCB выходят ~$200-260.&lt;/p&gt;
&lt;p&gt;Моторную часть специально собрали в одном углу: хочу перейти на BLDC моторы и потом заменить RoboClaw контроллером прямо на плате, не двигая все остальное.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/189-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/189-1-1280.webp&quot; width=&quot;854&quot; height=&quot;1600&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/189-2.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/189-2-1280.webp&quot; width=&quot;1280&quot; height=&quot;956&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#188 · Расчертили с Claude всю проводку для новой архитектуры…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/188/"/>
    <id>https://rabbit0.dev/ru/p/188/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Расчертили с Claude всю проводку для новой архитектуры: каждый провод, пин, протокол и сечение. Пока разбирались, нашлось несколько прикольных вещей…</summary>
    <content type="html">&lt;p&gt;Расчертили с Claude всю проводку для новой архитектуры: каждый провод, пин, протокол и сечение. Пока разбирались, нашлось несколько прикольных вещей:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;аварийный стоп у RoboClaw по умолчанию защелкивается, а вход подтянут вверх, то есть оборванный провод означает «можно ехать». Сделали наоборот: Pi держит линию, только пока жив процесс защиты, а обрыв или зависание это стоп&lt;/li&gt;
&lt;li&gt;бамперы на стоп не заводим, иначе робот, который уперся в стену, не сможет от нее отъехать&lt;/li&gt;
&lt;li&gt;в даташите RoboClaw прямо написано, что USB в шумной среде отваливается и сам не восстанавливается. Основной канал будет UART&lt;/li&gt;
&lt;li&gt;четыре ToF датчика сидят каждый на своей I2C шине, так не нужно менять адреса, и одна зависшая шина не убивает остальные&lt;/li&gt;
&lt;li&gt;LD19 сняли с производства, лидар будет RPLIDAR C1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Список покупок вышел на ~A$825, больше половины всего уже есть.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/188-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/188-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;835&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/188-2.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/188-2-1280.webp&quot; width=&quot;1280&quot; height=&quot;756&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#187 · Хочу переделать робота на новую архитектуру</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/187/"/>
    <id>https://rabbit0.dev/ru/p/187/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Хочу переделать робота на новую архитектуру. Сейчас на одном Jetson крутится все: камера, карты, навигация, база данных, веб и туннель, а 8 GB памяти на всех…</summary>
    <content type="html">&lt;p&gt;Хочу переделать робота на новую архитектуру. Сейчас на одном Jetson крутится все: камера, карты, навигация, база данных, веб и туннель, а 8 GB памяти на всех вместе с GPU. Плюс сзади робот слепой, отсюда и 70 секунд упора задом в стену.&lt;/p&gt;
&lt;p&gt;Идея разделить на мозг и тело. Jetson оставить только то, что требует GPU: камеру, глубину, локализацию, карту и планировщик. А мой старый Raspberry Pi 4 на 8 GB станет телом: моторы, руль, питание, лидар 360°, ToF датчики и бамперы, задняя камера, Forge, HUD и видео. И главное, защита от столкновений на Pi не будет зависеть от того, жив ли процесс камеры.&lt;/p&gt;
&lt;p&gt;Заодно разобрал по телеметрии питание. Понижайка на 12 V для моторов на стартах упирается в свой предел и проседает до 11.3 V, а датчик тока батареи показал 7.6 A при потолке 8.2 A, то есть пики он, скорее всего, просто обрезал. В новой схеме у каждой ветки свой предохранитель, а Pi может выключить и перезапустить зависший Jetson. И будет нормальная кнопка выключения: 93 из 104 загрузок Jetson были после того, как просто выдернули питание.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/187-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/187-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;734&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#186 · Несколько дней с Claude пытался сделать навигацию и…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/186/"/>
    <id>https://rabbit0.dev/ru/p/186/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Несколько дней с Claude пытался сделать навигацию и позиционирование точными, и теперь я понимаю, почему мой робот-пылесос такой тупой. перенес робота в…</summary>
    <content type="html">&lt;p&gt;Несколько дней с Claude пытался сделать навигацию и позиционирование точными, и теперь я понимаю, почему мой робот-пылесос такой тупой.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;перенес робота в другую комнату, и он 10 минут не мог понять где находится. Пылесос в такой ситуации честно просит построить карту заново&lt;/li&gt;
&lt;li&gt;камера иногда уверенно сообщает что робот улетел на 133 метра. Пришлось писать фильтр, который не верит прыжкам больше полуметра&lt;/li&gt;
&lt;li&gt;спереди слепая зона 30 см, сзади не видно вообще ничего. Робот 70 секунд упирался задом в стену и думал что едет. Теперь понятно зачем пылесосу бампер, который он постоянно пинает: это самый дешевый и надежный датчик&lt;/li&gt;
&lt;li&gt;исследуя квартиру робот уезжает из комнаты, не доделав углы, а потом возвращается. Ровно как пылесос&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И это одна квартира, хороший свет и робот, который знает про себя все: геометрию, радиус поворота, где камера. У пылесоса за 2000 долларов лидар, бампер и датчики обрыва, и он все равно застревает под диваном. Теперь я его уважаю.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#185 · Отдельно про то, как делили ресурсы</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/185/"/>
    <id>https://rabbit0.dev/ru/p/185/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Отдельно про то, как делили ресурсы. У Orin Nano 6 ядер и 8 GB памяти на все, включая GPU, а в начале одна камера ела почти два ядра. все прерывания сидели на…</summary>
    <content type="html">&lt;p&gt;Отдельно про то, как делили ресурсы. У Orin Nano 6 ядер и 8 GB памяти на все, включая GPU, а в начале одна камера ела почти два ядра.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;все прерывания сидели на CPU0 и он был загружен на 100%. Раскидал: USB камеры на CPU2, UART RoboClaw на CPU4, I2C на CPU5. Прерывание Wi-Fi сдвинуть нельзя, на этой платформе оно приколочено к нулевому ядру&lt;/li&gt;
&lt;li&gt;py-spy показал что 90% CPU процесса камеры это не мой Python, а оптимизатор трекинга внутри SDK. Переписывать на C++ смысла нет, его надо просто реже звать&lt;/li&gt;
&lt;li&gt;у камеры три режима: 30 fps когда что-то едет, 5 fps когда открыт UI, 1 fps когда никто не смотрит. Глубина на каждом втором кадре: GPU с 34% до 19%, потребление с 13.6 до 12.4 W. А ограничение в 15 fps наоборот убрал: CPU тот же, а поза приходит на 55 ms позже&lt;/li&gt;
&lt;li&gt;карту строит nvblox на GPU: 184 MB и ~2 ms на кадр, у встроенной карты ZED было +2.1 GB&lt;/li&gt;
&lt;li&gt;ClickHouse делал insert каждую секунду в каждую таблицу и ел 75% ядра. Раз в 10 секунд и нагрузка в два раза меньше&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Камера с 170-250% упала до 30-100%, память с 6+ GB до 4. Узким местом оказалась именно память, GPU загружен всего на 20-25%. Во время записи SVO памяти осталось мало, nvblox не смог выделить кусок на GPU и уронил процесс камеры. На Jetson видеопамять это та же оперативка.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/185-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/185-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;768&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#184 · Сказал «давай все перепишем», робот не в продакшене</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/184/"/>
    <id>https://rabbit0.dev/ru/p/184/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Сказал «давай все перепишем», робот не в продакшене. Сначала бенчмарк на записанных проездах. RTAB-Map находит себя на карте другого проезда за 0.5-2.6…</summary>
    <content type="html">&lt;p&gt;Сказал «давай все перепишем», робот не в продакшене. Сначала бенчмарк на записанных проездах. RTAB-Map находит себя на карте другого проезда за 0.5-2.6 секунды. GEN_3 в одну сторону за 6.7, а в другую не нашел себя вообще. Из 40 «включений где попало» RTAB-Map привязался в 35, один раз ошибся на 86 см. cuVSLAM считает одометрию за 2.5 ms на кадр. Но эталона пока нет, так что надо наклеить на пол метки из малярного скотча.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/184-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/184-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;486&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#183 · Задал вопрос: не изобретаем ли мы велосипед?</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/183/"/>
    <id>https://rabbit0.dev/ru/p/183/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Задал вопрос: не изобретаем ли мы велосипед? Агент сделал обзор и ответил что в навигации нет, а в локализации да. Nav2 из ROS например не умеет разные…</summary>
    <content type="html">&lt;p&gt;Задал вопрос: не изобретаем ли мы велосипед? Агент сделал обзор и ответил что в навигации нет, а в локализации да. Nav2 из ROS например не умеет разные радиусы поворота влево и вправо, так что свой Hybrid A* оставляем. А вся обвязка вокруг GEN_3 (таймауты, фильтр миллиметров, архивы карт, сбросы) это латание черного ящика, у которого одна поза одновременно и одометрия и глобальная привязка.&lt;/p&gt;
&lt;p&gt;Первый шаг: разделил позу на odom и map. Навигация теперь едет по непрерывной одометрии, а прыжки карты ее не дергают. На проезде 2.8 м с поворотом расхождение 3 мм.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#182 · Вчера были полтора часа пониженных частот и я думал это…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/182/"/>
    <id>https://rabbit0.dev/ru/p/182/</id>
    <published>2026-10-03T00:00:00+10:00</published>
    <updated>2026-10-03T00:00:00+10:00</updated>
    <summary>Вчера были полтора часа пониженных частот и я думал это throttling по току. Оказалось сам себе устроил: при отключении GNOME systemctl isolate…</summary>
    <content type="html">&lt;p&gt;Вчера были полтора часа пониженных частот и я думал это throttling по току. Оказалось сам себе устроил: при отключении GNOME &lt;code&gt;systemctl isolate multi-user.target&lt;/code&gt; перезапустил &lt;code&gt;nvpmodel&lt;/code&gt;, а тот вернул дефолтные минимальные частоты, то есть откатил тот самый &lt;code&gt;jetson_clocks&lt;/code&gt; из #164. Теперь после nvpmodel всегда запускается &lt;code&gt;jetson_clocks&lt;/code&gt;. Настоящий over-current тоже есть, но это штатная история: 1-2 раза в секунду частота падает вдвое примерно на миллисекунду, в сумме около 0.5% производительности.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#181 · Выключил робота на ночь, но перед этим выгрузил все данные…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/181/"/>
    <id>https://rabbit0.dev/ru/p/181/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Выключил робота на ночь, но перед этим выгрузил все данные дня в Parquet, и агент ночью разбирался без робота. Нашел шикарное: ZED SDK несколько секунд после…</summary>
    <content type="html">&lt;p&gt;Выключил робота на ночь, но перед этим выгрузил все данные дня в Parquet, и агент ночью разбирался без робота. Нашел шикарное: ZED SDK несколько секунд после релокализации отдает координаты в миллиметрах, хотя в настройках стоят метры. За день 21 576 таких поз. Отсюда в логах «прыжки» на 4 километра и испорченная карта с препятствиями там где робот только что проехал. Еще статус KNOWN_MAP через 5-8 секунд снова сменяется на INITIALIZING, так что «нашел себя» теперь засчитывается только после 10 секунд стабильного статуса.&lt;/p&gt;
&lt;p&gt;Фильтр получился простой: если поза прыгнула дальше чем робот мог доехать, она 4 секунды на карантине. Вернулась назад, значит это был глюк. Осталась на новом месте, значит это настоящая коррекция.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def update(self, now, position):
    if self.accepted is None or self.reachable(self.accepted, now, position):
        self.accepted = (now, position)
        self.pending = None
        return True
    if self.pending is not None and self.reachable(self.pending[1:], now, position):
        if now - self.pending[0] &amp;gt;= self.settle_s:
            self.accepted = (now, position)
            return True
        return False
    self.pending = (now, now, position)
    return False
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/181-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/181-1-1280.webp&quot; width=&quot;1040&quot; height=&quot;468&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#180 · «Подъедь к холодильнику» раньше не работало, потому что у…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/180/"/>
    <id>https://rabbit0.dev/ru/p/180/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>«Подъедь к холодильнику» раньше не работало, потому что у агента в чате не было планировщика и он отправлял робота вслепую. Теперь отдельная нода строит…</summary>
    <content type="html">&lt;p&gt;«Подъедь к холодильнику» раньше не работало, потому что у агента в чате не было планировщика и он отправлял робота вслепую. Теперь отдельная нода строит маршрут Hybrid A* по сетке проходимости, которую nvblox считает на GPU за 1-5 ms (раньше на CPU до 3 секунд). Маршрут строится за 5-30 ms и перестраивается если на пути что-то появилось.&lt;/p&gt;
&lt;p&gt;С холодильником было весело: сначала робот остановился перед углом стены, потом в 2.26 м от холодильника, а в удачной поездке 6 раз передумывал между коротким маршрутом и объездом через всю квартиру. В итоге 5.35 м за 52 секунды и остановка в 30-40 см от дверцы.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/180-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/180-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;616&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#179 · Нашли баг в ZED SDK 5.5: трекинг GEN_3 копит keyframes…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/179/"/>
    <id>https://rabbit0.dev/ru/p/179/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Нашли баг в ZED SDK 5.5: трекинг GEN_3 копит keyframes даже когда робот просто стоит. 265 штук за 9 минут, CPU с 31% до 135%, файл карты распух до 70-80 MB…</summary>
    <content type="html">&lt;p&gt;Нашли баг в ZED SDK 5.5: трекинг GEN_3 копит keyframes даже когда робот просто стоит. 265 штук за 9 минут, CPU с 31% до 135%, файл карты распух до 70-80 MB. Обходной путь: по умолчанию камера только локализуется в готовой карте, а расширяет ее только для новой карты или во время исследования. В покое процесс камеры теперь 17-45% CPU вместо 134-185%.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#178 · Поставил робота на стол и увидел в UI как он проваливается…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/178/"/>
    <id>https://rabbit0.dev/ru/p/178/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Поставил робота на стол и увидел в UI как он проваливается сквозь пол. Оценка пола считала что колеса всегда на полу и уехала вверх вместе с камерой на 69 см…</summary>
    <content type="html">&lt;p&gt;Поставил робота на стол и увидел в UI как он проваливается сквозь пол. Оценка пола считала что колеса всегда на полу и уехала вверх вместе с камерой на 69 см. Плюс глянцевый паркет и стекло давали отражение, под полом была целая зеркальная комната. Теперь новый уровень пола принимается только после метра езды по нему, а лучи глубины обрезаются по плоскости пола прямо в CUDA.&lt;/p&gt;
&lt;p&gt;Заодно карта стала из вокселей 5 см, прям как мир в minecraft о котором писал в #161. Сначала робот ехал по торчащим из пола кирпичикам: пол лежал ровно на границе вокселя и шум в ±1 см выталкивал его в ряд выше. Сдвинул сетку на полвокселя и кирпичиков стало 2% вместо 14%.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/178-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/178-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;616&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#177 · Днем в одном репо и на одном роботе работали три агента…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/177/"/>
    <id>https://rabbit0.dev/ru/p/177/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Днем в одном репо и на одном роботе работали три агента одновременно: один переносил карту на nvblox, второй делал детектор, третий голос. Договаривались…</summary>
    <content type="html">&lt;p&gt;Днем в одном репо и на одном роботе работали три агента одновременно: один переносил карту на nvblox, второй делал детектор, третий голос. Договаривались между собой сообщениями «беру камеру», «отдаю камеру» и «не деплойте, у меня образ еще собирается». Один все-таки сделал локальный &lt;code&gt;vite build&lt;/code&gt;, чужой деплой увез его на робота и публичный UI отвалился с CORS. Прямо как в нормальной команде.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#176 · Добавил голос</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/176/"/>
    <id>https://rabbit0.dev/ru/p/176/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Добавил голос. OpenAI Realtime прямо в UI, все те же тулы что и в чате, графики появляются в той же ленте. Сначала он отвечал только по-английски, потому что…</summary>
    <content type="html">&lt;p&gt;Добавил голос. OpenAI Realtime прямо в UI, все те же тулы что и в чате, графики появляются в той же ленте. Сначала он отвечал только по-английски, потому что в общем промпте было «always write in English».&lt;/p&gt;
&lt;p&gt;Миссию можно подтвердить голосом, но решение принимает код по транскрипту моей фразы, а не модель: только короткие фразы, и любое отрицание побеждает, то есть «да нет, отмена» это отказ.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/176-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/176-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;616&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#175 · Добавил распознавание объектов</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/175/"/>
    <id>https://rabbit0.dev/ru/p/175/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Добавил распознавание объектов. Перебрали кучу вариантов от облачных моделей до обычного YOLO на COCO, но камера стоит на высоте 13 см и такой ракурс модели…</summary>
    <content type="html">&lt;p&gt;Добавил распознавание объектов. Перебрали кучу вариантов от облачных моделей до обычного YOLO на COCO, но камера стоит на высоте 13 см и такой ракурс модели почти не видели: тумбу под телевизор называли скамейкой, а телевизор доской. В итоге YOLOE с открытым словарем, 58 классов зашиты в ONNX, а ZED SDK сам строит TensorRT, считает 3D боксы и трекает объекты. Класс «low wooden cabinet» пришлось добавить отдельно, иначе тумбу не находил. Первая сборка TensorRT engine заняла 9 минут.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/175-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/175-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;720&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/175-2.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/175-2-1280.webp&quot; width=&quot;1280&quot; height=&quot;616&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#174 · Вчера ради встроенного spatial mapping из ZED SDK я…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/174/"/>
    <id>https://rabbit0.dev/ru/p/174/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Вчера ради встроенного spatial mapping из ZED SDK я выкинул старый nvblox (#160) целиком вместе с самосборным torch. Сегодня он вернулся, но уже правильно…</summary>
    <content type="html">&lt;p&gt;Вчера ради встроенного spatial mapping из ZED SDK я выкинул старый nvblox (#160) целиком вместе с самосборным torch. Сегодня он вернулся, но уже правильно.&lt;/p&gt;
&lt;p&gt;Процесс камеры ел 185% CPU и 3.4 GB памяти. Профилирование показало что Python тут ни при чем: почти все время внутри SDK, в оптимизаторе трекинга. Заодно агент подцепился к живому процессу камеры через gdb и заморозил ее на 2 минуты, теперь gdb на камере под запретом. Дальше записали SVO и прогнали один и тот же проезд через разные конфигурации: карта ZED это +2.1 GB памяти, а nvblox строит более полную карту за 184 MB и ~2 ms на кадр на GPU. Агент собрал nvblox на джетсоне и написал маленькое C++/CUDA расширение через nanobind, которое берет глубину с камеры и отдает блоки меша в том же формате что и раньше. Процесс камеры похудел с 3.4 GB до 1.4 GB.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#173 · Робот теперь доступен из интернета через Cloudflare…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/173/"/>
    <id>https://rabbit0.dev/ru/p/173/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Робот теперь доступен из интернета через Cloudflare tunnel: live.rabbit0.dev. Потом подумал что любой с этой ссылкой может кататься на роботе и сбрасывать…</summary>
    <content type="html">&lt;p&gt;Робот теперь доступен из интернета через Cloudflare tunnel: &lt;a href=&quot;https://live.rabbit0.dev&quot;&gt;live.rabbit0.dev&lt;/a&gt;. Потом подумал что любой с этой ссылкой может кататься на роботе и сбрасывать карту, и сделал персональные ссылки. Даю ссылку другу, он играется, потом я ее удаляю и через 5 секунд у него все отваливается.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#172 · Утром карта пропала с UI</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/172/"/>
    <id>https://rabbit0.dev/ru/p/172/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Утром карта пропала с UI. Трекинг убежал на -138 метров, а вершины меша я передавал как int16 в миллиметрах, то есть максимум ±32 метра, и все переполнилось…</summary>
    <content type="html">&lt;p&gt;Утром карта пропала с UI. Трекинг убежал на -138 метров, а вершины меша я передавал как int16 в миллиметрах, то есть максимум ±32 метра, и все переполнилось. Теперь у каждого чанка свой origin. Почему трекинг убежал так и не понял.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#171 · Ушел спать и оставил агентов работать на ночь: ревью кода…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/171/"/>
    <id>https://rabbit0.dev/ru/p/171/</id>
    <published>2026-10-02T00:00:00+10:00</published>
    <updated>2026-10-02T00:00:00+10:00</updated>
    <summary>Ушел спать и оставил агентов работать на ночь: ревью кода, перформанс UI, Forge в docker compose. Утром 12 коммитов. Ревьюер, кстати, нашел что после любой…</summary>
    <content type="html">&lt;p&gt;Ушел спать и оставил агентов работать на ночь: ревью кода, перформанс UI, Forge в docker compose. Утром 12 коммитов. Ревьюер, кстати, нашел что после любой отклоненной миссии все защиты (столкновение, застревание) тихо отключались. Хорошо что нашел он, а не стена.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#170 · Попросил сделать команду, чтобы робот сам построил карту…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/170/"/>
    <id>https://rabbit0.dev/ru/p/170/</id>
    <published>2026-10-01T00:00:00+10:00</published>
    <updated>2026-10-01T00:00:00+10:00</updated>
    <summary>Попросил сделать команду, чтобы робот сам построил карту квартиры. Все готовые пакеты для этого завязаны на ROS, так что опять свое: frontier exploration и…</summary>
    <content type="html">&lt;p&gt;Попросил сделать команду, чтобы робот сам построил карту квартиры. Все готовые пакеты для этого завязаны на ROS, так что опять свое: frontier exploration и Hybrid A* под Аккермана с передним и задним ходом.&lt;/p&gt;
&lt;p&gt;Сначала робот вообще никуда не ехал. Я подкрутил пороги глубины ради красивой карты, и перед белой стеной в полумраке камера стала выкидывать 80-90% точек. Робот считал себя слепым. Вернул пороги назад и он проехал 6 метров за 46 секунд. Чистая карта и плотные препятствия питаются одной и той же глубиной и тут приходится выбирать.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/170-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/170-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;616&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#169 · Робот врезался в стену</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/169/"/>
    <id>https://rabbit0.dev/ru/p/169/</id>
    <published>2026-10-01T00:00:00+10:00</published>
    <updated>2026-10-01T00:00:00+10:00</updated>
    <summary>Робот врезался в стену. Дважды. Защита должна была остановить его за 15 см, но камера не видит глубину ближе ~30 см (про слепую зону писал еще в #154). Стена…</summary>
    <content type="html">&lt;p&gt;Робот врезался в стену. Дважды. Защита должна была остановить его за 15 см, но камера не видит глубину ближе ~30 см (про слепую зону писал еще в #154). Стена просто исчезала из скана прямо перед контактом и робот решал что путь свободен. Теперь стоп на 30 см и препятствия запоминаются в мировых координатах на несколько секунд.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#168 · В какой-то момент джетсон сам перезагрузился прямо во…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/168/"/>
    <id>https://rabbit0.dev/ru/p/168/</id>
    <published>2026-10-01T00:00:00+10:00</published>
    <updated>2026-10-01T00:00:00+10:00</updated>
    <summary>В какой-то момент джетсон сам перезагрузился прямо во время маневров. После этого RoboClaw переехал с /dev/ttyACM0 на /dev/ttyACM1 и нода упала, а камера…</summary>
    <content type="html">&lt;p&gt;В какой-то момент джетсон сам перезагрузился прямо во время маневров. После этого RoboClaw переехал с &lt;code&gt;/dev/ttyACM0&lt;/code&gt; на &lt;code&gt;/dev/ttyACM1&lt;/code&gt; и нода упала, а камера зависла на поиске себя в сохраненной карте. Самое веселое было дальше: моторы тянули по 6 A и робот «не двигался», я уже думал что что-то заклинило. А он ехал, просто поза камеры замерла.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#167 · Первые автономные поездки</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/167/"/>
    <id>https://rabbit0.dev/ru/p/167/</id>
    <published>2026-10-01T00:00:00+10:00</published>
    <updated>2026-10-01T00:00:00+10:00</updated>
    <summary>Первые автономные поездки. Очередь миссий живет на роботе: «развернись и проедь метр вперед» работает, разворачивается на 180° с точностью до градуса…</summary>
    <content type="html">&lt;p&gt;Первые автономные поездки. Очередь миссий живет на роботе: «развернись и проедь метр вперед» работает, разворачивается на 180° с точностью до градуса. Кликаешь в 3D сцену и робот едет туда, а если точка сзади, то разворачивается в несколько приемов туда-сюда.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/167-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/167-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;616&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#166 · UI переписан полностью: теперь это одна 3D сцена с роботом…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/166/"/>
    <id>https://rabbit0.dev/ru/p/166/</id>
    <published>2026-10-01T00:00:00+10:00</published>
    <updated>2026-10-01T00:00:00+10:00</updated>
    <summary>UI переписан полностью: теперь это одна 3D сцена с роботом в стиле Crysis, панели телеметрии, камера от третьего лица и чат с AI прямо в интерфейсе. В чате…</summary>
    <content type="html">&lt;p&gt;UI переписан полностью: теперь это одна 3D сцена с роботом в стиле Crysis, панели телеметрии, камера от третьего лица и чат с AI прямо в интерфейсе. В чате можно спросить про данные и получить график, а можно попросить проехать, но любое движение требует нажать APPROVE. Модель зайчика с ушами тоже нарисовал агент.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/166-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/166-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;616&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#165 · Параллельно начал Forge</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/165/"/>
    <id>https://rabbit0.dev/ru/p/165/</id>
    <published>2026-10-01T00:00:00+10:00</published>
    <updated>2026-10-01T00:00:00+10:00</updated>
    <summary>Параллельно начал Forge. Идея простая: писать вообще все что публикует робот в ClickHouse на одних часах и прикрутить агента, который отвечает на вопросы по…</summary>
    <content type="html">&lt;p&gt;Параллельно начал Forge. Идея простая: писать вообще все что публикует робот в ClickHouse на одних часах и прикрутить агента, который отвечает на вопросы по этим данным. Для частых вопросов есть заранее проверенные запросы (назвал их slabs), для остальных агент пишет SQL сам, но он проходит статическую проверку и EXPLAIN перед запуском. Плюс поиск аномалий через Chronos-2, это foundation модель для временных рядов: она предсказывает каким должен быть сигнал, а аномалия это когда он вылезает за коридор прогноза. На следующий день Forge переехал прямо на джетсон, так что запись больше не зависит от того включен ли мой мак.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#164 · Больше года ничего не писал</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/164/"/>
    <id>https://rabbit0.dev/ru/p/164/</id>
    <published>2026-10-01T00:00:00+10:00</published>
    <updated>2026-10-01T00:00:00+10:00</updated>
    <summary>Больше года ничего не писал. Робот все это время в основном стоял: когда я его включил, docker показывал что все контейнеры вышли 5 месяцев назад. Решил…</summary>
    <content type="html">&lt;p&gt;Больше года ничего не писал. Робот все это время в основном стоял: когда я его включил, docker показывал что все контейнеры вышли 5 месяцев назад. Решил вернуться к нему с новым подходом: почти весь код теперь пишут агенты Claude Code, а я ставлю задачи, смотрю что получается, ставлю робота на пол и переношу его с места на место.&lt;/p&gt;
&lt;p&gt;Первая находка сразу смешная: ZED не держал 30 fps потому что CPU сидел на 730 MHz из 1728, а GPU на 306 из 1020. Просто никто не запустил &lt;code&gt;jetson_clocks&lt;/code&gt;. Одна команда и захват кадра с 34 ms упал до 14 ms.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#163 · Добрался до дифференциала</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/163/"/>
    <id>https://rabbit0.dev/ru/p/163/</id>
    <published>2025-08-30T00:00:00+10:00</published>
    <updated>2025-08-30T00:00:00+10:00</updated>
    <summary>Добрался до дифференциала. Реализовал и откалибровал. Теперь радиус разворота минимальный и колеса не проскальзывают при поворотах.</summary>
    <content type="html">&lt;p&gt;Добрался до дифференциала. Реализовал и откалибровал. Теперь радиус разворота минимальный и колеса не проскальзывают при поворотах.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/163-1.mp4&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/163-1-640.webp&quot; width=&quot;640&quot; height=&quot;1138&quot; alt=&quot;video&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#162 · Дальше на основе этой карты можно строить графы</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/162/"/>
    <id>https://rabbit0.dev/ru/p/162/</id>
    <published>2025-08-16T00:00:00+10:00</published>
    <updated>2025-08-16T00:00:00+10:00</updated>
    <summary>Дальше на основе этой карты можно строить графы. Узлы это воксели с весами, зная cost можно использовать его для планирования маршрутов, объезжая дорогие…</summary>
    <content type="html">&lt;p&gt;Дальше на основе этой карты можно строить графы. Узлы это воксели с весами, зная cost можно использовать его для планирования маршрутов, объезжая дорогие участки, например чтобы робот не приближался сильно к стенам или не врезался в них. Дальше дейкстра или a* и робот может искать путь от своей позиции до цели использую pure pursuit.&lt;/p&gt;
&lt;p&gt;Пока оно очень кривое и не точное, надо калибровать и фиксить баги. Но сам факт того что e2e пайплайн уже офигенно хотя столько боли и времени а продвинулся наверное только на 5% цели реализации локальной навигации.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#161 · Следующим шагом встроил в пайплайн зрения робота</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/161/"/>
    <id>https://rabbit0.dev/ru/p/161/</id>
    <published>2025-08-16T00:00:00+10:00</published>
    <updated>2025-08-16T00:00:00+10:00</updated>
    <summary>Следующим шагом встроил в пайплайн зрения робота. Сначала думал писать в шареный файл карты глубин и гадры но NATS спокойно переваривает поток на низком…</summary>
    <content type="html">&lt;p&gt;Следующим шагом встроил в пайплайн зрения робота. Сначала думал писать в шареный файл карты глубин и гадры но NATS спокойно переваривает поток на низком разрешении. В итоге камера шлёт rgb + depth в топик а nvblox нода подписывается на них. Для высокого разрешения надо будет думать дальше, но пока хватает. Интринсики камеры и поза обновляет kv стор а не просто шлет сообщения в топики, это оказалось гораздо более удобно (хотя под капотом это одно и то же)&lt;/p&gt;
&lt;p&gt;nvblox берёт глубину и положение и на gpu в реальном времени строит tsdf (поле расстояний до поверхности). Оно сглаживает шум объединяет много кадров и даёт карту со свободными и занятыми областями. Из этого можно получить воксельную карту прям как мир в minecraft.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/161-1.mp4&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/161-1-1280.webp&quot; width=&quot;1280&quot; height=&quot;821&quot; alt=&quot;video&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#160 · Собрал nvblox под jetson</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/160/"/>
    <id>https://rabbit0.dev/ru/p/160/</id>
    <published>2025-08-16T00:00:00+10:00</published>
    <updated>2025-08-16T00:00:00+10:00</updated>
    <summary>Собрал nvblox под jetson. Готового torch пакета нет поэтому пришлось собирать самому. Три раза падало по разным причинам в итоге включение свопа помогло, у…</summary>
    <content type="html">&lt;p&gt;Собрал nvblox под jetson. Готового torch пакета нет поэтому пришлось собирать самому. Три раза падало по разным причинам в итоге включение свопа помогло, у jetson не хватает памяти чтобы собрать пакет. Сборка плюсов с cuda и питоном тоже боль, даже несмотря на докер контейнер в котором можно все собрать оно не гермитичное разваливается.&lt;/p&gt;
&lt;p&gt;Дальше мучился с минимальным dockerfile. Я смог запустить тесты но докер образ огромный с кучей дев зависимостей которые я не понимаю поэтому хотел получить самый минимум рантайма, в итоге после нескольких дней чистки собрал компактный образ с бинарниками и питон биндингами.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#159 · Spatial mapping + three.js</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/159/"/>
    <id>https://rabbit0.dev/ru/p/159/</id>
    <published>2025-08-09T00:00:00+10:00</published>
    <updated>2025-08-09T00:00:00+10:00</updated>
    <summary>Spatial mapping + three.js</summary>
    <content type="html">&lt;p&gt;Spatial mapping + three.js&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/159-1.mp4&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/159-1-640.webp&quot; width=&quot;640&quot; height=&quot;1138&quot; alt=&quot;video&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#158 · Все больше и больше использую NATS в проекте</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/158/"/>
    <id>https://rabbit0.dev/ru/p/158/</id>
    <published>2025-08-08T00:00:00+10:00</published>
    <updated>2025-08-08T00:00:00+10:00</updated>
    <summary>Все больше и больше использую NATS в проекте. Накидал простенький UI для управлением настройками камеры через UI. Для этого решил немного отойти от идеи…</summary>
    <content type="html">&lt;p&gt;Все больше и больше использую NATS в проекте. Накидал простенький UI для управлением настройками камеры через UI. Для этого решил немного отойти от идеи использовать pub sub для всего и посмотреть в сторону jetstream. По дефолту NATS core не имеет персистентности но это можно включить включив jetstream. По сути это один флаг и у тебя появлятся персистентный KV стор, object store и некоторые гарантии доставки. Все это очень полезно и очень удобно использовать. Например настройки камеры это просто KV. И клиент и робот подписаны на этот ключ (все в jetstream это те же subjects) и могут реагировать на изменение, оба они могет так же менять значение и все клиенты мнговенно на них реагируют, а после перезагрузки состояние восстанавливается.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/158-1.mp4&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/158-1-1280.webp&quot; width=&quot;1256&quot; height=&quot;1080&quot; alt=&quot;video&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#157 · Решил по быстрому накидать блог на английском чтобы был</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/157/"/>
    <id>https://rabbit0.dev/ru/p/157/</id>
    <published>2025-07-30T00:00:00+10:00</published>
    <updated>2025-07-30T00:00:00+10:00</updated>
    <summary>Решил по быстрому накидать блог на английском чтобы был. Буду туда дублировать все из robotrabbit0 сюда. https://rabbit0.dev</summary>
    <content type="html">&lt;p&gt;Решил по быстрому накидать блог на английском чтобы был. Буду туда дублировать все из &lt;a href=&quot;https://t.me/s/robotrabbit0&quot;&gt;robotrabbit0&lt;/a&gt; сюда. &lt;a href=&quot;https://rabbit0.dev&quot;&gt;https://rabbit0.dev&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#156 · Давно ничего писал но это не означает что ничего не делал</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/156/"/>
    <id>https://rabbit0.dev/ru/p/156/</id>
    <published>2025-08-08T00:00:00+10:00</published>
    <updated>2025-08-08T00:00:00+10:00</updated>
    <summary>Давно ничего писал но это не означает что ничего не делал. Пока был в Byron Bay робота не было под рукой поэтому занимался генератором контента для блога. Все…</summary>
    <content type="html">&lt;p&gt;Давно ничего писал но это не означает что ничего не делал. Пока был в Byron Bay робота не было под рукой поэтому занимался генератором контента для блога.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Все посты из телеги попадают в маркдаун файл, с метадатой на каждый пост.&lt;/li&gt;
&lt;li&gt;Переводится каждый пост через api ChatGPT&lt;/li&gt;
&lt;li&gt;Все картинки сжимаються в webp&lt;/li&gt;
&lt;li&gt;Для каждого видео генерится превью через ffmpeg и тоже сжимается в webp&lt;/li&gt;
&lt;li&gt;Хотел сделать без javascript вообще&lt;/li&gt;
&lt;li&gt;Деплоится в cloudflare.&lt;/li&gt;
&lt;li&gt;Source code тут &lt;a href=&quot;https://github.com/seralexeev/rabbit0.dev&quot;&gt;rabbit0.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>#155 · У меня прям горит от того что NVIDIA выпилила аппаратный…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/155/"/>
    <id>https://rabbit0.dev/ru/p/155/</id>
    <published>2025-07-22T00:00:00+10:00</published>
    <updated>2025-07-22T00:00:00+10:00</updated>
    <summary>У меня прям горит от того что NVIDIA выпилила аппаратный энкодер h264 из jetson хотя позиционирует его как edge ai device с двумя csi портами под камеры…</summary>
    <content type="html">&lt;p&gt;У меня прям горит от того что NVIDIA выпилила аппаратный энкодер h264 из jetson хотя позиционирует его как edge ai device с двумя csi портами под камеры. Софтварным кодеком нагрузка на CPU на 1080p@30fps доходит до 40% и потребление ватт сильно взлетает.&lt;/p&gt;
&lt;p&gt;Немного изучив топик сложилось ощущение что rapsberry pi 5 тоже лишился аппаратного энкодера из за шортэджа кристаллов, но rpi4 все еще имеет его. У меня кстати он есть и использовался в роботе пока я не переработал его на jetson. На том же разрешении и частоте кадров rpi4 потребляет на больше 5W и загрузка CPU не больше 5% переваривая поток без затыков.&lt;/p&gt;
&lt;p&gt;Теперь появляются мысли о том, что разгрузить jetson перенеся все узлы для контроля механикой и стриминг камеры с jetson на rpi объединив их в кластер не такая уж и плохая идея. Кажется что дополнительные 5W погоду не сделают но освободят все ресурсы для Хуанга.&lt;/p&gt;
&lt;p&gt;Возникает вопрос как объединить их вместе так как где то должен подниматься сервер NATS. Ethernet + мини свитч или ethernet over usb?&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#154 · Из за того что baseline стереопары довольно широкий она…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/154/"/>
    <id>https://rabbit0.dev/ru/p/154/</id>
    <published>2025-07-22T00:00:00+10:00</published>
    <updated>2025-07-22T00:00:00+10:00</updated>
    <summary>Из за того что baseline стереопары довольно широкий она может измерять глубину только от 30см. Что создает слепой участок перед роботом. Терпимо но не очень…</summary>
    <content type="html">&lt;p&gt;Из за того что baseline стереопары довольно широкий она может измерять глубину только от 30см. Что создает слепой участок перед роботом. Терпимо но не очень приятно. Возможно можно подумать в сторону лидара или или проксимити сенсора для obsticle avoidance.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#153 · Не удержался и решил поиграться с points cloud и depth…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/153/"/>
    <id>https://rabbit0.dev/ru/p/153/</id>
    <published>2025-07-22T00:00:00+10:00</published>
    <updated>2025-07-22T00:00:00+10:00</updated>
    <summary>Не удержался и решил поиграться с points cloud и depth measurment. Пока попробовал самую легкую модель. То что на экране снизу это еще не SLAM а просто…</summary>
    <content type="html">&lt;p&gt;Не удержался и решил поиграться с points cloud и depth measurment. Пока попробовал самую легкую модель.&lt;/p&gt;
&lt;p&gt;То что на экране снизу это еще не SLAM а просто stateless point cloud который с частотой 30hz паблишится из робота в nats и рисуется с помощью treejs в браузере. Чем дальше точка тем ближе она к зеленому. Это всего лишь для удобства но в кода это просто 3 или 4 мерная матрица (4 если хочется сохранить оригинальный цвет с камеры)&lt;/p&gt;
&lt;p&gt;Из сложного оказалось что 1280x720 слишком тяжело и просто байтовый блоб этой матрицы весит 70+Mb. Прокачивать такой массив 30 раз в секунду невозможно из за ограничения в 64Mb на сообщение и ограничения канала. Уменьшив разрешения до 320p и сжав его zlib получилось получить пару сотен килобайт что выглядит ок. Плюс эта матрица sparse поэтому можно еще выкинуть нули из нее. Хотя может и нет смысла если все равно сжимать.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/153-1.mp4&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/153-1-640.webp&quot; width=&quot;640&quot; height=&quot;1138&quot; alt=&quot;video&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#152 · Теперь приходится схлопнуть все обратно в один узел…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/152/"/>
    <id>https://rabbit0.dev/ru/p/152/</id>
    <published>2025-07-22T00:00:00+10:00</published>
    <updated>2025-07-22T00:00:00+10:00</updated>
    <summary>Теперь приходится схлопнуть все обратно в один узел который эксклюзивно имеет доступ к камере и делает все.</summary>
    <content type="html">&lt;p&gt;Теперь приходится схлопнуть все обратно в один узел который эксклюзивно имеет доступ к камере и делает все.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#151 · Из за этого идея вытекают несколько других проблем</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/151/"/>
    <id>https://rabbit0.dev/ru/p/151/</id>
    <published>2025-07-22T00:00:00+10:00</published>
    <updated>2025-07-22T00:00:00+10:00</updated>
    <summary>Из за этого идея вытекают несколько других проблем. Изначально я думал сделать несколько узлов которые работают с камерой. Из за того что к камере может иметь…</summary>
    <content type="html">&lt;p&gt;Из за этого идея вытекают несколько других проблем. Изначально я думал сделать несколько узлов которые работают с камерой. Из за того что к камере может иметь доступ только один процесс я подумал о локальном стриминге через ZED SDK. То есть к камере коннектится один процесс и стримит пожатый h264 поток. Так же SDK позволяет и читать все другие параметры через стриминг словно используешь камеру локально. Но проблема в том что стриминг через SDK сильно завязан на аппаратное сжатие и без него крашится и не работает.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#150 · Очередное разочарование, в NVIDIA Jetson Orin nano нет…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/150/"/>
    <id>https://rabbit0.dev/ru/p/150/</id>
    <published>2025-07-22T00:00:00+10:00</published>
    <updated>2025-07-22T00:00:00+10:00</updated>
    <summary>Очередное разочарование, в NVIDIA Jetson Orin nano нет аппаратного сжатия h264.</summary>
    <content type="html">&lt;p&gt;Очередное разочарование, в NVIDIA Jetson Orin nano нет аппаратного сжатия h264.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>#149 · Сегодня поймал себя на мысли что столько классных идей…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/149/"/>
    <id>https://rabbit0.dev/ru/p/149/</id>
    <published>2025-07-22T00:00:00+10:00</published>
    <updated>2025-07-22T00:00:00+10:00</updated>
    <summary>Сегодня поймал себя на мысли что столько классных идей которые хочется попробовать реализировать при этом уже куча технического долга который тоже бы по…</summary>
    <content type="html">&lt;p&gt;Сегодня поймал себя на мысли что столько классных идей которые хочется попробовать реализировать при этом уже куча технического долга который тоже бы по хорошему решить сейчас.&lt;/p&gt;
&lt;p&gt;Как минимум хочется прямо сейчас закончить механику чтобы перейти к perception.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;переделать руль&lt;/li&gt;
&lt;li&gt;укрепить второй этаж (нарезать лазером акриловую пластину и пересобрать на новой площадке)&lt;/li&gt;
&lt;li&gt;поменять задние моторы или поднять немного оси и купить колеса побольше&lt;/li&gt;
&lt;li&gt;подрегулировать ускорение или распределить весь лучше (сейчас рэббит слегка подпрыгивает при резком ускорении)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>#148 · Большой мэилстоун</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/148/"/>
    <id>https://rabbit0.dev/ru/p/148/</id>
    <published>2025-07-21T00:00:00+10:00</published>
    <updated>2025-07-21T00:00:00+10:00</updated>
    <summary>Большой мэилстоун. Он может передвигаться и управляться удаленно. работает от батареи видео стримится в реалтайме в 720p@30 задержки контроллера минимальные…</summary>
    <content type="html">&lt;p&gt;Большой мэилстоун. Он может передвигаться и управляться удаленно.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;работает от батареи&lt;/li&gt;
&lt;li&gt;видео стримится в реалтайме в 720p@30&lt;/li&gt;
&lt;li&gt;задержки контроллера минимальные&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Из проблем:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;руль очень нервный&lt;/li&gt;
&lt;li&gt;передаточное число редукторов слишком больше и робот очень медленный и шумный (bldc?)&lt;/li&gt;
&lt;li&gt;видео не сжато h264, я беру каждый кадр и сжимаю в jpeg из за чего перегоняться много гигабайт, что не будет работать в 4g&lt;/li&gt;
&lt;li&gt;углы руля очень маленькие, надо переделывать ступицу и линки&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/148-1.mp4&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/148-1-640.webp&quot; width=&quot;640&quot; height=&quot;1138&quot; alt=&quot;video&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#147 · Сегодня развел все провода и компоненты</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/147/"/>
    <id>https://rabbit0.dev/ru/p/147/</id>
    <published>2025-07-21T00:00:00+10:00</published>
    <updated>2025-07-21T00:00:00+10:00</updated>
    <summary>Сегодня развел все провода и компоненты. Пришлось 5 раз его разобрать и собрать заного потому что каждый раз какая то новая херня возникала. Из хорошего…</summary>
    <content type="html">&lt;p&gt;Сегодня развел все провода и компоненты. Пришлось 5 раз его разобрать и собрать заного потому что каждый раз какая то новая херня возникала.&lt;/p&gt;
&lt;p&gt;Из хорошего батарея вообще огонь. Во первых может пропускать ток когда подключена к зарядки и может заряжаться и питать робот одновременно.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/147-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/147-1-1280.webp&quot; width=&quot;960&quot; height=&quot;1280&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>#146 · Завайрил контроллер задних моторов, сенсор напряжения, 2…</title>
    <link rel="alternate" type="text/html" href="https://rabbit0.dev/ru/p/146/"/>
    <id>https://rabbit0.dev/ru/p/146/</id>
    <published>2025-07-20T00:00:00+10:00</published>
    <updated>2025-07-20T00:00:00+10:00</updated>
    <summary>Завайрил контроллер задних моторов, сенсор напряжения, 2 step down регулятора, один для серво руля, другой для моторов и контроллера и запустил от батареи…</summary>
    <content type="html">&lt;p&gt;Завайрил контроллер задних моторов, сенсор напряжения, 2 step down регулятора, один для серво руля, другой для моторов и контроллера и запустил от батареи. Кажется ничего не задымилось, хороший знак.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rabbit0.dev/media/146-1.jpg&quot;&gt;&lt;img src=&quot;https://rabbit0.dev/media/preview/146-1-1280.webp&quot; width=&quot;960&quot; height=&quot;1280&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
</feed>
