Почему именно квадроцикл
Квадроциклы относительно дёшевы, и б/у экземпляр можно найти за небольшие деньги. При этом вы сразу получаете несколько вещей, которые в самодельной платформе обычно приходится собирать с нуля.
Плюсы
Грузоподъёмность. Спокойно везёт 50 кг — сумку, мешок, всё, что тяжело нести руками. При этом габариты меньше автомобиля, а на электродвигателе он способен заехать в помещение: склад, сарай.
Подвеска и пневмоколёса. В отличие от многих роботизированных платформ, здесь уже есть амортизаторы. Для уличного робота это критично: инерциальные датчики не любят вибрации, а одометрия на кочках разваливается.
Готовая силовая установка. Электродвигатель, контроллер и батарея уже в комплекте. Даже простой контроллер можно заставить работать от ШИМ-сигнала, подключившись вместо датчика Холла или потенциометра в ручке газа. Тормоз тоже можно электрифицировать — это плюс, потому что не каждый контроллер умеет тормозить двигателем, а диск тормозит сильнее.
Изученная ходовая. Есть готовые матмодели для MPPI и MPC, реализующие не только кинематику, но и динамику. Продвинутые умеют контролировать машину в управляемом заносе — то есть довольно точно считают все силы, действующие на машину. Ходовая Акермана 2WS считается одной из самых предсказуемых на большой скорости.
Ремонтопригодность. Всё варится обычным сварочным инвертором на электродах. Конструкция легко поддаётся доработкам.
Доступные компоненты. Запчасти для квадроциклов есть почти везде.
Минусы
Плохая маневренность. Мой квадроцикл имеет базу всего 70 см, но не может развернуться на 180° на дороге без разворота с задним ходом. Причина — малые углы поворота колёс. Увеличение углов приводит к эффекту плуга даже с правильным Акерманом, так что это палка о двух концах.
Люфты и подклинивания рулевого. По крайней мере на такой конструкции, как у меня (с тягами), они почти непобедимы. Для переделки рулевого придётся заказывать точеные детали и делать рулевую рейку сервопривод.
Кривая геометрия. Корпус сварен на глаз: передние колёса смещены относительно оси вращения по всем осям, задние — с заметным биением. Это ломает расчёты поворота по угловой скорости (радиус дуг не совпадает с уставкой, биение скорости передаётся на рулевые колёса, так как угол поворота колёс зависит от скорости в кинематике), а также не даёт контроллеру линейной скорости точно удерживать заданную скорость.
Софт под Акермана. Open-source планировщики до сих пор плохо адаптированы под эту ходовую. Бывают случаи, когда робот заезжает в замкнутое пространство и не может найти путь обратно — тем же путём, которым заехал. Приходится помогать с парковочными манёврами.
Главный вывод: основные недостатки сосредоточены вокруг рулевого управления. Именно от качества этого узла зависит, как ровер будет ехать. И это один из самых сложных узлов для самоделок.
Как выглядит база
Вот так квадроцикл выглядит после снятия всех пластиковых деталей:

Рулевое управление:




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

Ручка газа на датчике Холла:



Приводим ходовую к стандарту ROS
Чтобы квадроцикл стал ходовой для мобильной платформы, он должен подчиняться стандартным командам управления от рулевых контроллеров в ROS. Это w_cmd и v_cmd: уставка угловой скорости поворота корпуса и уставка линейной скорости. То есть ровер управляется всего двумя переменными.
Энкодеры
Чтобы реализовать управление линейной скоростью, нужно дооснастить платформу энкодерами вращения колёс или двигателя. В моём случае делать механическую передачу от вала колёс к оси энкодера сложнее, чем измерять скорость вращения двигателя. Для этого я использовал магнитный энкодер MT6701: у него есть аппаратный выход (ABZ), как у инкрементального квадратурного энкодера, что позволяет измерять очень большие скорости вращения.

Датчик помещаем в корпус:

Магнит — на вал двигателя:



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

После этого на микроконтроллере доступны измерения скорости вращения двигателя:
Рулевое управление
Следующий шаг — переделка рулевого. Я переточил стандартные кулачки под более длинные сошки с углами Акермана:


Важное наблюдение: переделка углов сошек под Акерман не дала прибавки к маневренности и не уменьшила плугование. Хуже точно не стало, но и лучше — тоже. В отличие от стандартной геометрии с прямыми сошками, теперь поворачивается в основном одно колесо, идущее по внутреннему радиусу. Это может привести к неравномерному износу покрышек т.к. плугует в основном именно это колесо.
Пришлось переточить буквально всё: тяги укоротить, контргайки сточить, чтобы налезали, отрегулировать схождение до упора. Причина, отсутствия каких-либо улучшений скорее всего, в отсутствии дифференциала на задней оси. Китайцы, что удивительно, делают всё правильно, штампуя прямые сошки: на такой примитивной конструкции получается, что Акерман не нужен.
Увеличение длины сошек в 2,5 раза дало небольшой прирост углов поворота сервы (с +/- 20° до +/- 30° что увеличило чувствительность её энкодера), а передаточное число упало с 2,5 до 0,9 (угол поворота колёс стал чуть меньше). Это дало значительный выигрыш в силе, а передаточное отношение, близкое к 1:1 (тем более в меньшую сторону), с учётом люфтов даёт гораздо лучшую точность установки угла поворота колёс. Вывод: сошки можно было оставить прямыми, но нарастить их длину.
Плата-адаптер, выточенная на станке, стыкуется с силовой платой на самой серве:


Получается рулевой узел, аналогичный тому, что стоит на самом квадроцикле. Круглая силовая плата для сервопривода продаётся отдельно и является частью сервопривода ASME MR. Этот сервопривод обладает большой силой (около 400 кг/см) и магнитным энкодером AS5600, что позволяет возвращать обратную связь о положении вала и значительно продлевает ресурс по сравнению с моделями на потенциометрах при частых рулениях.
Для сервопривода печатаем корпус для защиты платы от грязи и посторонних предметов:


Результаты видим в телеметрии в реальном времени:

О скорости, углах поворота сервы и т.д.
Тормоз
Остался последний орган управления — тормоз:

Его также электрифицируем установкой сервопривода с тросом. Этот стальной трос с катушкой — насадка-лебёдка для радиоуправляемых машин, с помощью которой она должна вытаскивать себя на соревнованиях. Он отлично подходит на замену тормозного тросика. Серва через адаптер приварена к раме квадроцикла:
Ручное управление: от «человекоцентричного» к ROS-подобному
Первый вариант ручного управления использовал просто установку колеса в крайнее положение при нажатии кнопок WSAD и в нейтральное при отпускании:
Периодически, довольно редко, это приводило к залипанию. Тем не менее ровер с таким управлением хорошо управлялся на маленькой скорости и выжимал из ходовой всю возможную маневренность:
Но на большой скорости, без промежуточных положений колёс, управление становится очень резким. В целом такой способ можно назвать человекоцентричным — контроллеры рулевого управления так не управляют.
Поэтому был придуман новый способ ручного управления, взятый из симулятора. Он позволяет управлять ровером аналогично тому, как им управляют контроллеры — через w_cmd и v_cmd. Из плюсов:
Требует минимум байт для обмена данными между мини-ПК и НСУ.
Более устойчив к задержкам в работе сети.
Даёт понимание, как будет управлять контроллер рулевого управления этим ровером: интерфейс получается одинаковый на STM32 — что для ручного, что для автоматического управления.
Изначально я планировал добавить ПИД по угловой скорости (w_cmd) на STM32 и даже реализовал его на МК. Но тесты в симуляторе показали, что, хотя ПИД по угловой скорости и помогает сгладить проблемы кривой геометрии корпуса, решает проблему частых подруливаний и стабилизирует машину на большой скорости, он создаёт задержку и фазовый сдвиг в управлении рулевыми колёсами. В результате рулевой контроллер значительно хуже паркуется на малой скорости: не доводит колёса до нужных углов и разворачивает машину не туда при микроманеврах. То есть бьёт в самое больное место.
Добило эту идею баг в ядре HAL, из-за которого все DMA-порты (SPI, UART и т.д.) зависали примерно через 30 минут работы. Я очень хотел испытать управление по гироскопу на улице, но в угоду надёжности было принято решение убрать ПИД и сделать управление по угловой скорости напрямую, используя только расчёт кинематики, а также запускать контроллеры на высокой частоте 200 Гц:
Тесты в ручном режиме показали, что с таким управлением маневренность на низкой скорости стала хуже — во многом из-за задержки ввода данных через клавиатуру по сравнению с простым поворотом колёс в крайние положения по WADS. Но такое управление является компромиссным решением: оно позволяет понять реальные ограничения, с которыми сталкивается автоматика, на себе.
Сенсоры: от одной камеры к сенсорной башне
Изначально планировалось, что сенсор будет всего один — RGB-D камера, установленная вглубь корпуса, чтобы оставаться недоступной для ударов и незаметной, но так, чтобы в её поле зрения не попадали элементы конструкции:

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


Но и на этом всё не закончилось. Во время тестов выяснилось, что RGB-D камера, установленная в горизонт, сильнее подвержена ослеплению от солнца, а также ловит сильные помехи при взгляде вдаль. Было принято решение увеличить её наклон к земле и оснастить блендой, защищающей разъём синхронизации от внешних воздействий, а камеру — от солнца:

Выводы
Квадроцикл — жизнеспособная база для уличного ровера но для качественной переделки нужны компоненты которые очень тяжело достать.
Главная проблема — рулевое управление. Люфты, кривая геометрия и отсутствие дифференциала съедают точность. Если начинать заново — я бы сразу начал проектирование с рулевого узла а не переделывал штатный.
Акерман на такой конструкции — бесполезен без дифференциала. Штатные прямые сошки, возможно, не так плохи, как кажутся.
ПИД по угловой скорости — не серебряная пуля. Помогает на большой скорости, но ломает парковку на малой.
Софт под Акермана — Opensource планировщики не всегда находят путь там, где человек проедет не задумываясь.
Виброразвязка сенсоров — обязательна. Ходовая квадроцикла не гасит вибрации в достаточной мере.