Если вы программист, имеете страсть к автомобилям и не чураетесь математики, вот вам развлечение. Ставится задача соорудить алгоритм руления машинкой, который бы отслеживал повороты дороги. Вот как это выглядит:
Задачка взята из учебной программы Стэнфордского университета. На сайте образовательной платформы 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-Controlhttps://github.com/zhujun98/controlhttps://github.com/rtsaad/CarND-MPC-Projecthttps://github.com/sohonisaurabh/CarND-MPC-Projecthttps://github.com/ksakmann/CarND-MPC-Projecthttps://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.