TL;DR:
Шасси беспилотника на базе Lada Vesta при помощи проекта Polysync OSCC.
Дисклеймер:
Всё описанное в статье лишь личный опыт и не должно рассматриваться как руководство к действию.
Модификации, описанные в статье, почти наверняка лишат автомобиль гарантии производителя и возможности легально двигаться по дорогам общего пользования.
Я не являюсь разработчиком проекта OSCC.
Всё, описанное в статье, не имеет никакого отношения к вот этому проекту.
Вместо вступления
Я: Альма-матер, давай купим Приус чтобы делать беспилотники
Альма-матер: Нет, у нас есть Приус дома
Приус дома:
Задачи
Чтобы заставить всё это ездить самостоятельно нужно научится управлять несколькими вещами:
Положение руля - Насколько я знаю, у Весты нет опции автоматической парковки и скорее всего, в блоке управления электроусилителя руля не предусмотрено внешнего управления по CAN. Документацию или описание протокола найти, разумеется, нереально. Наиболее реалистичный подход - подмена аналоговых сигналов датчика крутящего момента в рулевой колонке.
Обороты двигателя - Тут всё примерно тоже самое. Наверное, можно было бы попробовать пойти через круиз-контроль, но это выглядит сомнительно. Поэтому - подмена аналоговых сигналов датчика положения педали акселератора.
Торможение - Единственное, что меня беспокоило — это тормозная система. В мире нет ничего более беспомощного, безответственного и безнравственного, чем линейный актуатор нажимающий на педаль тормоза. Хотелось сделать как-то изящнее, как минимум, не устанавливать ничего под ногами у водителя да и вообще в салоне. Под капотом, правда, свободного места практически нет. Функции brake-by-wire у блока ABS Весты, само собой, нет. В общем, с тормозной большой вопрос.
Положение селектора коробки передач - На счёт положения селектора есть сомнения потому, что хочется быть уверенным(особенно на начальном этапе), что машина, оставленная в нейтрали точно никуда не поедет. Управление селектором может понадобится, например, для автоматической парковки. Пожалуй, сделаем это как-нибудь потом.
Open Source Car Control
О проекте Polysync OSCC я знал давно, уже точно не помню откуда, скорее всего из статьи @waiwnf
.
Open Source Car Control (OSCC) is an assemblage of software and hardware designs that enable computer control of modern cars in order to facilitate the development of autonomous vehicle technology.
На всякий случай, я поискал, что нового сделали Polysync за это время(под спойлером) но эти варианты мне не подошли.
Drivekit/Prism
Polysync выпустили коммерческий набор Drivekit для KIA NIRO. Судя по сайту, другие модели не поддерживаются, а управление тормозами реализовано программно.
На CES2020 представили универсальные блоки Prism для взаимодействия с шасси рассчитанные на крупных заказчиков и теперь уже с ASIL-D(ISO 26262).
Поэтому, возвращаемся к OSCC. У OSCC есть два основных варианта: для автомобиля Kia Soul с ДВС и для электромобиля Kia Soul EV.
Установка на Kia Soul EV требует вмешательства только в проводку автомобиля.
Установка на Kia Soul с ДВС требует изменений в проводке и в тормозной системе автомобиля. Между главным тормозным цилиндром и стандартным блоком системы ABS устанавливается гидравлический актуатор, который может создавать давление на входе в блок ABS вместо водителя. Роль актуатора выполняет гидравлический блок Toyota Prius 2004-2009 годов выпуска. С точки зрения установки системы OSCC Kia Soul и LADA Vesta практически идентичны.
Сомнения вызывало то, что я не нашёл подтверждения того, что кому-либо удалось портировать(в программном и аппаратном смысле) OSCС на другую модель автомобиля.
Втф, гайз? Я наверняка не первый. Где хоть какая-то статья? Или это ошибка выжившего?
Судя по всему, даже воспроизведение системы на автомобиле KIA Soul с ДВС и установка блока АБС от приуса было практически единичным. Зато, многие устанавливали OSCC на KIA Soul EV, например, университет Иннополис или Faraz Khan - автор статьи про OSCC на Medium.
В общем, всё это показалось мне интересным челенджем, и я как-то “продал” эту концепцию руководству.
Automotive grade Arduino
Для автомобиля с ДВС комплект OSCC состоит из следующих устройств:
CAN Gateway - Шлюз который пересылает определенные пакеты из CAN-шины автомобиля во внутреннюю шину OSCC.
Steering Module - перехватывает сигнал датчика усилия на руле и спуфит(подменяет) новый сигнал, который заставляет руль поворачиваться в нужную сторону.
Throttle module - аппаратно идентичный предыдущему модуль, только подключенный к датчику положения педали акселератора.
Brake module - плата управляющая гидравлическим блоком приуса.
Все платы представляют из себя Arduino-шилды. В платах CAN Gateway, Steering и Throttle используются Arduino Uno, а в плате Brake Arduino Mega.
Снобы могут сказать, что вместо Arduino лучше было взять что-то посерьезнее, но, на мой взгляд, другие микроконтроллеры вроде STM32 в данном случае не дадут преимуществ, а использование специальных автомобильных или тем более safety-контроллеров с локстепом и ECC неоправданно в проекте рассчитанном на широкую аудиторию. Да и от Arduino тут ничего кроме плат. Забегая вперёд скажу что код для блоков управления выглядит качественно:
OSCC Coding standard
As this is an automotive initiative, this coding standard is based on the MISRA C-2012 standard.
Все блоки соединяются между собой CAN-шиной. К этой же шине подключается управляющий автомобилем компьютер через CAN-USB адаптер. Я использовал PEAK PCAN-USB FD и open-source адаптер cantact, оба успешно работают.
Блоки управления запитываются через кнопку аварийного отключения, расположенную в салоне.
Схема
Тормозная система
Вот тут автор рассказывает про тормозную систему, заодно немного видно компоновку:
Нужно отметить что вся эта история с блоком ABS от приуса стала возможной благодаря некому японскому инженеру который решил что нужно разделить(!) гидравлическую часть блока ABS и его блок управления(обычно всё выполняют в едином корпусе). То есть, сам гидравлический блок ABS приуса не содержит в себе никакой программируемой электроники, только соленоиды клапанов, датчики давления и мотор насоса. Всё это выведено напрямую в разъём и соединяется с отдельным внешним блоком управления через жгут проводки. То есть, при желании блок управления можно заменить и сделать свой собственный ABS, ESP, электронный ручник для ралли/дрифта, бортовой поворот как у танка etc.
Установку на автомобиль начал с изготовления бумажного макета блока ABS приуса по 3d моделям из репозитория OSCC. С трудом, но удалось распихать всё под капотом. Для проектирования кронштейнов подкапотное пространство обмерили координатно-измерительной машиной типа “рука”.
Блок ABS от приуса можно найти на разборках примерно за 15т.р. Для сборки тормозной системы также нужны тормозные магистрали, фитинги, заглушки и т.п. По какой-то причине, BOM компонентов тормозной для Kia Soul удалили из oscc-wiki, пришлось искать его в старых коммитах. Изготавливать самостоятельно магистрали с AN3-фитингами не хотелось из соображений качества, поэтому, в Америке были заказаны готовые. Гидравлическую схему удалось найти в issues.
Платы
До этого единственными “железными” open-source проектами, которые я самостоятельно собирал, используя в качестве исходных данных gerberы и BOM, были CAN-адаптер cantact и клон ST-link.
С изготовлением плат проблем не возникло, FR4-1,5мм/35мкм. Сложность продвинутая, ну и ладно. Для удешевления объединил платы в комплект с помощью GerberPanelizer.
На этот раз ДВП из Резонита приехала с призраками чужых плат PC/104. Большинство компонентов оказалось в наличии в магазинах(осень 2020), ещё несколько заменил аналогами и только пару редких позиций пришлось ждать несколько недель. О том что на плате модуля Brake устанавливаются радиаторы я узнал случайно из картинки выложенной в твиттере.
Ещё пара фотографий блока Brake
Результат:
Больше фотографий
Софт
Для сборки программ и тестирования системы я использовал Ubuntu 16.04. В первую очередь ради совместимости с пакетом ROSCCO (требует ROS Kinetic поддерживаемый только Ubuntu 16.04). Можно было конечно взять дистрибутив посвежее и попробовать перенести ROSCCO на ROS1 поновее/ROS2 или использовать docker, но я решил не усложнять.
Вся работа с OSCC реализована через CMake, причём, не только сборка но также загрузка прошивки и отладка. Удобно.
Для проверки работы тормозной системы в OSCC есть две специальные программы для модуля Brake:
release_pressure, которая позволяет открыть одновременно несколько клапанов и сбросить давление в гидроаккумуляторе
serial_actuator позволяет вручную при помощи кнопок клавиатуры отправлять команды блоку brake по UART и управлять клапанами и насосом блока ABS.
Я использовал serial_actuator, чтобы проверить, что могу затормозить колёса. Как это ни странно, всё заработало с первого раза. Проблем не было обнаружено ни в монтаже платы(этого я боялся большего всего), ни в жгутах проводки. Однако, счастье длилось не долго. Примерно через две минуты работы с постоянно открытыми клапанами SLA блок отключился. Оказалось что сгорел предохранитель питающий блок brake. Ну подумаешь, не угадал с номиналом. Однако, ситуация повторилась при первой же попытке снова открыть клапаны SLA. Проверка мультиметром показала, что один из клапанов соленоидов вместо сопротивления 3,9Ом оказался закороченным. Тут пришло осознание, что я только что спалил приусовский блок ABS(это вам не микруху 5 вольтами сжечь). Скорее всего, напряжение на соленоид подаётся только в момент изменения давления в контуре. К тому же, во время нормальной работы программы brake клапаны управляются ШИМом с ограничением коэффициента заполнения сверху:
#define BRAKE_ACCUMULATOR_SOLENOID_DUTY_CYCLE_MAX ( 105.0 )
Но в программе serial_actuator на них подаётся:
#define SOLENOID_PWM_ON ( 255 )
что и убило соленоид. Пришлось снова искать блок на разборках. Со второго раза удалось найти в хорошем состоянии. Замена уже не составила особого труда.
Все настройки специфичные для конкретного автомобиля задаются в заголовочных файлах в директории oscc/api/include/vehicles/
Для пересылки сообщений из CAN-шины автомобиля в шину OSCC нужно выяснить ID интересующих пакетов. Для поиска я использовал cansniffer. Положение рулевого нашлось быстро - сообщение с ID 0x0C6. Значения давления в тормозной системе судя по всему нет, есть только дискретное состояние концевика тормозной педали. Сообщения с отдельными скоростями вращения колёс тоже не нашлось. Но для работы системы это не критично. Аналоговые датчики калибруются при помощи мультиметра. Напряжение на обоих каналах датчика положения педали акселератора измеряется в крайних положениях. Датчик крутящего момента калибруется при помощи груза.
И что, теперь поедем кататься? Только не мы, мы же ответственные люди.
Сначала проверим всё на машине с вывешенными колёсами при помощи утилиты oscc-check.
Программа шлёт команды блокам OSCC и проверяет результат по сообщениям в CAN шине автомобиля. После небольшого допиливания oscc-check под весту все проверки проходят успешно.
Теперь нужно настроить управление автомобилем с джойстика. У OSCC есть специальная программа oscc-joystick-commander или можно воспользоваться API для ROS - ROSCCO. Я выбрал второй вариант.
Настройки Dualshock 4: педаль газа - правый триггер R2, тормоз - левый триггер L2, рулевое - левый джойстик.
А вот теперь можно кататься!
При помощи OSCC автомобиль с электроусилителем руля, электронной педалью газа и автоматической трансмиссией удалось превратить в шасси для беспилотника. Под определение выше попадает практически любой современный автомобиль.
Электроусилитель LADA Vesta не всегда может повернуть колёса на месте и иногда уходит в ошибку и отключается. При движении даже с небольшой скоростью сопротивление повороту колёс снижается и проблема исчезает. Если ваши задачи требуют поворота колёс на месте то LADA Vesta со стандартным электроусилителем это плохой выбор.
На этом все, спасибо за внимание.
ad1Dima
У вас там веста с роботом, там и так электронный селектор. Но там нет паркинга, так что на нейтрали лучше использовать ручник.
bao-eng Автор
На сколько я знаю, селектор скорее электрический(аналоговый). То есть, рычаг просто замыкает контакты, а блок управления коробкой передач их считывает. По CAN включить передачу скорее всего не получится. Но можно сделать какой-то перехват сигналов как с рулевым или педалью акселератора. Ручник да, нужно использовать.
ad1Dima
возможно. Так глубоко я не копал. В любом случае, прямой механической связи с коробкой он не имеет, и блок управления сам решает, что делать, даже если включить "ручной" режим переключения.