Skip to content

Instantly share code, notes, and snippets.

@YaLTeR
Last active June 27, 2020 07:45
Show Gist options
  • Save YaLTeR/ffc0eab7f618e60988d5c2b43c1ea70d to your computer and use it in GitHub Desktop.
Save YaLTeR/ffc0eab7f618e60988d5c2b43c1ea70d to your computer and use it in GitHub Desktop.
Differentiable Strafing
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [
{
"data": {
"text/plain": "device(type='cuda')"
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import torch\n",
"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
"device"
]
},
{
"cell_type": "code",
"execution_count": 45,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1000/1000 [07:51<00:00, 2.12it/s, final speed=218]\n"
]
}
],
"source": [
"import numpy as np\n",
"from tqdm import tqdm\n",
"\n",
"# Airstrafing\n",
"def strafe(position, velocity, yaws, return_history = False):\n",
" WISHSPEED = 320\n",
" ACCELERATE = 10\n",
" FRAMETIME = 0.001\n",
"\n",
" if return_history:\n",
" positions = [position.detach().cpu().numpy()]\n",
" velocities = [velocity.detach().cpu().numpy()]\n",
"\n",
" for yaw in yaws:\n",
" cy, sy = torch.cos(yaw), torch.sin(yaw)\n",
"\n",
" wishvel = torch.stack((cy, sy))\n",
" a = wishvel / wishvel.norm()\n",
"\n",
" tmp = 30 - velocity.dot(a)\n",
" if tmp > 0:\n",
" accelspeed = ACCELERATE * WISHSPEED * 1 * FRAMETIME\n",
" if accelspeed <= tmp:\n",
" tmp = accelspeed\n",
"\n",
" velocity = velocity + a * tmp\n",
"\n",
" position = position + velocity * FRAMETIME\n",
"\n",
" if return_history:\n",
" positions.append(position.detach().cpu().numpy())\n",
" velocities.append(velocity.detach().cpu().numpy())\n",
"\n",
" if return_history:\n",
" return positions, velocities\n",
"\n",
" return position, velocity\n",
"\n",
"\n",
"yaws = torch.zeros(1000, requires_grad=True, device=device)\n",
"torch.nn.init.normal_(yaws)\n",
"optimizer = torch.optim.Adam((yaws,), lr=1e-3)\n",
"\n",
"final_speeds = []\n",
"\n",
"t = tqdm(range(1000))\n",
"for _ in t:\n",
" position = torch.zeros(2, requires_grad=True, device=device)\n",
" velocity = torch.zeros(2, requires_grad=True, device=device)\n",
"\n",
" position, velocity = strafe(position, velocity, yaws)\n",
" final_speed = velocity.norm()\n",
"\n",
" optimizer.zero_grad()\n",
" loss = -final_speed\n",
" loss.backward()\n",
" optimizer.step()\n",
"\n",
" final_speeds.append(final_speed.item())\n",
" t.set_postfix({\"final speed\": final_speed.item()}, refresh=False)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 58,
"outputs": [
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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1157LUuXLgXg6aef5sQTT+SVV17h8ccfp6SkhL59+/LUU0+RmJhIkyZNuOmmmxg/fjyNGjXinXfeYcmSJYwbN46PPvqIBx54gNGjR9O5c+e93m+13abQtsqBfhXQNpxuB6yoslxuWLZTUjCzawhHgevYsWPsIo2z8gpn3Dd5DJ+4iOUbCjmmXVOeuyKbgUcdpMZBqRfmzp1Lr17VXymeMWMGs2bNomXLlpSVlTFmzBiaNm3KunXr6NevH+eeey4zZszg9ddfZ+bMmZSVldGrV69IUqhUWlrKDTfcwDvvvEObNm144403uPPOO3nhhT/85iUAABDFSURBVBeA4Exk2rRpTJgwgfvuu49JkyZx//33k5OTwxNPPLFTXE8//TTp6enMnz+fWbNmRbZj3bp1PPDAA0yaNInGjRvz8MMP8+ijj3LdddcxZswYvv32W8yMTZs2AXDjjTfyk5/8hDFjxlBeXs6WLVuYP38+b7zxBp999hnJycn85je/YdSoUVxxxRVs3bqVfv368eCDD3LLLbfw7LPPctddd3HuuedGkt++iltDs7u7mfmel9xpvRHACIDs7Owar3+gc3fen7uaRycuYOHqLXTLVDKQ2KvuF31tue666/j0009JSUnhq6++AmDQoEG0bNkSCP5v3HHHHXz88cckJCSQl5fH6tWr+eSTT/jZz35GenowTOy5556702cvWLCAOXPmMGjQIADKy8vJzMyM1J9//vkA9O7dm++++26PsX788cfceOONAPTo0YMePXoA8OWXXzJv3jz69+8PQElJCSeccALNmjUjLS2Nq666isGDBzN48GAgOFt66aWXAEhMTKRZs2a8/PLLTJ8+nT59+gDBWclBBx0EQEpKSmTd3r17M3HixKj+bWuitpPC6srLQmaWCawJy/OADlWWax+WNRjuzpQFa3hs0iK+yc3nsNaNeeKy4zj7mEwSEpQMpP45+uijGT16dGT+ySefZN26dWRnZ0fKGjf+8dbqUaNGsXbtWqZPn05ycjJZWVlRP43t7hx99NF88cUXu6xPTU0FggPz3rZfVH7PoEGDeO2113aqmzZtGh988AFvvfUWTzzxBJMnT97tZwwdOpQ///nPO9UlJydHfhzua6y7E8uG5l0ZBwwNp4cC71QpvyK8C6kfkN9Q2hPcnQ/mr2bIk5/xy5E5rN9awsMXdOffvz2Z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\n"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": "<Figure size 1008x288 with 2 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"\n",
"def strafe_optimal(position, velocity, frames):\n",
" WISHSPEED = 320\n",
" ACCELERATE = 10\n",
" FRAMETIME = 0.001\n",
"\n",
" positions = [position]\n",
" velocities = [velocity]\n",
"\n",
" for _ in range(frames):\n",
" value = 30 - ACCELERATE * WISHSPEED * 1 * FRAMETIME\n",
" speed = np.linalg.norm(velocity)\n",
" if speed == 0:\n",
" vel_yaw = 0\n",
" else:\n",
" vel_yaw = np.arctan2(velocity[1], velocity[0])\n",
"\n",
" if value <= 0:\n",
" yaw = vel_yaw + np.pi / 2\n",
" elif 0 < value <= speed:\n",
" yaw = vel_yaw + np.arccos(value / speed)\n",
" else:\n",
" yaw = vel_yaw\n",
"\n",
" cy, sy = np.cos(yaw), np.sin(yaw)\n",
"\n",
" wishvel = np.stack((cy, sy))\n",
" a = wishvel / np.linalg.norm(wishvel)\n",
"\n",
" tmp = 30 - np.dot(velocity, a)\n",
" if tmp > 0:\n",
" accelspeed = ACCELERATE * WISHSPEED * 1 * FRAMETIME\n",
" if accelspeed <= tmp:\n",
" tmp = accelspeed\n",
"\n",
" velocity = velocity + a * tmp\n",
"\n",
" position = position + velocity * FRAMETIME\n",
"\n",
" positions.append(position)\n",
" velocities.append(velocity)\n",
"\n",
" return positions, velocities\n",
"\n",
"position = torch.zeros(2, device=device)\n",
"velocity = torch.zeros(2, device=device)\n",
"poss, vels = strafe(position, velocity, yaws, return_history=True)\n",
"speeds = list(map(lambda vel: np.linalg.norm(vel), vels))\n",
"\n",
"poss_opt, vels_opt = strafe_optimal(np.zeros(2), np.zeros(2), 1000)\n",
"speeds_opt = list(map(lambda vel: np.linalg.norm(vel), vels_opt))\n",
"\n",
"plt.plot(range(len(final_speeds)), final_speeds, label='Gradient descent')\n",
"plt.plot(range(len(final_speeds)), (speeds_opt[-1],) * len(final_speeds), '--', label='Optimal')\n",
"plt.xlabel(\"Iteration\")\n",
"plt.ylabel(\"Speed after 1000 frames\")\n",
"plt.legend()\n",
"plt.savefig('iteration-progress.png', dpi=300, bbox_inches='tight')\n",
"plt.show()\n",
"\n",
"plt.figure(figsize=(14, 4))\n",
"plt.subplot(1, 2, 1)\n",
"plt.plot(range(len(speeds)), speeds, label='Gradient descent')\n",
"plt.plot(range(len(speeds_opt)), speeds_opt, label='Optimal')\n",
"plt.xlabel(\"Frame\")\n",
"plt.ylabel(\"Speed\")\n",
"plt.legend()\n",
"\n",
"plt.subplot(1, 2, 2)\n",
"yaws_deg = list(map(lambda yaw: yaw / np.pi * 180, yaws.detach().cpu().numpy()))\n",
"plt.plot(range(len(yaws_deg)), yaws_deg)\n",
"plt.xlabel(\"Frame\")\n",
"plt.ylabel(\"Yaw\")\n",
"plt.savefig('final-data.png', dpi=300, bbox_inches='tight')\n",
"plt.show()"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment