mpc_python_learn/notebooks/1.1-parametrized-path-curve...

533 lines
94 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# PATH WAYPOINTS AS PARAMETRIZED CURVE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook I try to reproduce the parmetrization of the track via curve-fitting like its done in Udacity MPC Course. \n",
"在这篇笔记中我试图通过曲线拟合来重现轨迹的参数化就像在Udacity MPC课程中所做的那样。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2024-10-23T04:21:58.444911Z",
"start_time": "2024-10-23T04:21:57.902473Z"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy.interpolate import interp1d\n",
"\n",
"# 函数 compute_path_from_wp 用于生成平滑的轨迹。\n",
"# 输入start_xp 和 start_yp 分别是路径点的 x 和 y 坐标step 是插值的步长。\n",
"# 作用:通过使用线性插值的方法,在每两个路径点之间生成一些中间点,使路径更加平滑。\n",
"# 细节:\n",
"# 计算每段路径的长度。\n",
"# 使用 interp1d 对每两个路径点进行线性插值,从而在每段路径之间生成更多的中间点。\n",
"# 最后返回平滑后的路径点集合。\n",
"def compute_path_from_wp(start_xp, start_yp, step=0.1):\n",
" final_xp = []\n",
" final_yp = []\n",
" delta = step # [m]\n",
"\n",
" for idx in range(len(start_xp) - 1):\n",
" section_len = np.sum(\n",
" np.sqrt(\n",
" np.power(np.diff(start_xp[idx : idx + 2]), 2)\n",
" + np.power(np.diff(start_yp[idx : idx + 2]), 2)\n",
" )\n",
" )\n",
"\n",
" interp_range = np.linspace(0, 1, np.floor(section_len / delta).astype(int))\n",
"\n",
" fx = interp1d(np.linspace(0, 1, 2), start_xp[idx : idx + 2], kind=1)\n",
" fy = interp1d(np.linspace(0, 1, 2), start_yp[idx : idx + 2], kind=1)\n",
"\n",
" final_xp = np.append(final_xp, fx(interp_range))\n",
" final_yp = np.append(final_yp, fy(interp_range))\n",
"\n",
" return np.vstack((final_xp, final_yp))\n",
"\n",
"# 函数 get_nn_idx 用于找到车辆当前状态下,最接近的路径点索引。\n",
"# \n",
"# 输入state 是车辆的当前位置和航向角信息path 是轨迹点集合。\n",
"# 作用:找到车辆当前位置与轨迹的最近点,并根据路径点的方向矢量来决定目标点的位置。\n",
"# 细节:\n",
"# 计算车辆与路径点之间的欧氏距离,通过 np.argmin(dist) 找到最近的路径点索引。\n",
"# 然后根据路径点方向矢量,判断是否需要向前一个点继续行驶,最终返回目标路径点索引 target_idx。\n",
"def get_nn_idx(state, path):\n",
"\n",
" dx = state[0] - path[0, :]\n",
" dy = state[1] - path[1, :]\n",
" dist = np.sqrt(dx**2 + dy**2)\n",
" nn_idx = np.argmin(dist)\n",
"\n",
" try:\n",
" v = [\n",
" path[0, nn_idx + 1] - path[0, nn_idx],\n",
" path[1, nn_idx + 1] - path[1, nn_idx],\n",
" ]\n",
" v /= np.linalg.norm(v)\n",
"\n",
" d = [path[0, nn_idx] - state[0], path[1, nn_idx] - state[1]]\n",
"\n",
" if np.dot(d, v) > 0:\n",
" target_idx = nn_idx\n",
" else:\n",
" target_idx = nn_idx + 1\n",
"\n",
" except IndexError as e:\n",
" target_idx = nn_idx\n",
"\n",
" return target_idx"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2024-10-23T04:23:27.055937Z",
"start_time": "2024-10-23T04:23:27.047349Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/hd/8kg_jtmd6svgg_sc384pbcdm0000gn/T/ipykernel_8828/1217459931.py:29: RankWarning: Polyfit may be poorly conditioned\n",
" coeff = np.polyfit(\n"
]
}
],
"source": [
"# define track\n",
"wp = np.array([0, 5, 6, 10, 11, 15, 0, 0, 2, 2, 0, 4]).reshape(2, -1)\n",
"track = compute_path_from_wp(wp[0, :], wp[1, :], step=0.5)\n",
"\n",
"# vehicle state\n",
"state = [3.5, 0.5, np.radians(30)]\n",
"\n",
"# given vehicle pos find lookahead waypoints\n",
"nn_idx = (\n",
" get_nn_idx(state, track) - 1\n",
") # index ox closest wp, take the previous to have a straighter line\n",
"LOOKAHED = 6\n",
"lk_wp = track[:, nn_idx : nn_idx + LOOKAHED]\n",
"\n",
"# trasform lookahead waypoints to vehicle ref frame\n",
"# 转换前视路径点到车辆参考框架\n",
"dx = lk_wp[0, :] - state[0]\n",
"dy = lk_wp[1, :] - state[1]\n",
"\n",
"wp_vehicle_frame = np.vstack(\n",
" (\n",
" dx * np.cos(-state[2]) - dy * np.sin(-state[2]),\n",
" dy * np.cos(-state[2]) + dx * np.sin(-state[2]),\n",
" )\n",
")\n",
"\n",
"# fit poly\n",
"# 拟合多项式\n",
"coeff = np.polyfit(\n",
" wp_vehicle_frame[0, :],\n",
" wp_vehicle_frame[1, :],\n",
" 5,\n",
" rcond=None,\n",
" full=False,\n",
" w=None,\n",
" cov=False,\n",
")\n",
"\n",
"# def f(x,coeff):\n",
"# return coeff[0]*x**3+coeff[1]*x**2+coeff[2]*x**1+coeff[3]*x**0\n",
"def f(x, coeff):\n",
" return (\n",
" coeff[0] * x**5\n",
" + coeff[1] * x**4\n",
" + coeff[2] * x**3\n",
" + coeff[3] * x**2\n",
" + coeff[4] * x**1\n",
" + coeff[5] * x**0\n",
" )\n",
"\n",
"\n",
"def f(x, coeff):\n",
" y = 0\n",
" j = len(coeff)\n",
" for k in range(j):\n",
" y += coeff[k] * x ** (j - k - 1)\n",
" return y\n",
"\n",
"\n",
"# def df(x,coeff):\n",
"# return round(3*coeff[0]*x**2 + 2*coeff[1]*x**1 + coeff[2]*x**0,6)\n",
"def df(x, coeff):\n",
" y = 0\n",
" j = len(coeff)\n",
" for k in range(j - 1):\n",
" y += (j - k - 1) * coeff[k] * x ** (j - k - 2)\n",
" return y\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2024-10-22T09:48:10.578934Z",
"start_time": "2024-10-22T09:48:10.573997Z"
}
},
"outputs": [
{
"data": {
"text/plain": "array([ 0.10275887, 0.03660033, -0.21750601, 0.03551043, -0.53861442,\n -0.58083993])"
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coeff"
]
},
{
"cell_type": "code",
"execution_count": 9,
"outputs": [
{
"data": {
"text/plain": "array([-0.39433757, 0.08678766, 0.56791288, 1.04903811, 1.04903811,\n 1.67104657])"
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wp_vehicle_frame[0, :]"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-10-23T04:23:59.035926Z",
"start_time": "2024-10-23T04:23:59.011734Z"
}
}
},
{
"cell_type": "code",
"execution_count": 10,
"outputs": [
{
"data": {
"text/plain": "array([-0.34967937, -0.62745715, -0.90523492, -1.1830127 , -1.1830127 ,\n -0.7723291 ])"
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wp_vehicle_frame[1, :]"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-10-23T04:24:00.859595Z",
"start_time": "2024-10-23T04:24:00.856168Z"
}
}
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2024-10-22T09:48:14.652868Z",
"start_time": "2024-10-22T09:48:14.124049Z"
}
},
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 2 Axes>",
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.style.use(\"ggplot\")\n",
"\n",
"x = np.arange(-1, 2, 0.001) # interp range of curve\n",
"\n",
"# VEHICLE REF FRAME\n",
"plt.subplot(2, 1, 1)\n",
"plt.title(\"parametrized curve, vehicle ref frame\")\n",
"plt.scatter(0, 0)\n",
"plt.scatter(wp_vehicle_frame[0, :], wp_vehicle_frame[1, :])\n",
"plt.plot(x, [f(xs, coeff) for xs in x])\n",
"plt.axis(\"equal\")\n",
"\n",
"# MAP REF FRAME\n",
"plt.subplot(2, 1, 2)\n",
"plt.title(\"waypoints, map ref frame\")\n",
"plt.scatter(state[0], state[1])\n",
"plt.scatter(track[0, :], track[1, :])\n",
"plt.scatter(track[0, nn_idx : nn_idx + LOOKAHED], track[1, nn_idx : nn_idx + LOOKAHED])\n",
"plt.axis(\"equal\")\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"# plt.savefig(\"fitted_poly\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Error Formulation 误差公式\n",
"\n",
"So, the track can be represented by fitting a curve trough its waypoints, using the vehicle position as reference!\n",
"因此,可以通过拟合一条曲线穿过路径点来表示轨迹,并使用车辆位置作为参考!\n",
"\n",
"<!-- ![mpc](img/fitted_poly.png) -->\n",
"\n",
"Recall A fitted cubic poly has the form:\n",
"回顾一下,拟合的三次多项式形式为:\n",
"\n",
"$\n",
"f = K_0 * x^3 + K_1 * x^2 + K_2 * x + K_3\n",
"$\n",
"\n",
"The derivative of a fitted cubic poly has the form:\n",
"拟合的三次多项式的导数形式为:\n",
"\n",
"$\n",
"f' = 3.0 * K_0 * x^2 + 2.0 * K_1 * x + K_2\n",
"$\n",
"\n",
"Then we can formulate\n",
"然后我们可以进行如下公式化\n",
"\n",
"* **crosstrack error** cte: desired y-position - y-position of vehicle -> this is the value of the fitted polynomial\n",
"* **横向误差** cte期望的y位置 - 车辆的y位置 -> 这是拟合多项式的值\n",
"\n",
"* **heading error** epsi: desired heading - heading of vehicle -> is the inclination of tangent to the fitted polynomial\n",
"* **航向误差** epsi期望航向 - 车辆航向 -> 是拟合多项式的切线的倾斜\n",
"\n",
"Becouse the reference is centered on vehicle the eqation are simplified!\n",
"Then using the fitted polynomial representation in vehicle frame the errors can be easily computed as:\n",
"因为参考点是以车辆为中心的,方程得到了简化!\n",
"因此,使用车辆坐标系中的拟合多项式表示,可以很容易地计算误差:\n",
"\n",
"$\n",
"cte = f(px) \\\\\n",
"\\psi = -atan(f`(px)) \\\\\n",
"$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### In Practice:\n",
"I use a **convex** mpc so non-linearities are not allowed (in Udacity they use a general-purpose nonlinear solver) -> so this solution does not really work well for my case...\n",
"我使用了一个凸优化的 MPC因此不允许非线性项在 Udacity 的课程中,他们使用的是通用的非线性求解器) -> 因此这个解决方案对于我的情况并不太适用"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extras"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2024-10-22T09:59:44.820293Z",
"start_time": "2024-10-22T09:59:44.813407Z"
}
},
"outputs": [],
"source": [
"# 五次样条曲线\n",
"# def spline_planning(qs, qf, ts, tf, dqs=0.0, dqf=0.0, ddqs=0.0, ddqf=0.0):\n",
"# \n",
"# bc = np.array([ys, dys, ddys, yf, dyf, ddyf]).T\n",
"# \n",
"# C = np.array(\n",
"# [\n",
"# [1, xs, xs**2, xs**3, xs**4, xs**5], # f(xs)=ys\n",
"# [0, 1, 2 * xs**1, 3 * xs**2, 4 * xs**3, 5**xs ^ 4], # df(xs)=dys\n",
"# [0, 0, 1, 6 * xs**1, 12 * xs**2, 20**xs ^ 3], # ddf(xs)=ddys\n",
"# [1, xf, xf**2, xf**3, xf**4, xf**5], # f(xf)=yf\n",
"# [0, 1, 2 * xf**1, 3 * xf**2, 4 * xf**3, 5**xf ^ 4], # df(xf)=dyf\n",
"# [0, 0, 1, 6 * xf**1, 12 * xf**2, 20**xf ^ 3],\n",
"# ]\n",
"# ) # ddf(xf)=ddyf\n",
"# \n",
"# # To compute the polynomial coefficients we solve:\n",
"# # Ax = B.\n",
"# # Matrices A and B must have the same number of rows\n",
"# a = np.linalg.lstsq(C, bc)[0]\n",
"# return a"
]
},
{
"cell_type": "code",
"execution_count": 8,
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"def spline_planning(xs, xf, ys, yf, dys=0.0, dyf=0.0, ddys=0.0, ddyf=0.0):\n",
" \"\"\"\n",
" 计算五次多项式的系数,满足边界条件。\n",
"\n",
" 参数:\n",
" - xs: 初始位置 x\n",
" - xf: 最终位置 x\n",
" - ys: 初始位置 y\n",
" - yf: 最终位置 y\n",
" - dys: 初始速度 (默认值为 0)\n",
" - dyf: 最终速度 (默认值为 0)\n",
" - ddys: 初始加速度 (默认值为 0)\n",
" - ddyf: 最终加速度 (默认值为 0)\n",
"\n",
" 返回:\n",
" - a: 五次多项式的系数\n",
" \"\"\"\n",
" # 定义边界条件矩阵 B\n",
" bc = np.array([ys, dys, ddys, yf, dyf, ddyf])\n",
"\n",
" # 定义系数矩阵 A\n",
" C = np.array(\n",
" [\n",
" [1, xs, xs**2, xs**3, xs**4, xs**5], # f(xs)=ys\n",
" [0, 1, 2 * xs, 3 * xs**2, 4 * xs**3, 5 * xs**4], # df(xs)=dys\n",
" [0, 0, 2, 6 * xs, 12 * xs**2, 20 * xs**3], # ddf(xs)=ddys\n",
" [1, xf, xf**2, xf**3, xf**4, xf**5], # f(xf)=yf\n",
" [0, 1, 2 * xf, 3 * xf**2, 4 * xf**3, 5 * xf**4], # df(xf)=dyf\n",
" [0, 0, 2, 6 * xf, 12 * xf**2, 20 * xf**3], # ddf(xf)=ddyf\n",
" ]\n",
" )\n",
"\n",
" # 计算多项式系数\n",
" a = np.linalg.solve(C, bc) # 使用线性方程组求解 A * a = B\n",
" return a"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-10-22T10:01:56.052349Z",
"start_time": "2024-10-22T10:01:56.047486Z"
}
}
},
{
"cell_type": "code",
"execution_count": 11,
"outputs": [
{
"data": {
"text/plain": "<Figure size 1000x600 with 1 Axes>",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA2UAAAIlCAYAAABVWVCLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxoklEQVR4nO3dd3hUVeLG8fdOGmkklCCBEAglCNJBQGClKKKAIhZUQEWKKIjurg1lLbgosoryE3uDNVioockqxQoiKAiIKEWIoUhPCCkkmcz5/TFmICRAAknuJPl+nidPmHvP3HknjJrXc++5ljHGCAAAAABgC4fdAQAAAACgIqOUAQAAAICNKGUAAAAAYCNKGQAAAADYiFIGAAAAADailAEAAACAjShlAAAAAGAjShkAAAAA2IhSBgAAAAA2opQBQAX39NNPy7IsffXVV3ZHuSDTp0+XZVmaPn263VFK1FdffSXLsvT000/n2d6tWzdZlmVPKC9UUT4PAMoHShkAlDH16tWTZVkFftWsWTPfeDt+OTXGaO7cuerXr59q1aolf39/VatWTV26dNFLL72k9PT0UstS2n744QcNGjRIdevWVUBAgCpXrqwGDRro2muv1X/+8x+lpaXZHbHUDBkyJN9nNDg4WM2bN9fjjz+u5OTk8z72mcopAJRFvnYHAAAUXVhYmP7+97/n2x4SElL6YU6TnJysAQMGaNmyZQoLC1Pv3r1Vr149HT16VJ9//rkefPBBTZ06VYsXL9Yll1xid9xiNWPGDN15550yxqhHjx7q37+/fHx8tGvXLq1evVqLFy/WDTfcoIYNGxb7a3/wwQdeW3b79eunVq1aSZL279+vRYsWaeLEiZozZ47Wrl2r8PBwW/MBgN0oZQBQBoWHh3vlDEFOTo5uuukmrVixQr169dKHH36oatWqefY7nU49+eSTmjhxonr27Kn169cXOLtXFqWnp2vUqFGyLEtLly7VFVdckWe/y+XSl19+qerVq5fI60dHR5fIcYvD9ddfryFDhngev/jii+rQoYO2bNmiqVOn6oknnrAvHAB4AU5fBIByrFu3brrrrrskSXfddVee08gSEhLyjZ8zZ47at2+voKAgVa1aVbfccov27NlT6Nf76KOPtGLFCtWvX1/z5s3LU8gkydfXV88995xuueUW/fnnn/rXv/6VZ3/u6W47d+7UlClT1Lx5cwUGBqpbt26eMTt27NDNN9+sKlWqKDg4WJ06ddLixYvPmmvPnj267777VL9+fQUEBKhatWq67rrr9MMPP+Qbe+o1dh988IEuvfRSBQcHq169emd9jZ9//lnHjx9Xs2bN8hUySXI4HLriiivyzQpZlqVu3bpp3759uv3221WjRg0FBgaqbdu2+uijj876mqcq6JqyU0/x27Bhg/r06aPw8HAFBQXp8ssv16pVqwo8ltPp1Ouvv66OHTuqcuXKCgoKUuvWrfXqq6/K5XIVOtOZhISE6M4775QkrVmzRpK0bds2jR07Vu3atVNERIQCAgJUt25djRgxQomJiXmeP2TIEHXv3l2SNH78+Dyf64Kujfzyyy/VrVs3hYaGqnLlyurdu7d++eWXC34fAFBcmCkDgDIoMzNTM2bMUGJiooKDg9WiRQtdfvnl8vHxyTNuyJAhCg8P14IFC/KcQiYpXzl4/fXXtXDhQl133XXq2rWr1qxZo1mzZmnDhg3atGmTAgICzpnrnXfekSQ9+OCDCgoKOuO4J554QjNnztSMGTM0depUBQYG5tl///33a+XKlerTp4969+7teV/bt2/XZZddpiNHjuiaa65Rq1attGPHDl1//fXq3bt3ga+1fv16XXXVVTp69Kh69eqlG264QYcPH9b8+fPVpUsXxcfHF/jcF198UcuXL9e1116rHj16nPP6p4iICEnSvn37lJqaWqRTSZOSktS5c2eFhYXprrvuUnJysmbNmqVBgwZp7969evjhhwt9rIL8+OOP+s9//qPLLrtMw4cPV2JioubOnasrrrhCP/30k5o0aeIZm52drWuvvVaff/65Lr74Yg0cOFCVKlXSl19+qTFjxuj777/XjBkzLiiP5L7u8FTz5s3Tm2++qe7du6tTp07y9/fX5s2b9d5772nhwoVat26doqKiJLln3iTpv//9r7p27ZqntJ9enhcvXqwFCxbommuu0T333KMtW7ZoyZIl+uGHH7RlyxbP3xsA2MoAAMqUunXrGkn5vmJiYsxXX32Vb/y0adOMJDNt2rQCj/fUU08ZSSY0NNRs2rQpz77bbrvNSDKffPLJOXNlZ2cbf39/I8ls27btnOMjIyONJPPtt996tt15551GkqlVq5bZuXNnvuf07NnTSDJTpkzJs33+/Pmen8Op7zM7O9s0aNDAVKpUKc/rGGPM3r17Ta1atcxFF11kMjIyPNtzfx5BQUFm/fr153wfuVwul+nQoYORZFq0aGFeeeUVs3btWnPixImzPi83980332xycnI823fu3GmqVKli/Pz8zO+//+7Z/uWXXxpJ5qmnnspznK5du5rT/7OeO1aSmT59ep59b775ppFk7rnnnjzbc9//Aw88YJxOp2e70+k0Q4cONZJMfHx8YX4knr/P0z97aWlp5pJLLjGSzPjx440xxuzZs6fAn9WSJUuMw+EwI0eOLPC9nf5zyJX7uffx8THLly/Ps2/s2LFGknn++ecL9T4AoKRx+iIAlDF33XWXVqxYof379ystLU0///yzRo4cqYSEBF1zzTXauHHjeR33gQceUPPmzfNsGzFihCQVeJrf6Y4ePaqsrCxJUp06dc45PnfMvn378u17+OGHFRMTk2fbnj17tGzZMsXExOi+++7Ls69fv37q2rVrvuN8+umn+v333zVmzBh16dIlz75atWrpkUce0YEDB7RixYp8zx0xYoRat259zveRy7IszZ49Wz169NCmTZt0//33q3379goNDVXHjh314osvKjU1tcDn+vj4aNKkSXI4Tv5nOSYmRvfff7+ys7MVFxdX6BwF6dKli+d0wVxDhw6Vr69vnr9bl8ulV199VZGRkZo8eXKemVcfHx9NnjxZlmXpww8/LNLrz58/X08//bSefvpp3XvvvYqNjdUvv/yiBg0aaMyYMZKk2rVrFzgbe80116hp06ZaunRpkV4z12233ZbvdNK7775bUuE+1wBQGjh9EQDKmKeeeirP42bNmunNN99USEiIJk+erKefflrx8fFFPm67du3ybcstTklJSed8vjnldLTC3C8rd0xBYzt06JBv208//STJXTBOP01Tcl9T9fXXX+fZtnr1aklSQkJCgQujbN++XZL022+/qU+fPufMcC516tTRihUr9Ouvv2rZsmX68ccftXbtWq1Zs0Zr1qzR66+/ri+++CLfKXbR0dH5Smjuexo/frznvZ+vgv5u/fz8dNFFF+X5u922bZuOHDmiRo0a6d///neBxwoMDNRvv/1WpNdfsGCBFixY4Hl+vXr1NHDgQI0dO1ZVqlSR5P78fPjhh5o+fbo2btyopKQk5eTkeI7h7+9fpNfMdaGfawAoDZQyACgn7rnnHk2ePFnffPPNeT0/LCws3zZfX/d/Jk795fhMqlWrJn9/f2VlZWn37t3nXPY9dwGRyMjIfPsKWpHx2LFjkqSLLrqowOMV9JwjR45IkmbPnn3WLAXNYF3IqpBNmjTJc53Wb7/9pqFDh2r16tX6xz/+ka80n+s95b7381XQ363k/vs99e829+e1fft2jR8//ozHO9OM35lMmzYtz+qLBfnnP/+pKVOmKDIyUr169VLt2rU91xpOnz5df/zxR5FeM9eFfq4BoDRQygCgnKhRo4Yk2XZzYl9fX3Xo0EHffvutli9fftZS9ttvv2nv3r0KCAhQ27Zt8+0vaPYs95frAwcOFHjM/fv3n/E5CxYs0HXXXVeo93G2DOfr4osvVlxcnBo2bFjgqZLnek9nKlXFLfd1+vfvr3nz5pXKa0rSwYMH9corr6hZs2b67rvvFBoammf/xx9/XGpZAMAOXFMGAOVE7tLi9evXz7M991S/0pgVGD58uCRp8uTJysjIOOO43FPjbr/99nwrL55J7vVdK1euLPC9FLQUeseOHSVJ3377baFeoyTlFg1z2qqDkpSYmFjgLQpy31NRrm27EBdffLHCw8P1/fffKzs7u1ReU5J27twpl8ulq666Kl8h27Nnj3bu3JnvOaX5uQaAkkYpA4Ay5JdfftHRo0fzbd+9e7dn8YvBgwfn2Zd7r7Ddu3eXeL5Bgwape/fu2rFjh2666aZ81+zk5OToySef1EcffaTIyMgzXrdUkKioKPXs2VO7du3Sq6++mmffggUL8l1PJrkXAGnQoIFee+01LVmypMDjrl69Wunp6YXOcSa7du3SK6+8UuCphsYYPfvss5Kkyy+/PN/+nJwcPfroo3nuAZZ7PF9f33x/pyXF19dXY8aM0Z9//qn777+/wGL9559/asuWLcX6urnX2J1euFNTUzVixAg5nc58zynNzzUAlDROXwSAMmT27Nl6/vnn1b17d8XExCg0NFQ7d+7U4sWLdeLECfXu3VsPPfRQnudcdtllCgoK0pQpU3TkyBHP9Utjxowp9tPifHx8NHfuXN10001asmSJ6tevrz59+qhu3bo6evSoPv/8c+3atUv16tXTokWLinzd1muvvabLLrtMf//737V06VK1bNlSO3bsUHx8vK699lotWrQoz3g/Pz/NmzdPvXr1Up8+fdSpUye1atVKQUFB2r17t3744Qft3LlTf/7551nvq1YYx44d0wMP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RRepR48e6tOnjxyOk/+Pc+nSpVq2bJn2798vy7JUtWpVtW/fXgMHDpTkPn1x/Pjxeuqpp3TJJZfotdde09dffy1JGjBggOc4r776qmrUqKHRo0eradOmGj16dJGyHDx4UPfdd58GDx4sh8Oh//3vf0pJSVF0dLTuvPNOxcbGnv8PHgBQrChlAIAybfDgwdq4caMmT56sI0eOqGfPnmrRokWhn5+QkKDp06fr5ptvVnh4uL799ltNnz5dTqdT1113nSQpJSVF//rXv+R0OnXLLbcoIiJC69evV1xcnA4cOKDhw4dLklatWqV3331XV199tW6//XZZlqX9+/drz549Z3z9G2+8UZmZmfr+++81YcIEz/YqVaoUOL6wWXJ9/vnnql27tmfmcObMmZo4caJee+21Qs/WAQBKFqUMAFCmVapUSbfccoteeeUVhYeH6/bbby/S85OSkjRp0iTVq1dPktS6dWulpKRo7ty56tWrlwICArR48WIdPXpUzz33nBo2bChJatWqlVwul5YtW6bevXurVq1a2rp1q4KDgzV06FDP8Zs3b37W169Zs6bCwsIkqVCzV4XNkiswMFBjx471zKBVqVJFjz/+uH766Sd17ty58D8oAECJ4ZoyAECZ5nK59Nlnn8myLB07dkwJCQlFen5UVJSnkOXq0qWLMjIytGvXLknS5s2bFRUV5SlBubp16yZjjDZv3ixJatiwodLS0jRlyhT98MMPSklJOe/3dSaFzZKrTZs2eU6vrFu3riTp0KFDxZ4NAHB+KGUAgDJt0aJF2rZtmx544AFFRkbqjTfeUFZWVqGfHx4efsZtx48f93wv6HTC3G2pqamSpMsvv1z33nuvDh8+rMmTJ2vEiBF6/PHHtWnTpiK+qzMrbJZcISEheR77+flJUpF+RgCAkkUpAwCUWXv27NGsWbN0+eWXq1OnTho1apT279+vjz/+uNDHSE5OPuO20NBQz/ekpKR843K35Y6TpO7du2vChAmaPn26xo4dK2OMnn/++WKbmSpKFgBA2UApAwCUSTk5OXrttdcUGhqqu+66S5L7mqy+fftqyZIl+u233wp1nD179uQ75XHlypUKDAz03EusWbNm2rNnj3bu3Jln3Ndffy3LsnTJJZfkO26lSpXUunVr3XDDDXI6ndq9e/cZMxRl9up8sgAAvBsLfQAAyqT4+Hj9/vvvevzxxxUcHOzZfsstt2jdunV644039MILL8jf3/+sx6lSpYr+85//6Oabb1aVKlX0zTffaNOmTRo0aJACAgIkSX379tU333yj559/XgMGDPCseLh06VL17NnTs7DGm2++KX9/f1188cUKDw9XcnKy5s+fr6CgoHzXgJ0qOjpakjR//ny1bt1aDodDdevWla9v/v9MFzYLAKDsoJQBAMqchIQEzZ07V1dccYVatWqVZ5+/v79GjRqlJ554Qh9//LHuvPPOsx6rXr166tatm2bPnu25T9kdd9yhvn37esZUrlxZEyZM0EcffaSPP/7Yc2+wQYMG5RnXpEkTffXVV1q9erXS0tIUGhqqiy++WPfdd58qV658xgxdunTRb7/9pqVLl2ru3LkyxnjuU3a6wmYBAJQdljHG2B0CAAA75N48euzYsXZHAQBUYFxTBgAAAAA2opQBAAAAgI04fREAAAAAbMRMGQAAAADYiFIGAAAAADailAEAAACAjShlAAAAAGAjShkAAAAA2IhSBgAAAAA2opQBAAAAgI0oZQAAAABgo/8HquVo9/b3kRUAAAAASUVORK5CYII="
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# 初始和最终位置及其条件\n",
"xs = 0 # 初始位置\n",
"xf = 10 # 最终位置\n",
"ys = 0 # 初始位置 y\n",
"yf = 5 # 最终位置 y\n",
"dys = 1.0 # 初始速度\n",
"dyf = 0.5 # 最终速度\n",
"\n",
"# 计算多项式系数\n",
"coefficients = spline_planning(xs, xf, ys, yf, dys, dyf)\n",
"\n",
"# 使用计算出的系数生成样条曲线\n",
"x_vals = np.linspace(xs, xf, 100)\n",
"y_vals = [\n",
" coefficients[0] * x**5 + coefficients[1] * x**4 + coefficients[2] * x**3 + coefficients[3] * x**2 + coefficients[4] * x + coefficients[5]\n",
" for x in x_vals\n",
"]\n",
"\n",
"# 绘制样条曲线\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(x_vals, y_vals, label='Splined Path')\n",
"plt.xlabel('X position')\n",
"plt.ylabel('Y position')\n",
"plt.title('5th Order Spline Path')\n",
"plt.legend()\n",
"plt.grid()\n",
"plt.show()"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-10-22T10:02:42.157868Z",
"start_time": "2024-10-22T10:02:42.097737Z"
}
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
}
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"language": "python",
"display_name": "Python 3 (ipykernel)"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}