text Coursera Week4编程作业2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text Coursera Week4编程作业2相关的知识,希望对你有一定的参考价值。

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "In this notebook, you will implement the forward longitudinal vehicle model. The model accepts throttle inputs and steps through the longitudinal dynamic equations. Once implemented, you will be given a set of inputs that drives over a small road slope to test your model.\n",
    "\n",
    "The input to the model is a throttle percentage $x_\\theta \\in [0,1]$ which provides torque to the engine and subsequently accelerates the vehicle for forward motion. \n",
    "\n",
    "The dynamic equations consist of many stages to convert throttle inputs to wheel speed (engine -> torque converter -> transmission -> wheel). These stages are bundled together in a single inertia term $J_e$ which is used in the following combined engine dynamic equations.\n",
    "\n",
    "\\begin{align}\n",
    "    J_e \\dot{\\omega}_e &= T_e - (GR)(r_{eff} F_{load}) \\\\ m\\ddot{x} &= F_x - F_{load}\n",
    "\\end{align}\n",
    "\n",
    "Where $T_e$ is the engine torque, $GR$ is the gear ratio, $r_{eff}$ is the effective radius, $m$ is the vehicle mass, $x$ is the vehicle position, $F_x$ is the tire force, and $F_{load}$ is the total load force. \n",
    "\n",
    "The engine torque is computed from the throttle input and the engine angular velocity $\\omega_e$ using a simplified quadratic model. \n",
    "\n",
    "\\begin{align}\n",
    "    T_e = x_{\\theta}(a_0 + a_1 \\omega_e + a_2 \\omega_e^2)\n",
    "\\end{align}\n",
    "\n",
    "The load forces consist of aerodynamic drag $F_{aero}$, rolling friction $R_x$, and gravitational force $F_g$ from an incline at angle $\\alpha$. The aerodynamic drag is a quadratic model and the friction is a linear model.\n",
    "\n",
    "\\begin{align}\n",
    "    F_{load} &= F_{aero} + R_x + F_g \\\\\n",
    "    F_{aero} &= \\frac{1}{2} C_a \\rho A \\dot{x}^2 = c_a \\dot{x}^2\\\\\n",
    "    R_x &= N(\\hat{c}_{r,0} + \\hat{c}_{r,1}|\\dot{x}| + \\hat{c}_{r,2}\\dot{x}^2) \\approx c_{r,1} \\dot{x}\\\\\n",
    "    F_g &= mg\\sin{\\alpha}\n",
    "\\end{align}\n",
    "\n",
    "Note that the absolute value is ignored for friction since the model is used for only forward motion ($\\dot{x} \\ge 0$). \n",
    " \n",
    "The tire force is computed using the engine speed and wheel slip equations.\n",
    "\n",
    "\\begin{align}\n",
    "    \\omega_w &= (GR)\\omega_e \\\\\n",
    "    s &= \\frac{\\omega_w r_e - \\dot{x}}{\\dot{x}}\\\\\n",
    "    F_x &= \\left\\{\\begin{array}{lr}\n",
    "        cs, &  |s| < 1\\\\\n",
    "        F_{max}, & \\text{otherwise}\n",
    "        \\end{array}\\right\\} \n",
    "\\end{align}\n",
    "\n",
    "Where $\\omega_w$ is the wheel angular velocity and $s$ is the slip ratio. \n",
    "\n",
    "We setup the longitudinal model inside a Python class below. The vehicle begins with an initial velocity of 5 m/s and engine speed of 100 rad/s. All the relevant parameters are defined and like the bicycle model, a sampling time of 10ms is used for numerical integration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import sys\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.image as mpimg\n",
    "\n",
    "class Vehicle():\n",
    "    def __init__(self):\n",
    " \n",
    "        # ==================================\n",
    "        #  Parameters\n",
    "        # ==================================\n",
    "    \n",
    "        #Throttle to engine torque\n",
    "        self.a_0 = 400\n",
    "        self.a_1 = 0.1\n",
    "        self.a_2 = -0.0002\n",
    "        \n",
    "        # Gear ratio, effective radius, mass + inertia\n",
    "        self.GR = 0.35\n",
    "        self.r_e = 0.3\n",
    "        self.J_e = 10\n",
    "        self.m = 2000\n",
    "        self.g = 9.81\n",
    "        \n",
    "        # Aerodynamic and friction coefficients\n",
    "        self.c_a = 1.36\n",
    "        self.c_r1 = 0.01\n",
    "        \n",
    "        # Tire force \n",
    "        self.c = 10000\n",
    "        self.F_max = 10000\n",
    "        \n",
    "        # State variables\n",
    "        self.x = 0\n",
    "        self.v = 5\n",
    "        self.a = 0\n",
    "        self.w_e = 100\n",
    "        self.w_e_dot = 0\n",
    "        \n",
    "        self.sample_time = 0.01\n",
    "        \n",
    "    def reset(self):\n",
    "        # reset state variables\n",
    "        self.x = 0\n",
    "        self.v = 5\n",
    "        self.a = 0\n",
    "        self.w_e = 100\n",
    "        self.w_e_dot = 0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Implement the combined engine dynamic equations along with the force equations in the cell below. The function $\\textit{step}$ takes the throttle $x_\\theta$ and incline angle $\\alpha$ as inputs and performs numerical integration over one timestep to update the state variables. Hint: Integrate to find the current position, velocity, and engine speed first, then propagate those values into the set of equations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Vehicle(Vehicle):\n",
    "    def step(self, throttle, alpha):\n",
    "        # ==================================\n",
    "        #  Implement vehicle model here\n",
    "        # ==================================\n",
    "        F_aero \t\t= self.c_a * self.v * self.v\n",
    "        R_x \t\t= self.c_r1 * self.v\n",
    "        F_g\t\t\t= self.m * self.g * np.sin(alpha)\n",
    "        F_load \t\t= F_aero + R_x + F_g\n",
    "        T_e\t\t\t= throttle * (self.a_0 + self.a_1 * self.w_e + self.a_2 * self.w_e * self.w_e)\n",
    "        W_w\t\t\t= self.GR * self.w_e\n",
    "        r_eff       = self.v / W_w\n",
    "        s           = (W_w * self.r_e - self.v) / self.v\n",
    "        cs\t\t\t= self.c * s\n",
    "        \n",
    "        if abs(s) < 1 :\n",
    "            F_x = cs\n",
    "        else:\n",
    "            F_x = self.F_max\n",
    "            \n",
    "        self.x \t\t= self.x + self.v * self.sample_time\n",
    "        self.v \t\t= self.v + self.a * self.sample_time\n",
    "        self.a \t\t= (F_x - F_load) / self.m\n",
    "        self.w_e \t= self.w_e + self.w_e_dot * self.sample_time\n",
    "        self.w_e_dot = (T_e - self.GR * self.r_e * F_load) / self.J_e\n",
    "        \n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using the model, you can send constant throttle inputs to the vehicle in the cell below. You will observe that the velocity converges to a fixed value based on the throttle input due to the aerodynamic drag and tire force limit. A similar velocity profile can be seen by setting a negative incline angle $\\alpha$. In this case, gravity accelerates the vehicle to a terminal velocity where it is balanced by the drag force."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample_time = 0.01\n",
    "time_end = 100\n",
    "model = Vehicle()\n",
    "\n",
    "t_data = np.arange(0,time_end,sample_time)\n",
    "v_data = np.zeros_like(t_data)\n",
    "x_data = np.zeros_like(t_data)\n",
    "\n",
    "# throttle percentage between 0 and 1\n",
    "throttle = 0.2\n",
    "\n",
    "# incline angle (in radians)\n",
    "alpha = 0\n",
    "\n",
    "for i in range(t_data.shape[0]):\n",
    "    x_data[i] = model.x\n",
    "    v_data[i] = model.v\n",
    "    model.step(throttle, alpha)\n",
    "    \n",
    "plt.plot(t_data, v_data)\n",
    "# plt.plot(x_data)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will now drive the vehicle over a slope as shown in the diagram below.\n",
    "\n",
    "![ramp](ramp.png)\n",
    "\n",
    "To climb the slope, a trapezoidal throttle input is provided for the next 20 seconds as shown in the figure below. \n",
    "\n",
    "![throttle](throttle.png)\n",
    "\n",
    "The vehicle begins at 20% throttle and gradually increases to 50% throttle. This is maintained for 10 seconds as the vehicle climbs the steeper slope. Afterwards, the vehicle reduces the throttle to 0.\n",
    "\n",
    "In the cell below, implement the ramp angle profile $\\alpha (x)$ and throttle profile $x_\\theta (t)$ and step them through the vehicle dynamics. The vehicle position $x(t)$ is saved in the array $\\textit{x_data}$. This will be used to grade your solution.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "time_end = 20\n",
    "t_data = np.arange(0,time_end,sample_time)\n",
    "x_data = np.zeros_like(t_data)\n",
    "v_data = np.zeros_like(t_data)\n",
    "throttle_data = np.zeros_like(t_data)\n",
    "alpha_data = np.zeros_like(t_data)\n",
    "\n",
    "# reset the states\n",
    "model.reset()\n",
    "\n",
    "# ==================================\n",
    "#  Learner solution begins here\n",
    "# ==================================\n",
    "for i in range(t_data.shape[0]):\n",
    "    if i >=0 and i < 500:\n",
    "        throttle = 0.2 + 0.0006 * i\n",
    "    elif i >= 500 and i < 1500:\n",
    "        throttle = 0.5\n",
    "    elif i >= 1500 and i < 2000:\n",
    "        throttle = 2 - 0.001 * i\n",
    "\n",
    "    if model.x < 60:\n",
    "        alpha = 0.05\n",
    "    elif model.x >= 60 and model.x <= 150:\n",
    "        alpha = 0.1\n",
    "    elif model.x > 150:\n",
    "        alpha = 0\n",
    "        \n",
    "    alpha_data[i] = alpha\n",
    "    throttle_data[i] = throttle\n",
    "    x_data[i] = model.x\n",
    "    v_data[i] = model.v\n",
    "    model.step(throttle,alpha)\n",
    "    \n",
    "#     print(\"i = \",i)\n",
    "#     print(\"throttle = \",throttle)\n",
    "\n",
    "# ==================================\n",
    "#  Learner solution ends here\n",
    "# ==================================\n",
    "\n",
    "# Plot x vs t for visualization\n",
    "# plt.plot(t_data, x_data,label = 'x')\n",
    "plt.plot(v_data,label = 'v')\n",
    "# plt.plot(throttle_data,label = 'throttle')\n",
    "# plt.plot(alpha_data,label = 'alpha')\n",
    "plt.legend()\n",
    "plt.show()\n",
    "# plt.plot(throttle)\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you have implemented the vehicle model and inputs correctly, you should see that the vehicle crosses the ramp at ~15s where the throttle input begins to decrease.\n",
    "\n",
    "The cell below will save the time and vehicle inputs as text file named $\\textit{xdata.txt}$. To locate the file, change the end of your web directory to $\\textit{/notebooks/Course_1_Module_4/xdata.txt}$\n",
    "\n",
    "Once you are there, you can download the file and submit to the Coursera grader to complete this assessment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data = np.vstack([t_data, x_data]).T\n",
    "np.savetxt('xdata.txt', data, delimiter=', ')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Congratulations! You have now completed the assessment! Feel free to test the vehicle model with different inputs in the cell below, and see what trajectories they form. In the next module, you will see the longitudinal model being used for speed control. See you there!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sample_time = 0.01\n",
    "time_end = 30\n",
    "model.reset()\n",
    "\n",
    "t_data = np.arange(0,time_end,sample_time)\n",
    "x_data = np.zeros_like(t_data)\n",
    "\n",
    "# ==================================\n",
    "#  Test various inputs here\n",
    "# ==================================\n",
    "for i in range(t_data.shape[0]):\n",
    "\n",
    "    model.step(0,0)\n",
    "    \n",
    "plt.axis('equal')\n",
    "plt.plot(x_data, y_data)\n",
    "plt.show()"
   ]
  }
 ],
 "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.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}

以上是关于text Coursera Week4编程作业2的主要内容,如果未能解决你的问题,请参考以下文章

机器学习- 吴恩达Andrew Ng 编程作业技巧 for Week4 Neural Networks

Coursera TensorFlow 基础课程-week4

Coursera TensorFlow 基础课程-week4

Coursera TensorFlow 基础课程-week4

吴恩达-coursera-机器学习-week4

Coursera机器学习week4 笔记