vak: (Default)
[personal profile] vak
Если вы программист, имеете страсть к автомобилям и не чураетесь математики, вот вам развлечение. Ставится задача соорудить алгоритм руления машинкой, который бы отслеживал повороты дороги. Вот как это выглядит:



Задачка взята из учебной программы Стэнфордского университета. На сайте образовательной платформы Udacity есть курс Self Driving Car Engineer Nanodegree для инженеров-разработчиков самоездящих автомобилей. Сам курс стоит $2400, но симулятор иисходные коды свободно доступны на гитхабе.

Симулятор автомобиля и трассы скачиваем здесь: https://github.com/udacity/self-driving-car-sim/releases/
Распаковываем и запускаем под линуксом бинарный файл term2_sim.x86_64. Выбираем размер окна и качество картинки. Нам нужно пятое задание, Project 5: MPC Controller. В ручном режиме можно поуправлять машинкой с помощью клавиш W, A, S, D.

При запуске симулятор пытается соединиться с блоком автоматического управления через TCP-порт 4567. Если блок управления присутствует, машинка начинает ехать в автоматическом режиме, как показано выше на видео. Ваша задача сделать такой блок управления. Заготовка исходных текстов на языке Си++ находится на гитхабе (https://github.com/udacity/CarND-MPC-Project). Ищите комментарии TODO.

Подробное описание задачи можно посмотреть в статье: https://medium.com/@NickHortovanyi/carnd-controls-mpc-2f456ce658f



Народ уже наваял некоторое количество реализаций. Можно начать с компиляции и запуска этих вариантов:
https://github.com/NikolasEnt/Model-Predictive-Control
https://github.com/zhujun98/control
https://github.com/rtsaad/CarND-MPC-Project
https://github.com/sohonisaurabh/CarND-MPC-Project
https://github.com/ksakmann/CarND-MPC-Project
https://github.com/hortovanyi/CarND-MPC-Project

Каждые 100 миллисекунд симулятор посылает блоку управления запрос в формате JSON:

["telemetry",{"ptsx":[-32.16173,-43.49173,-61.09,-78.29172,-93.05002,-107.7717],"ptsy":[113.361,105.941,92.88499,78.73102,65.34102,50.57938],"psi_unity":4.12033,"psi":3.733651,"x":-40.62,"y":108.73,"steering_angle":-8.138426E-07,"throttle":1,"speed":4.380013}]

Запрос содержит текущую координату и ориентацию машинки (x, y, psi), скорость (speed) и шесть точек предстоящего пути (ptsx[], ptsy[]).

Блок управления должен вернуть требуемый угол положения руля (steering_angle) и ускорение (throttle). В этом вся суть алгоритма управления:

{"steering_angle":-1.86519027057093e-06,"throttle":1.0}

Можно также вернуть список точек дороги (next_x, next_y), который отрисовывается жёлтым, и список точек предсказанной траектории (mpc_x, mpc_y), который будет показан зелёным. Разбор запроса и формирование ответа смотрите в строках 86-143 файла src/main.cpp.

Date: 2018-05-16 22:19 (UTC)
sab123: (Default)
From: [personal profile] sab123
Ссылка на неправильный ютюб.

Date: 2018-05-17 00:47 (UTC)
sab123: (Default)
From: [personal profile] sab123
Там в обоих постах в ютюбе мужики музыку играют. О, уже нет, теперь правильный. Не знаю, где был глюк.
Edited Date: 2018-05-17 00:47 (UTC)