mpc_python_learn/notebook/MPC_scipy_v2.ipynb

617 lines
90 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use(\"ggplot\")\n",
"import time\n",
"from scipy.interpolate import interp1d\n",
"from scipy.integrate import odeint\n",
"from scipy.optimize import minimize"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"differential drive kinematics model equations"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"#Preliminaries\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(np.sqrt(np.power(np.diff(start_xp[idx:idx+2]),2)+np.power(np.diff(start_yp[idx:idx+2]),2)))\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",
"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 = [path[0,nn_idx+1] - path[0,nn_idx],\n",
" path[1,nn_idx+1] - path[1,nn_idx]] \n",
" v /= np.linalg.norm(v)\n",
"\n",
" d = [path[0,nn_idx] - state[0],\n",
" 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\n",
"\n",
"def road_curve(state,track):\n",
" \n",
" #given vehicle pos find lookahead waypoints\n",
" nn_idx=get_nn_idx(state,track)\n",
" LOOKAHED=6\n",
" lk_wp=track[:,nn_idx:nn_idx+LOOKAHED]\n",
"\n",
" #trasform lookahead waypoints to vehicle ref frame\n",
" dx = lk_wp[0,:] - state[0]\n",
" dy = lk_wp[1,:] - state[1]\n",
"\n",
" wp_vehicle_frame = np.vstack(( dx * np.cos(-state[2]) - dy * np.sin(-state[2]),\n",
" dy * np.cos(-state[2]) + dx * np.sin(-state[2]) ))\n",
"\n",
" #fit poly\n",
" return np.polyfit(wp_vehicle_frame[0,:], wp_vehicle_frame[1,:], 3, rcond=None, full=False, w=None, cov=False)\n",
"\n",
"def f(x,coeff):\n",
" return round(coeff[0]*x**3 + coeff[1]*x**2 + coeff[2]*x**1 + coeff[3]*x**0,6)\n",
"\n",
"def df(x,coeff):\n",
" return round(3*coeff[0]*x**2 + 2*coeff[1]*x**1 + coeff[2]*x**0,6)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
"from math import cos\n",
"# Define process model\n",
"def kinematics_model(xt,ut,K,dt=0.1):\n",
"\n",
" #current state\n",
" xp = xt[0]\n",
" yp = xt[1]\n",
" theta = xt[2]\n",
" etheta = xt[4]\n",
"\n",
" vt = ut[0]\n",
" wt = ut[1]\n",
"\n",
" #next state\n",
" xtp = xp + vt*cos(theta)*dt\n",
" ytp = yp + vt*np.sin(theta)*dt\n",
" thetatp = theta + wt*dt\n",
" ctetp = f(xp,K) - yp + vt*np.sin(etheta)*dt\n",
" ethetatp = theta - np.arctan(df(xp,K)) + wt*dt\n",
" \n",
" dqdt = [xtp,ytp,thetatp,ctetp,ethetatp]\n",
" return dqdt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"simulate"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"# time points\n",
"t = np.arange(0, 40, 0.1)\n",
"\n",
"#fake inputs\n",
"# u = [v(t),\n",
"# w(t)]\n",
"u = np.zeros((2,len(t)))\n",
"u[0,100:]=0.4\n",
"u[1,200:]=0.1\n",
"u[1,300:]=-0.0"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"track = compute_path_from_wp([0,5,10],[0,0,2])\n",
"\n",
"# initial conditions\n",
"q0 = np.array([0,0,0,0,0])\n",
"K = road_curve(q0,track)\n",
"q0[3] = f(q0[0],K)\n",
"q0[4] = - np.arctan(df(q0[0],K))\n",
"\n",
"# store solution\n",
"x = np.empty_like(t)\n",
"y = np.empty_like(t)\n",
"theta = np.empty_like(t)\n",
"cte = np.empty_like(t)\n",
"psi = np.empty_like(t)\n",
"\n",
"# record initial conditions\n",
"x[0] = q0[0]\n",
"y[0] = q0[1]\n",
"theta[0] = q0[2]\n",
"cte[0] = q0[3]\n",
"psi[0] = q0[4]\n",
"\n",
"# solve ODE\n",
"for i in range(1,len(t)):\n",
" # span for next time step\n",
" q_t = kinematics_model(q0,u[:,i-1],K,dt=0.1)\n",
"\n",
" # store solution for plotting\n",
" x[i] = q_t[0]\n",
" y[i] = q_t[1]\n",
" theta[i] = q_t[2]\n",
" cte[i] = q_t[3]\n",
" psi[i] = q_t[4]\n",
" # next initial condition\n",
" q0 = q_t"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#plot trajectory\n",
"plt.subplot(2, 2, 1)\n",
"plt.plot(x,y)\n",
"plt.scatter(track[0,:],track[1,:])\n",
"plt.ylabel('y')\n",
"plt.xlabel('x')\n",
"\n",
"#plot x(t)\n",
"plt.subplot(2, 2, 2)\n",
"plt.plot(t,theta)\n",
"plt.ylabel('theta(t)')\n",
"#plt.xlabel('time')\n",
"\n",
"\n",
"#plot y(t)\n",
"plt.subplot(2, 2, 3)\n",
"plt.plot(t,cte)\n",
"plt.ylabel('cte(t)')\n",
"#plt.xlabel('time')\n",
"\n",
"#plot theta(t)\n",
"plt.subplot(2, 2, 4)\n",
"plt.plot(t,psi)\n",
"plt.ylabel('psi(t)')\n",
"#plt.xlabel('time')\n",
"#plt.legend(loc='best')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"mpc"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
"# Define Objective function\n",
"def objective(u_hat,*args):\n",
" \"\"\"\n",
" Computes objective function\n",
" \n",
" :param u_hat: array_like, input [v,w\n",
" v,w\n",
" ...]\n",
" \"\"\"\n",
" \n",
" #undo input flattening\n",
" u_hat = u_hat.reshape(2, -1).T\n",
" se = np.zeros(PRED_HZN) #squared_errors\n",
" \n",
" # Prediction\n",
" for k in range(PRED_HZN):\n",
" \n",
" # Initialize state for prediction\n",
" if k==0:\n",
" q_hat0 = args[0]\n",
" K=args[1] #road curve\n",
" \n",
" # Clamp control horizon\n",
" elif k>CTRL_HZN:\n",
" u_hat[k,:] = u_hat[CTRL_HZN,:]\n",
" \n",
" #DEBUG\n",
"# print(\"k : {}\".format(k))\n",
"# print(\"q_hat0 : {}\".format(q_hat0))\n",
"# print(\"ts : {}\".format(ts_hat))\n",
"# print(\"u_hat : {}\".format(u_hat[k,:]))\n",
" \n",
" q_hat = kinematics_model(q_hat0,u_hat[k,:],K,dt=0.1)\n",
" cte=q_hat[3]\n",
" psi=q_hat[4]\n",
" \n",
" q_hat0 = q_hat[:]\n",
"\n",
" if k >0:\n",
" delta_u_hat = np.sum(u_hat[k,:]-u_hat[k-1,:])\n",
" else:\n",
" delta_u_hat = 0\n",
"\n",
" se[k] = 100 * (cte)**2 + 15 *(psi)**2 + 15 * (delta_u_hat)**2\n",
"\n",
" # Sum of Squared Error calculation\n",
" obj = np.sum(se[1:])\n",
" return obj"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"TODO: add heading error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"test optimization"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [],
"source": [
"#PARAMS\n",
"v=1.5\n",
"vb=0.5\n",
"wb=0.5\n",
"\n",
"# Define horizons\n",
"PRED_HZN = 20 # Prediction Horizon\n",
"CTRL_HZN = 15 # Control Horizon\n",
"\n",
"delta_t_hat = 0.1 #time step"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" fun: 84.46152413856359\n",
" jac: array([-1.65424156, -5.46248531, -4.66883278, -3.61091423, -7.25656319,\n",
" -9.97307396, -7.68648052, -5.46970558, -3.82968616, 0.67185783,\n",
" -1.15515804, -1.96808815, 1.28362656, -2.83778381, -0.42825508,\n",
" -0.31342316, 0. , 0. , 0. , 0. ,\n",
" 38.85329056, 29.67042637, 24.17370987, 19.24147987, 10.30806732,\n",
" 3.07283115, 1.61050224, 0.68769073, -0.09304619, 2.58471298,\n",
" -0.30147457, -1.62229347, 1.39114475, -2.71041679, -0.22286892,\n",
" 1.22416592, 0. , 0. , 0. , 0. ])\n",
" message: 'Iteration limit exceeded'\n",
" nfev: 5103\n",
" nit: 101\n",
" njev: 101\n",
" status: 9\n",
" success: False\n",
" x: array([ 1.64242978, 1.69757121, 1.81361202, 1.90182763, 1.90182763,\n",
" 1.90182763, 1.90182763, 1.90182763, 1.83511965, 1.84792843,\n",
" 1.68088567, 1.43951262, 1.44726228, 1.25067572, 1.25506942,\n",
" 1.37310177, 1.37310177, 1.37310177, 1.37310177, 1.37310177,\n",
" -0.5 , -0.5 , -0.49058099, -0.47680101, -0.47680101,\n",
" -0.47680101, -0.38569852, -0.26192364, -0.07803742, 0.00765328,\n",
" 0.14826226, 0.33421738, 0.29494089, 0.39434771, 0.37513876,\n",
" 0.25069961, 0.25069961, 0.25069961, 0.25069961, 0.25069961])\n",
"time elapsed: 3.1107125282287598\n"
]
}
],
"source": [
"starting_pos=np.array([0,0.25,0.15])\n",
"track = compute_path_from_wp([0,5,10],[0,0,2])\n",
"K = road_curve(starting_pos,track)\n",
"\n",
"# initial conditions\n",
"q0 = np.array([0,0,0,0,0])\n",
"q0[3] = f(q0[0],K)\n",
"q0[4] = - np.arctan(df(q0[0],K))\n",
"\n",
"#starting guess\n",
"u_hat0 = np.zeros((PRED_HZN,2))\n",
"u_hat0[:,0]=v\n",
"u_hat0[:,1]=0.1\n",
"u_hat0=u_hat0.flatten(\"F\")\n",
"\n",
"bnds=((v-2*vb,v+vb),)\n",
"for i in range (PRED_HZN-1):\n",
" bnds=bnds+((v-2*vb,v+vb),)\n",
" \n",
"bnds=bnds+((-wb,wb),)\n",
"for i in range (PRED_HZN-1):\n",
" bnds=bnds+((-wb,wb),)\n",
"\n",
"# print(u_hat0)\n",
"# print(u_hat0.reshape(2, -1).T)\n",
"\n",
"start = time.time()\n",
"\n",
"solution = minimize(objective,u_hat0,args=(q0[:],K,),method='SLSQP',bounds=bnds,options={'maxiter':100})\n",
"\n",
"end = time.time()\n",
"\n",
"print(solution)\n",
"print(\"time elapsed: {}\".format(end-start))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"check what the optimizer returns"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"u=solution.x.reshape(2,-1).T\n",
"x=[]\n",
"y=[]\n",
"theta=[]\n",
"x.append(starting_pos[0])\n",
"y.append(starting_pos[1])\n",
"theta.append(starting_pos[2])\n",
"\n",
"for i in range(1,np.shape(u)[0]):\n",
" \n",
" # store solution for plotting\n",
" x.append(x[-1]+u[i,0]*np.cos(theta[-1])*0.1)\n",
" y.append(y[-1]+u[i,0]*np.sin(theta[-1])*0.1)\n",
" theta.append(theta[-1]+u[i,1]*0.1)\n",
" \n",
"plt.plot(x,y)\n",
"plt.plot(track[0,:],track[1,:])\n",
"plt.ylabel('y')\n",
"plt.xlabel('x')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"compute MPC on the whole path"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SCIPY Optimization Time: Avrg: 0.2300s Max: 3.1533s Min: 0.0260s\n"
]
}
],
"source": [
"curr_pos=np.array([0,0.25,0.15])\n",
"start_wpx=[0,5,7.5,8,10,15]\n",
"start_wpy=[0,0,5,10,10,12]\n",
"track = compute_path_from_wp(start_wpx,start_wpy)\n",
"x=[]\n",
"y=[]\n",
"theta=[]\n",
"x.append(curr_pos[0])\n",
"y.append(curr_pos[1])\n",
"theta.append(curr_pos[2])\n",
"\n",
"opt_time=[]\n",
"\n",
"# Initialize input for prediction horizon\n",
"# u=[v1,v2,...,vp\n",
"# w1,w2,...,wp]\n",
"\n",
"# Initial guess \n",
"# u_hat0=[v1,v2,..vp,w1,w2,...,wp]\n",
"# uhat0 -> u_hat=optimize(obj,u_hat0)\n",
"\n",
"u_hat0 = np.zeros((PRED_HZN,2))\n",
"u_hat0[:,0]=v\n",
"u_hat0[:,1]=0.01\n",
"u_hat0=u_hat0.flatten(\"F\")\n",
"\n",
"# Optimization Bounds\n",
"# bnds=((v1_min,v1_max),...,(vp_min,vp_max),(w1_min,w1_max),...,(wp_min,wp_max))\n",
"\n",
"bnds=((v-2*vb,v+vb),)\n",
"for i in range (1,PRED_HZN):\n",
" bnds=bnds+((v-2*vb,v+vb),)\n",
" \n",
"bnds=bnds+((-wb,wb),)\n",
"for i in range (1,PRED_HZN):\n",
" bnds=bnds+((-wb,wb),)\n",
"\n",
"#while np.sum(np.abs(q[-1,0:2]-path[-1,0:2]))>0.1:\n",
"for i in range(50): \n",
" \n",
" start = time.time()\n",
" K = road_curve(curr_pos,track)\n",
" \n",
" # initial conditions for opt.\n",
" q0 = np.array([0,0,0,0,0])\n",
" q0[3] = f(q0[0],K)\n",
" q0[4] = - np.arctan(df(q0[0],K))\n",
"\n",
" #MPC LOOP\n",
" u_hat = minimize(objective,\n",
" u_hat0,\n",
" args=(q0,K,),\n",
" method='SLSQP',\n",
" bounds=bnds,\n",
" options={'maxiter':100}\n",
" ).x\n",
" \n",
" end = time.time()\n",
" opt_time.append(end-start)\n",
" \n",
" # store solution for plotting\n",
" x.append(x[-1]+u[0,0]*np.cos(theta[-1])*0.1)\n",
" y.append(y[-1]+u[0,0]*np.sin(theta[-1])*0.1)\n",
" theta.append(theta[-1]+u[0,1]*0.1)\n",
" \n",
" next_pos = [x[-1],y[-1],theta[-1]]\n",
" \n",
" # next initial condition\n",
" curr_pos=next_pos\n",
" u_hat0=u_hat\n",
"\n",
"print(\"SCIPY Optimization Time: Avrg: {:.4f}s Max: {:.4f}s Min: {:.4f}s\".format(np.mean(opt_time),\n",
" np.max(opt_time),\n",
" np.min(opt_time))) "
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(15,10))\n",
"\n",
"plt.plot(x[:],y[:])\n",
"plt.plot(track[0,:],track[1,:])\n",
"plt.ylabel('y')\n",
"plt.xlabel('x')\n",
"\n",
"plt.tight_layout()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}