Skip to content

Instantly share code, notes, and snippets.

@aemarkov
Last active March 12, 2019 23:36
Show Gist options
  • Select an option

  • Save aemarkov/79e808355544172f4186e4be158e5c49 to your computer and use it in GitHub Desktop.

Select an option

Save aemarkov/79e808355544172f4186e4be158e5c49 to your computer and use it in GitHub Desktop.
Motion planner description
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Планирование траектории с помощью полиномов пятого порядка\n",
"## Положение motion_planner в системе управления беспилотным автомобилем\n",
"Motion planner занимается планированием локальной траеткории, чтобы она была достижима для автомобиля (не нарушала\n",
"его кинематические и динамические ограничения) и не сталкивалась с препятствиями. Motion planner получает цель (положение и скорость) от планнара более высокого порядка. Помиом этого, из-за особенностей текущего подхода к реализации планнера, ему потребуется некий идеальный опорный путь, `reference_path`, от которого он будет отталкиваться. Например, это может быть просто центр полосы, по которой едет автомобиль, а планер уже сформирует `local_path`, который будет учитывать скорость, избегать препятствия и т.п.\n",
"## Идея решения\n",
"### Frenet frame\n",
"Мы зададим траекторию движения автомобиля из одной точки в другую путем интерполяции кривой. Важно заметить, что траектория - не просто линия на 2D плоскости, а изменение положения, скорости и ускорения автомобиля от времени.\n",
"\n",
"Для упрощения задачи мы не будем осуществлять планирование в глобальной декартовой системе координат, а выберем\n",
"движующую систему координат, связанную с `reference_path` или `center line`. По-английски это называется Frenét Frame method, по-русски не знаю. На рисунке изображено положение автомобиля относительно системы координат:\n",
"\n",
"![](https://i.imgur.com/7AZULXX.png)\n",
"\n",
"$\n",
"\\begin{align*}\n",
" \\text{где } & \\vec{r}(s) &-& \\text{ центр подвижной С.К.}\\\\\n",
" & \\vec{n}_r, \\vec{t}_r &-& \\text{ нормальный и тангенцальный векторы подвижной С.К.,}\\\\\n",
" & s(t) &-& \\text{ покрытая длина дури за время}\\\\\n",
" & \\vec{x}(s,d) &-& \\text{ координата автомобиля в глобальной С.К.,}\\\\\n",
" & \\vec{x}_x, \\vec{t}_x &-& \\text{ нормальный и тангенцальный векторы С.К. автомобиля,}\\\\\n",
" & d(t) &-& \\text{ расстояние автомобиля от центральной линии.}\n",
"\\end{align*}\n",
"$\n",
"\n",
"### Про полиномы\n",
"Будем рассматривать отдельно продольное движение вдоль `reference_path` $s(t)$ и поперечное движение $d(s)$, а затем объединим их. Мы хотим, чтобы $jerk = \\dot{d} = \\dddot{d}$ (рывок) был минимален. Хотим, чтобы и та, и та траектория имели минимальный $jerk$, т.е. минимизировали следующую функцию стоимости (приведено для поперечного, для продольного аналоигично:\n",
"$$\n",
"J = \\int_{t_0}^{t_1}{\\dddot{d}d\\tau}\n",
"$$\n",
"\n",
"\n",
"Из какого-то хардкорного матана известно, что оптимальным решением в данном случае будут полиномы пятого порядка:\n",
"$$\n",
"y = a_1 x^5 + a_2 x^4 + a_3 x^3 + a_4 x^2 + a_5 x + a_6\n",
"$$\n",
"\n",
"Профит тут еще в том, что такие полиномы гладко между собой стыкуются. Если мы расчитали участок траектории, проехали по нему, взяли новые текущие положение, скорость, ускорение, и использовали их для построения нового полинома, то переход будет гладким для 3х (?) производных. Ну двух точно.\n",
"\n",
"Тогда подставим граничные условия и найдем коэффициенты. В качестве начальных условий берется текущее состояние автомобиля, полученное с датчиков, а в качестве конечного - желаемое состояние, полученное от планнера более высокого порядка.\n",
"\n",
"### Поперечное движение\n",
"Текущее отклонение автомобиля от `reference_path` $d_0$, текущие боковая скорость и ускорение $\\dot{d_0}$ и $\\ddot{d_0}$ соответственно. Хотим, чтобы автомобиль за время T перешел состояние, где отклонение от `reference_path` будет $d_1$, боковые скорость и ускорение равны нулю.\n",
"\n",
"$$\n",
"D_0 = [d_0, \\dot{d_0}, \\dot{d_0}] \\\\\n",
"D_1 = [d_1, 0, 0, T]\n",
"$$\n",
"\n",
"Функция стоимости%\n",
"$$\n",
"C = k_j \\int_{t_0}^{t_1}{\\dddot{d}d\\tau} + k_t T = k_p d_{err}^2\n",
"$$\n",
"\n",
"$\n",
"\\begin{align*}\n",
" \\text{где } & k_j, k_t, k_p &-& \\text{ коэффициенты,}\\\\\n",
" & T &-& \\text{ время выполнения маневра,}\\\\\n",
" & d_{err} &-& \\text{ финальное отклонение от желаемого поперечного положения. }\n",
"\\end{align*}\n",
"$\n",
"\n",
"Суть в том, чтоы мы хотим, чтобы дергания (jerk) во время маневра было как можно меньше (планывй маневр), но и он был не очень долгим, ну и таки привел нас в требуемое положение.\n",
"\n",
"Аналогично с продольным движением, но там хитрее, потому что может быть такое, когда мы просто едем по пустой дороге, надо задать целевую скорость, но целевого положения нет. Наверное, согласно статье. Я еще не продумал этот момент.\n",
"\n",
"Казалось бы, все хорошо. АВОТХУЙ. Задача найти коэффициенты, которые дадут траекторию, которая будет оптимизировать заданную функцию стоимости, да еще не будет натыкаться на препятствия, удовлетоврять кинематическим и динамическим ограничениям, матанистически невозможно (ну либо очент трудно). Поэтому мы просто зададим множество конечных точек, немного отличающихся друг от друга, получим кучу траекторий из одной точки и выберем из них лучшую.\n",
"\n",
"Варьируем конечное положение и время выполнения маневра:\n",
"$$\n",
"D_1 = [d_1, \\dot{d_1}, \\ddot{d_1}, T]_{ij} = [d_{1i}, \\dot{d_1}, \\ddot{d_1}, T_j]\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from car_core.motion_planner.frenet import FrenetFrame\n",
"import car_core.motion_planner.quintic as quintic\n",
"from car_core.motion_planner.trajectory import Trajectory"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Короче, это еще не доделанное\n",
"ROAD_WIDTH = 3.5*2\n",
"\n",
"D_MIN = -ROAD_WIDTH/2\n",
"D_MAX = ROAD_WIDTH/2\n",
"D_STEP = 1\n",
"S_MIN = 10\n",
"S_MAX = 20 \n",
"S_STEP = 1\n",
"S_CALC_STEP = 0.1\n",
"\n",
"N_ROAD_POINTS = 100\n",
"\n",
"def arange(min, max, step):\n",
" return np.arange(min, max+step, step)\n",
"\n",
"def plot_trajectory(trajectory):\n",
" plt.plot(trajectory.x, trajectory.y)\n",
"\n",
"np_path = np.stack((np.zeros(N_ROAD_POINTS), np.linspace(0,30,N_ROAD_POINTS)), axis=1)\n",
"pos = [0,0]\n",
"vel = [0,0]\n",
"\n",
"# Calc position and velocity in Frenet frame\n",
"frenet_frame = FrenetFrame(0, np_path[1], np_path[0])\n",
"pos_frenet = frenet_frame.point_to(pos)\n",
"vel_frenet = frenet_frame.vector_to(vel)\n",
"\n",
"s1 = pos_frenet[0] # initial lon position in frenet frame\n",
"ds1 = vel_frenet[0] # initial lon position in frenet frame\n",
"d1 = pos_frenet[1] # initial lat position in frenet frame\n",
"dd1 = vel_frenet[1] # initial lat speed in frenet frame\n",
"\n",
"#for si in arange(S_MIN, S_MAX, S_STEP):\n",
"lat_trajectories = []\n",
"s_values = arange(0, S_MAX, S_CALC_STEP)\n",
"for di in arange(D_MIN, D_MAX, D_STEP):\n",
" lat_coefs = quintic.calc_coefs((d1, dd1, 0), (di, 0, 0), S_MAX)\n",
" lat_trajectory = Trajectory(s_values, *quintic.interpolate(lat_coefs, s_values)) \n",
" lat_trajectories.append(lat_trajectory)\n",
" \n",
"for trajectory in lat_trajectories:\n",
" plot_trajectory(trajectory)\n",
" \n",
"plt.title('Lateral position')\n",
"plt.xlabel('s, m')\n",
"plt.ylabel('d, m')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment