惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
GbyAI
GbyAI
T
Tailwind CSS Blog
Know Your Adversary
Know Your Adversary
小众软件
小众软件
Security Latest
Security Latest
博客园 - 聂微东
P
Privacy International News Feed
L
Lohrmann on Cybersecurity
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
阮一峰的网络日志
阮一峰的网络日志
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 叶小钗
Last Week in AI
Last Week in AI
The Register - Security
The Register - Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Vulnerabilities – Threatpost
Jina AI
Jina AI
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
Google DeepMind News
Google DeepMind News
P
Palo Alto Networks Blog
S
Schneier on Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Exploit Database - CXSecurity.com
月光博客
月光博客
C
CERT Recently Published Vulnerability Notes
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
量子位
K
Kaspersky official blog
T
Threatpost
Latest news
Latest news
The Cloudflare Blog
MyScale Blog
MyScale Blog
C
Cisco Blogs
T
Tor Project blog
S
Securelist
Cisco Talos Blog
Cisco Talos Blog
The GitHub Blog
The GitHub Blog
A
Arctic Wolf
T
Threat Research - Cisco Blogs
H
Help Net Security
C
CXSECURITY Database RSS Feed - CXSecurity.com

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Про двуного-колёсных роботов
cnet · 2026-05-13 · via Все публикации подряд на Хабре

Про двуного-колёсных роботов

9 мин

15K

                                                                                                                                                                                                        github.com/fuwei007/Navbot-EN01

github.com/fuwei007/Navbot-EN01

За прошедшие годы мы привыкли ко многим типам шагающих роботов, однако есть один любопытный тип, который до сих пор вызывает эмоции и, в первую очередь потому, что сама концепция такой платформы позволяет любому желающему изготовить даже достаточно габаритного робота, служащего для переноски больших тяжестей, по пересечённой местности, причём, что особенно интересно, — роботы подобного типа могут быть созданы на базе относительно слабых* микроконтроллеров наподобие esp32 — и речь сейчас пойдёт о двуногих роботах на колёсах…

*Да, все мы знаем, что микроконтроллер esp32 никак нельзя назвать «слабым» — собственно благодаря своей мощи, доступности и беспроводным интерфейсам он открыл совершенно новую главу, когда появился, перевернув рынок. 

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

Совсем недавно мы рассматривали самый простой способ создания искусственных шагающих систем, где мы узнали, что разработать подобное устройство весьма легко, так как для его работы не требуется даже никакая стабилизация — на мой взгляд, удивительно интересный пример, как можно добиться хороших результатов, весьма скромными средствами!  

Однако, робототехника имеет в арсенале ещё множество интересных примеров «шагающих» систем, — например, около 9 лет назад, компания Boston Dynamics представила своего складского робота, имеющего несколько необычную кинематическую схему — двуногость, в сочетании с колёсами:

Подобный робот получил невиданные до этого преимущества: возможность быстрого передвижения (за счёт наличия колёс), в сочетании с “человеческого типа” обходом препятствий, где одна нога может находиться на препятствии, проезжая через него ( например, по кочке), а другая находиться вне преграды, где при этом, сама платформа может сохранять горизонтальное положение (одна нога для этого сгибается в колене) — что выгодно отличает систему от, например, тех же автомобилей, которые накреняются, проезжая по преграде одним боком. 

Также, мы видим, что подобная конструкция даёт подобному роботу возможность осуществления прыжков, что до этого было невозможно и кардинально расширяет его возможности. 

С момента появления первой конструкции прошло достаточно много лет и, на сегодняшний день, можно констатировать, что подобный подход сочетания колёсного и шагающего варианта передвижения одновременно — в полной мере оценили многие, так как массово начали появляться различные гибридные системы, бывшие изначально просто шагающими, но, которые обзавелись колёсами, и, как показывает практика, начали получаться весьма впечатляющие своей проходимостью платформы, как, например, колёсная версия робособаки: 

Или, например, охранная робоплатформа для патрулирования территории — «Ascento»:

Таким образом, явно заметно наличие повышенного интереса разработчиков к роботам подобного (колёсно-шагающего) типа, так как они начали появляться как грибы после дождя, и количество примеров на данный момент не исчерпывается только этими.

Для нас очевидным плюсом подобной ситуации является то, что к настоящему времени, имеется целый ряд решений для изучения (если бы мы хотели построить нечто подобное самостоятельно), однако, как мы понимаем, не все разработчики горят желанием, выкладывать свои наработки в открытый доступ ;-)

Тем не менее, в результате достаточно долгих поисков, мне удалось найти весьма интересную платформу, на которой реализован подобный функционал! 

Самое привлекательное, что строится она на основе самых доступных* компонентов, в частности, на базе микроконтроллера esp32! 

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

*Правда, тут есть маленькая ложка дёгтя: разработчик этой системы построил её на базе кастомной печатной платы, в которую впаян как чип esp32, так и сопутствующие компоненты. 

Впрочем, это не является проблемой: мы же понимаем, что, если захотели бы строить аналогичную систему, на базе готовых плат разработки, наподобие esp32 wroom 32, где на плату выведены (на определённые пины) выводы чипа, то нам просто пришлось бы проделать всего пару шагов:

  • Посмотреть в прошивке этого робота — какие выводы и для чего использованы;

  • Подключить к этим выводам платы всю необходимую периферию (драйверы двигателей, плату акселерометра/гироскопа и т.д.) — обыкновенными проводками-перемычками типа DuPont.

Таким образом, несмотря на использование кастомной платы, в этом нет ничего страшного, и изучение этого решения имеет практический смысл… Посмотрим, что оно из себя представляет! 

Выглядит робот следующим образом:

Как мы видим, в такой маленькой платформе реализовано всё лучшее: езда, прыжки, наклоны (сгибанием одной ноги, больше, чем другой). 

Как уже было выше сказано, система построена на базе кастомной платы, с установленным чипом esp32 и выглядит следующим образом:

                                                                                                                                                                                                         github.com/fuwei007/Navbot-EN01

github.com/fuwei007/Navbot-EN01

Чтобы понять, какие выводы задействовал разработчик, обратимся к основному блоку кода, лежащему по адресу (это адрес файла, после разархивации скачанного комплекта кода и документов с github — ссылка на него будет в конце): \navbot-en01-main\navbot-en01-main\src\wl_pro_robot\wl_pro_robot.ino 

Нас интересует достаточно малое количество периферии:

  • Энкодеры бесколлекторных двигателей:
    судя по строкам:
    I2Cone.begin(19, 18, 400000UL)
    I2Ctwo.begin(23, 5, 400000UL)
    мы видим, что i2c пины левого энкодера такие:
    SDA — GPIO 19;
    SCL — GPIO 18;
    а правого энкодера такие:
    SDA — GPIO 23;
    SCL — GPIO 5.

  • Даже на страничке самого проекта написано, что правый энкодер использует ту же шину i2c, что и акселерометр-гироскоп MPU6050, таким образом, мы понимаем, что
    пины MPU6050 следующие:
    SDA — GPIO 23;
    SCL — GPIO 5.

  • Для подключения сервоприводов используется UART2, который находится на 16 ,17 пинах GPIO — в явном виде это видно, например, по строкам:
    Serial2.begin(1000000);
    sms_sts.pSerial = &Serial2;

    (где имя «Serial2» зарезервировано системой для UART2 и это не пользовательская переменная).

  • Пины бесколлекторных двигателей:
    видно по строкам:
    BLDCDriver3PWM driver1 = BLDCDriver3PWM(32, 33, 25, 22);
    BLDCDriver3PWM driver2 = BLDCDriver3PWM(26, 27, 14, 12);

    мы видим, что, один из двигателей (по всей вероятности, левый),
    использует следующие пины:
    32, 33, 25 — пины фаз двигателя, 22 — enable пин;
    а правый, соответственно, следующие пины:
    26, 27, 14 — пины фаз двигателя, 12 — enable пин.

  • В проекте, кроме приводных устройств, используется ещё и дисплей, но его пины я предлагаю поискать вам самостоятельно. :-)

Насколько можно судить по официальному описанию проекта, в качестве основных приводных устройств использованы бесколлекторные двигатели, положение вала которых отслеживается с помощью цифровых энкодеров, на базе микросхемы AS5600, связанных с esp32 по i2c интерфейсу, где каждая микросхема содержит четыре аналоговых датчика Холла, соответственно, всё это вместе позволяет получить 4096 шагов на полный оборот или ~0,088° на один шаг.

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

Как выглядит примерно похожий энкодер, можно посмотреть здесь — кстати говоря, подобного типа готовую плату энкодера можно попробовать использовать и для своего проекта! ;-)

Вкратце скажу, если кто-то не сталкивался: энкодеры нужны для точного отслеживания положения вала двигателя.

Для управления двигателями используется трёхфазный драйвер двигателей.

Если не ошибаюсь, судя по даташиту микросхемы, для подключения двигателей к ней потребуется некоторый обвес.

Если не хочется паять, есть и другие варианты, например, одноканальные DRV8313 (т.е. только на 1 двигатель) драйверы, соответственно, их потребуется 2 штуки.

Кроме двигателя, по основной плате мы можем видеть, что используется ещё и пара сервоприводов, довольно примечательных — судя по той библиотеке, которую я нашёл в подключаемом коде (servo_sts3032.h), здесь использованы два сервопривода для сгибаемых «коленей», с UART-управлением, что-то вроде такого.

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

Однако тут, совершенно другое дело: 

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

  • Также, если в случае обычных серв, можно только посылать* данные серве, чтобы она повернулась на определённый угол, то здесь можно как посылать, так и запрашивать данные по линии UART, узнавая в реальном времени
    положение вала.

*Да, я знаю, что вы скажете: «ну как же так, я использовал библиотеку servo.h (для обычных дешёвых серв), в ходе чего запрашивал текущее положение вала и она мне возвращала!» — да, я знаю, я сам так делал:-), только там это программно реализовано и библиотека, по сути, возвращает последнее ваше задание, относительно угла поворота, а не реально запрашивает эти данные у сервы…

  • Кроме угла, у подобных серв можно запрашивать: скорость вращения, нагрузку (крутящий момент), потребляемый ток, напряжение питания, температуру.

    Причём, насколько я понимаю, здесь есть любопытный момент касательно
    разницы между потребляемым током и нагрузкой — по идее, логично было бы предположить, что серва могла бы передавать микроконтроллеру только величину потребляемого тока, а микроконтроллер сам бы уже вычислял величину нагрузки на валу, однако здесь это всё реализуется не на стороне микроконтроллера, например, с помощью библиотеки, которая работает с сервой — а реализовано сразу аппаратно, в самой серве и, получение двух величин сразу, позволяет производить диагностику: например, если величина тока относительно велика, даже в состоянии покоя, а нагрузка на валу отсутствует — значит какие-то аппаратные проблемы и надо разбираться… 

  • Ну и ещё из приятного — такие сервоприводы имеют возможность настройки параметров PID-регулятора, что позволяет настроить серву для перемещения с нужной скоростью (агрессивно, плавно и т.д.), для достижения и удержания нужного угла, робо-манипулятором определённого веса.

Так что, как видим, штука крайне интересная…

Один нюанс, который я заметил при изучении официальных доков, заключается в том, что, насколько можно судить, разраб этого робота подключил две сервы через аппаратный мультиплексор, чтобы сэкономить количество UART выводов, и принимать/посылать данные через один и тот же. 

Обычно, в подобного рода решениях программно (с esp32 в нашем случае) посылается 0 или 1 (или ещё какая-то комбинация) на физическое аппаратное устройство, которое, в зависимости от сигнала подключает/отключает определённый комплект выводов к одному и тому же комплекту линий — в нашем случае, это шина UART, к которой коммутируется серва1 или серва2. 

Однако здесь всё это выполнено гораздо более элегантно: в основном файле прошивки (wl_pro_robot.ino) можно увидеть строки вида ID[0] = 1; ID[0] = 2, где 1 и 2 это адресные байты каждой сервы, то есть, грубо говоря, просто адрес, вшитый на заводе!  

Адрес вшит не «наглухо» и может меняться при желании, с помощью специальной сервисной программы (FEETECH Debug Software) — эта сервисная программа, насколько можно понять, позволяет не только менять адрес, но и настраивать множество других параметров для серв, в частности, значения PID-регуляторов. 

При отправке определённого запроса на исполнение/получение данных — в пакете будет присутствовать этот адрес, а все сервы подключены к одной и той же шине UART, — таким образом, все сервы кроме адресата проигнорируют это задание и только адресат его исполнит! Красота! :-)  

Таким образом, подытоживая этот момент, можно условно говоря сказать, что аппаратный мультиплексор встроен на уровне каждой сервы (хотя, тут это и некорректно — тут адресация в чистом виде; просто я тут оставался в рамках терминологии автора разработки («...multiplexing for data transmission and reception») :-) 

И значение с датчика сервы устанавливается на значение 2048 для полностью согнутой ноги (видимо, насколько я понимаю, когда робот днищем лежит на плоскости (например, на столе) и ноги полностью согнуты).

Для ориентирования в пространстве роботом используется широко известный датчик акселерометра-гироскопа MPU6050, подключенный к esp32 по i2c.

Для быстрой реакции на управляющие команды, а также, чтобы происходила реакция не только на факт «нажатия» кнопки, но и на факт «отжатия», — управление ведётся через протокол websocket, где сам робот выступает как точка доступа wi-fi, к которой подключается пользователь через смартфон (вводя в адресной строке: 192.168.1.11), после чего робот отдаёт пользователю в браузер веб-страничку, с кнопками управления, которая и представляет собой интерактивный пульт. 

Поддержание равновесия работает таким образом, что в основе своей используются алгоритмы PID, позволяющие за минимальное время, с минимальной раскачкой «туда-сюда», привести к нужному углу колёса, где для осуществления такой регуляции считываются предварительно данные с датчика MPU6050, после чего, происходит вычисление, в каком направлении, и с каким крутящим моментом необходимо повернуть колёса, чтобы устранить падение, с учётом текущего положения колёс.

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

Подытоживая, хочется сказать, что, с моей точки зрения, это довольно интересная затея в целом, так как, если один раз разобраться, то можно строить весьма интересные штуки, например, не только настольные небольшие игрушки вроде этого робота, но и достаточно габаритные устройства, пример которого мы уже видели выше, наподобие того же самого патрульного робота «Ascento» — которого если снабдить тем же самым бензогенератором небольшого размера, то можно создать весьма «долгоиграющую» машину, высокой грузоподъёмности и высокой проходимости (в теории)…:-)

Проект, со всеми исходниками, который здесь рассматривался, находится тут.


Размещайте облачную инфраструктуру и масштабируйте сервисы с надежным облачным провайдером Beget.

Эксклюзивно для читателей Хабра мы даем бонус 10% при первом пополнении.

Воспользоваться

Воспользоваться