Skip to content

Instantly share code, notes, and snippets.

@Islandman93
Last active January 11, 2021 14:36
Show Gist options
  • Save Islandman93/33f242a2f768452019739b05b50be414 to your computer and use it in GitHub Desktop.
Save Islandman93/33f242a2f768452019739b05b50be414 to your computer and use it in GitHub Desktop.
Smooth step
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def pascal_triangle(a, b):\n",
" b_space = np.arange(b)\n",
" return np.prod((a - b_space) / (b_space + 1))\n",
"\n",
"def ss_poly(order):\n",
" polys = []\n",
" for i in range(order + 1):\n",
" pol = np.round(pascal_triangle(-order - 1, i) * pascal_triangle(2 * order + 1, order - i))\n",
" polys.append(pol)\n",
" return polys\n",
"\n",
"def create_smoothstep_velocity_polynomial(smoothstep_order): \n",
" polys = [0] * (smoothstep_order + 1) + ss_poly(smoothstep_order)\n",
" return np.polynomial.Polynomial(polys)\n",
"\n",
"def create_derivitive_polynomial(poly):\n",
" return np.polynomial.Polynomial(list(poly.deriv()))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# helper function gets distance and time given vel and accel\n",
"def determine_acceleration_distance_and_time(start_v, max_v, max_accel): \n",
" # calculate the time it would take to reach max for scaling purposes\n",
" time_to_max = (max_v - start_v) / max_accel\n",
" # max distance in a time unit time_to_max for scale\n",
" max_d = (max_v * 1/2 * time_to_max) + (start_v * time_to_max)\n",
" \n",
" return max_d, time_to_max\n",
"\n",
"# helper function gets distance given time, vel and accel\n",
"def determine_acceleration_distance(start_v, max_accel, time):\n",
" # max distance in a time unit time_to_max for scale\n",
" dist_traveled = (1/2 * time **2 * max_accel) + (start_v * time)\n",
" \n",
" return dist_traveled\n",
"\n",
"# helper function gets end_vel and time, given vel and accel and d\n",
"def determine_acceleration_end_velocity_and_time(start_v, max_accel, move_d):\n",
" if max_accel < 0:\n",
" neg_accel = True\n",
" max_accel = abs(max_accel)\n",
" else:\n",
" neg_accel = False\n",
" \n",
" end_velocity = np.sqrt(start_v**2 + 2*max_accel*move_d)\n",
" # this time estimate is only valid if max_v is not reached\n",
" accel_time = np.sqrt(2*move_d/max_accel + (start_v/max_accel)**2) - start_v/max_accel \n",
" if neg_accel:\n",
" end_velocity = start_v - end_velocity \n",
" \n",
" return accel_time, end_velocity"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f3e3d1f3208>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot smoothsteps to make sure they look correct\n",
"for i in range(6):\n",
" v_fn = create_smoothstep_velocity_polynomial(i)\n",
" plt.subplot(1, 2, 1)\n",
" plt.plot(v_fn(np.linspace(0, 1, 100)))\n",
" \n",
" plt.subplot(1, 2, 2)\n",
" a_fn = create_derivitive_polynomial(v_fn) \n",
" plt.plot(a_fn(np.linspace(0, 1, 100)))\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "ImportError",
"evalue": "No module named 'scipy.Weave'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-3-ebe271c38de1>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;31m# Additionally, distance will be < 0.5 (again approximating the line)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;31m# Anything after will be cruising\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mscipy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mWeave\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mget_time_from_distance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvelocity_polynomial\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \"\"\"\n",
"\u001b[1;31mImportError\u001b[0m: No module named 'scipy.Weave'"
]
}
],
"source": [
"# Since the curve approximates a line max v is always achieved at time 1\n",
"# Additionally, distance will be < 0.5 (again approximating the line)\n",
"# Anything after will be cruising\n",
"def get_time_from_distance(d, velocity_polynomial):\n",
" \"\"\"\n",
" Integration of velocity gives the polynomial function which will provide distance given time\n",
" If we know distance we can calculate the time by solving for the roots in the form 0 = d + inverse(polys)\n",
" EX: degree 1 gives the function d = 0 + 0t + 0t^2 + 1t^3 - 0.5t^4\n",
" Move everything to one side -t^3 + 0.5t^4 + d = 0\n",
" Then just plug in d and have numpy solve the roots\n",
" \"\"\"\n",
" # 0.5 will give numerical issues for higher order curves\n",
" assert np.all(d <= 0.5)\n",
" # integrate velocity to get distance\n",
" polys = list(velocity_polynomial.integ())\n",
" # move everything to one side\n",
" polys = [d] + [-p for p in polys[1::]]\n",
" p = np.polynomial.Polynomial(polys)\n",
" # solve\n",
" roots = p.roots()\n",
" # only roots that are real and 0 < x < 1 are used since the polynomials can intersect at other points\n",
" real_roots = np.real(roots[np.where(np.imag(roots) == 0)])\n",
" return real_roots[np.logical_and(0 < real_roots, real_roots < 1)]\n",
"\n",
"print('testing time from distance')\n",
"print(get_time_from_distance(0.5, create_smoothstep_velocity_polynomial(3)))\n",
"print(get_time_from_distance(0.25, create_smoothstep_velocity_polynomial(3)))\n",
"print(get_time_from_distance(0.00001, create_smoothstep_velocity_polynomial(3)))\n",
"print('done')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def scale_acceleration(accel, smoothstep_order=3, accel_ratios=[1.0, 1.5, 1.875, 2.1875, 2.4609375, 2.70703125]):\n",
" return accel / accel_ratios[smoothstep_order]\n",
"\n",
"class SCurve:\n",
" def __init__(self, start_v, end_v, max_accel, smoothstep_order=3):\n",
" self.start_v = start_v\n",
" self.end_v = end_v\n",
" self.max_accel = max_accel\n",
" self.smoothstep_order = smoothstep_order\n",
" self.velocity_polynomial = create_smoothstep_velocity_polynomial(smoothstep_order)\n",
" self.acceleration_polynomial = np.polynomial.Polynomial(list(self.velocity_polynomial.deriv()))\n",
" \n",
" def calculate_time(self, distance):\n",
" # calculate the time it would take to reach max for scaling purposes\n",
" time_to_max = (self.end_v - self.start_v) / self.max_accel\n",
" # max distance in a time unit time_to_max for scale\n",
" max_d = (self.end_v * 1/2 * time_to_max) + (self.start_v * time_to_max)\n",
" \n",
" # scale distance to 0->0.5\n",
" pct_d = ((distance / max_d) * 0.5) - 1e-6\n",
" \n",
" # integrate and solve\n",
" time_from_d = get_time_from_distance(pct_d, self.velocity_polynomial)\n",
" # velocity at that time\n",
" v_at_t = self.velocity_polynomial(time_from_d) * self.end_v + self.start_v\n",
" # acceleration at that time\n",
" a_at_t = self.acceleration_polynomial(time_from_d) * self.max_accel\n",
" # rescale time back\n",
" scaled_poly_time = time_from_d * time_to_max\n",
" \n",
" return scaled_poly_time, v_at_t, a_at_t"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"400 steps\n"
]
},
{
"data": {
"image/png": "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\ngg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f3e3b03ea90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# move code by distance\n",
"mov_d = 5\n",
"step_d = 0.0125\n",
"max_v = 300\n",
"max_a = scale_acceleration(3000, 3) \n",
"end_v = 0\n",
"start_v = 0\n",
"\n",
"steps = int(mov_d / step_d)\n",
"print(steps, 'steps')\n",
"# calculate max speed attainable over half the distance for deccel\n",
"accel_time, achievable_v = determine_acceleration_end_velocity_and_time(start_v, max_a, mov_d)\n",
"# fit a s curve to this achievable velocity\n",
"accel_s_curve = SCurve(start_v, achievable_v, max_a, 3)\n",
"times = []\n",
"vels = []\n",
"accels = []\n",
"last_t = 0\n",
"for step in range(1, steps):\n",
" dist_moved = step * step_d\n",
" try:\n",
" t_at_dist, v, a = accel_s_curve.calculate_time(dist_moved)\n",
" except Exception as e:\n",
" break\n",
" times.append(t_at_dist)\n",
" vels.append(v)\n",
" accels.append(a)\n",
" \n",
"plt.figure(figsize=(12, 6))\n",
"plt.subplot(1, 3, 1)\n",
"plt.plot(times)\n",
"plt.title('time')\n",
"plt.subplot(1, 3, 2)\n",
"plt.plot(vels)\n",
"plt.title('vel')\n",
"plt.subplot(1, 3, 3)\n",
"plt.plot(accels)\n",
"plt.title('accel')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the first step is not scheduled for time == 0 when start velocity is 0\n",
"This is due to the minimum step size, and could probably be trimed (since the first time is known this could be set as time 0. IE: just an offset) otherwise the motor will remain inactive for a short period."
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment