Skip to content

Instantly share code, notes, and snippets.

@Maarrk
Last active February 4, 2022 12:20
Show Gist options
  • Save Maarrk/44b5a37fbd96915d8fb3eb53e24de333 to your computer and use it in GitHub Desktop.
Save Maarrk/44b5a37fbd96915d8fb3eb53e24de333 to your computer and use it in GitHub Desktop.
Bike kinematics
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bicycle kinematics in simulation\n",
"\n",
"The bicycle needs to tilt into the curve to maintain balance, this angle is named roll $\\phi$\n",
"\n",
"$$ \\tan(\\phi) = \\frac{a}{g} = \\frac{\\frac{v^2}{R}}{g} $$\n",
"\n",
"where $a$ stands for radial acceleration, $g$ for gravitational acceleration, $v$ velocity, $R$ turn radius.\n",
"\n",
"Given all of the above, target roll is calculated. To prevent sudden change of roll, its rate of change is limited.\n",
"\n",
"$$ \\left|\\frac{d\\phi}{dt}\\right| \\leq \\frac{30^\\circ}{\\text{s}} $$\n",
"\n",
"Because of that, after a step change of desired turn radius, the roll is increasing linearly, and the turn radius changes accordingly"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import math\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.rc('figure', figsize=(13, 7))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Scene settings\n",
"velocity = 4.0 # [m/s]\n",
"turn_radius = 8.0 # [m]\n",
"time_preview = 2.0 # [s]\n",
"time_manoeuver = 2.0 # [s]\n",
"\n",
"start_x = 0.0 # [m]\n",
"start_z = velocity * time_preview # [m]\n",
"start_yaw = math.pi # [rad]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Bike settings\n",
"roll_slew_rate = 30.0 # [deg/s]\n",
"gravity = 9.81 # [m/s^2]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Simulation settings\n",
"frequency = 60.0 # [1/s]\n",
"dt = 1 / frequency # [s]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 936x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"time = np.arange(0, time_preview + time_manoeuver, dt)\n",
"N = len(time)\n",
"\n",
"target_roll_value = math.degrees(math.atan2(velocity**2 / turn_radius, gravity)) # [deg]\n",
"target_roll = np.array([0.0 if t < time_preview else target_roll_value for t in time])\n",
"current_roll = target_roll.copy()\n",
"for i in range(1, N):\n",
" current_roll[i] = min(current_roll[i-1] + roll_slew_rate * dt, current_roll[i])\n",
"\n",
"plt.plot(time, target_roll, label='target roll', linestyle='dotted')\n",
"plt.plot(time, current_roll, label='current roll')\n",
"plt.ylabel('roll [°]')\n",
"plt.xlabel('time [s]')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def simulate(roll: np.ndarray):\n",
" \"\"\"Simulate the same way as in Unity (first translate forward, then rotate) in the scene's left-handed coordinate system\n",
"\n",
" Parameters\n",
" ----------\n",
" roll : np.ndarray\n",
" Roll angle for each timestep\n",
"\n",
" Returns\n",
" -------\n",
" Tuple of simulated x, z position\n",
" \"\"\"\n",
" x = np.zeros(N)\n",
" z = np.zeros(N)\n",
" yaw = np.zeros(N)\n",
"\n",
" x[0] = start_x\n",
" z[0] = start_z\n",
" yaw[0] = start_yaw\n",
"\n",
" for i in range(1, N):\n",
" dx = velocity * math.sin(yaw[i-1]) * dt\n",
" dz = velocity * math.cos(yaw[i-1]) * dt\n",
" x[i], z[i] = x[i-1] + dx, z[i-1] + dz\n",
"\n",
" if roll[i] == 0.0:\n",
" angular_velocity = 0.0\n",
" else:\n",
" current_turn_radius = -velocity**2 / (gravity * math.tan(math.radians(roll[i])))\n",
" angular_velocity = velocity / current_turn_radius\n",
" yaw[i] = yaw[i-1] + angular_velocity * dt\n",
"\n",
" return x, z"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Comparison with circular turn\n",
"\n",
"The orange path is the path simulated in Unity, the dotted part is just going straight and then along a circle"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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bjv+rf7xxx/n8ssvB+D0009nxYoVrF27FoBzzjmHnj17AnDRRRdx33330dDQwG233cYVV1yx23/L7rjnQJKK3MoN9QwBlq2rY2jWYSSVpt38hb9QImKXt3dmxIgR7L///jz88MNMmzaNO++8s02PSynxuc99jo985CN7lLN3794tX7/22mvcfPPNTJ8+nYEDB3LFFVdQV1e3w/OceeaZ3HXXXdvc/9xz+753ZussvXr14swzz+Tee+/lF7/4BTNnztzn7bvnQJKK3OH752YOqocPzDiJJLWvBQsW8OSTTwLws5/9jFNOOWWb5RMnTuTRRx/ltddeA2DlypUty6666iouu+wyLrroIsrLywE444wz+N73vgdAU1MTa9as2WZ773jHO7jttttaDjdavHgxy5Yt2yFXRUUFDQ0NrWZeu3YtvXv3pn///ixdupT7779/h3UmTpzIn//8Z1555RUANmzYwEsvvcSYMWNYsmQJ06dPB2DdunU0NjbSt29f1q1b1/L4t7zlLS2FZ+rUqQwZMoR+/Vq/1s1VV13Fxz/+cSZMmMDAgfv+PmE5kCRJUibGjBnDd77zHY488khWrVrVckjQFlVVVdx6662cf/75VFdXc/HFF7csO+ecc1i/fn3LIUUAt9xyC4888gjHHnssxx9//A6H+7z97W/nAx/4ACeddBLHHnssF1544Ta/lG9xzTXXMHbsWC699NIdllVXV3PcccdxxBFH8IEPfKDlsKgtIoKqqiqmTJnCJZdcwtixYznppJOYN28e3bt35+677+a6666jurqaM888k7q6Ot761rcyd+7cloHkG264gZkzZzJ27Fiuv/56br/99p3+Hx5//PH069dvm/+HfREppXbZUEeoqalJWybAJamrWP7iEwy56528cfbtDDvhvKzjSCoRL7zwAkceeWTWMfbajBkz+NSnPsVjjz2WdZQWxx57LL/97W9bZiQ6whtvvMHkyZOZN28eZa1cLLO11zkiZqaUalrbnnsOJKnIrd6YO5d17bq63awpSV3DTTfdxAUXXMCXv/zlrKO0OPPMMzn22GM7tBjccccdnHjiidx4442tFoO94Z4DSSp2i5+GH74VLrkbxpyVdRpJJaKz7zlQ27jnQJIkSW3Smf5IrD23N6+v5UCSilzt+s0AvLHa6xxIaj+VlZWsWLHCglCiUkqsWLGCysrK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",
"text/plain": [
"<Figure size 936x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"x, z = simulate(current_roll)\n",
"x_arc, z_arc = simulate(target_roll)\n",
"\n",
"plt.plot(x_arc, z_arc, scaley=-1, label='circular turn', linestyle='dotted')\n",
"plt.plot(x, z, scaley=-1, label='bicycle trajectory')\n",
"plt.xlabel('position X [m]')\n",
"plt.ylabel('position Z [m]')\n",
"plt.legend()\n",
"plt.axis('equal') # preserve aspect ratio\n",
"plt.show()"
]
}
],
"metadata": {
"interpreter": {
"hash": "b89b5cfaba6639976dc87ff2fec6d58faec662063367e2c229c520fe71072417"
},
"kernelspec": {
"display_name": "Python 3.10.0 64-bit",
"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.10.0"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment