RuCore.NET

Как удаленно управлять автомобилем?





Современный автомобиль имеет тонны систем управления, функционирующих во многих отношениях, как микросервисы в веб-разработке. Подумайте о подушках безопасности, торможении, круиз-контроле, электроусилителе руля, аудиосистемах, электростеклоподъемниках, дверях, регулировке зеркал, аккумуляторах и системах подзарядки для электромобилей. Эти системы должны быть в состоянии общаться и читать состояние друг от друга. В 1983 году команда Bosch приступила к разработке шины CAN (Controller Area Network) для решения этой сложной проблемы.

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



Автомобили с автономным управлением и как они связаны с CAN

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

Почему?

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

Путем обратного инжиниринга, CAN позволяет подавать команды на автомобиль с помощью ПО.

Самыми необходимыми командами являются управление (угол поворота), ускорение и торможение.

Используя такие датчики, как LIDAR, автомобиль может видеть мир. ПК внутри авто может принимать решения о подаче команд на CAN для управления, ускорения, торможения и многого другого.

Не каждый автомобиль готов к самостоятельному вождению, и есть причина, по которой команда Voyage выбрала Ford Fusion.

Взлом Ford Fusion

Чтобы перед хаком климат-контроля в Ford Fusion, я открыл свою любимую книгу (The Car Hacker’s Handbook) и приступил к работе.

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

Шина CAN

CAN был стандартом для легковых и легких грузовых автомобилей США с 1994 года, но он не стал обязательным до после 2008. Он работает на двух проводах: CAN высокий (CANH) и CAN низкий (CANL). CAN использует дифференциальную сигнализацию, что означает, что когда поступает сигнал, CAN повышает напряжение на одной линии и сбрасывает другую линию на равную величину. Дифференциальная сигнализация используется в средах, которые должны быть устойчивы к помехам, например, в автомобильных системах и на производстве.

При этом пакеты, которые передаются по шине CAN нестандартны.

Каждый пакет шины CAN содержит четыре ключевых элемента:

Арбитражный идентификатор — это широковещательное сообщение, которое идентифицирует идентификатор устройства, пытающегося установить связь, хотя любое одно устройство может отправить несколько арбитражных идентификаторов. Если два пакета CAN отправляются по шине одновременно, выигрывает пакет с более низким идентификатором арбитража.

Расширение идентификатора (IDE) Этот бит всегда равен o для стандартного CAN.

Код длины данных (DLC) — это размер данных, который варьируется от 0 до 8 байтов.

Данные. Собственно, данные. Максимальный размер может составлять до 8 байтов.

Формат стандартных пакетов CAN

Фреймы

Чтобы включить или выключить кондиционер, нам нужно найти правильную шину CAN (в машине может быть несколько).

Ford Fusion имеет как минимум 4 задокументированные шины, 3 из которых работают на скорости 500 кбит / с (высокоскоростная CAN), а одна — на 125 кбит / с (среднескоростная CAN).

Порт OBD-II предоставляет две из этих шин: HS1 и HS2, но они защищены брандмауэром на этом автомобиле и не позволяют вам подделывать команды.

С помощью Алана из Voyage мы вывернули проблему наизнанку и обнаружили свободный доступ к HS1, HS2, HS3 и MS.

Решение было в задней части порта OBD-II, куда все эти шины поступают на устройство, называемое шлюз-модулем.

Поскольку A / C может быть изменен через автомобильный медиаинтерфейс (SYNC), мы пошли прямо к шине MS.

Но как сделать так, чтобы наш компьютер мог читать и записывать CAN-пакеты?

Ответ — SocketCAN, набор драйверов CAN с открытым исходным кодом и сетевым стек, предоставленный Volkswagen Research для ядра Linux.

Мы можем подключить 3 провода от автомобиля: GND, MSCANH, MSCANL к Kvaser Leaf Light HSv2 (300 долларов на Amazon) или к CANable (25 долларов на Tindie) и получить компьютер с последним ядром Linux для загрузки шины CAN в качестве сетевого устройства.

modprobe can
modprobe kvaser_usb
ip link set can0 type can bitrate 1250000
ifconfig can0 up

После загрузки мы можем использовать Candump Can0 и начать смотреть на трафик:

Однако это равносильно просмотру амплитуды звукового сигнала — очень сложно охарактеризовать происходящее и обнаружить закономерности.

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

Cansniffer показывает список идентификаторов и помогает сосредоточиться только на том, что меняется в разделе данных кадра CAN. Когда мы разбираемся с конкретными идентификаторами, мы можем использовать их, чтобы отфильтровать то, что нам не нужно, и включить только то, что, по нашему мнению, связано с нашей проблемой.

Вот пример cansniffer на шине MS. Мы отфильтровываем все и только позволяем CAN идентификаторам 355, 356 и 358 показываться. Тем временем я нажимаю кнопки регулировки температуры на автомобиле, и мы видим, что 001C00000000, представляющий нажатие кнопки, всплывает в самом конце.

Следующим шагом является подключение функции A / C к нашему ПК, работающему внутри автомобиля.

ПК работает под управлением Robot Operating System (ROS), и, к счастью, есть модуль, который облегчает нам эту задачу, поскольку мы используем SocketCAN. socketcan_bridge превращает наш кадр CAN в сообщение в теме ROS. Отлично!

Вот пример того, как выполняется декодирование:

if frame.id == 0x356:
 raw_data = unpack ('BBBBBBBB', frame.data)
 fan_speed = raw_data [1] / 4
 driver_temp = parse_tempera (raw_data [2: 4])
 passenger_temp = parse_tempera (raw_data [4: 6])

Полученные данные хранятся в CelsiusReport.msg:

bool auto
bool system_on
bool unit_on
bool dual
bool max_cool
bool max_defrost
bool recirculation
bool head_fan
bool feet_fan
bool front_defrost
bool rear_defrost
string driver_temp
string passenger_temp

После нажатия всех соответствующих кнопок в машине мы получаем список:

И тогда мы можем просто отправить команды на узел ROS и заставить его преобразовать его в конкретные коды автомобиля:

rostopic pub /celsius_control celsius/CelsiusControl ac_toggle

Результат

Теперь мы можем выдавать те же коды CAN на шину CAN, как будто мы по настоящему нажимаем на кнопки!

Это дает нам возможность удаленно изменять температуру автомобиля, находясь в приложении, сидя на заднем сиденье. Успех!

 

Источник: Телеграм



Поделись статьей с друзьями


54 просмотров



Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: