diff --git a/examples/bit_star_planner.ipynb b/examples/bit_star_planner.ipynb new file mode 100644 index 0000000..e382ca5 --- /dev/null +++ b/examples/bit_star_planner.ipynb @@ -0,0 +1,187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> [BIT*](https://arxiv.org/abs/1405.5848) - it plans a trajectory by incrementally growing a search tree in a batch-sampling way" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%cd -q .." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from environment.static.dual_kuka_env import DualKukaEnv\n", + "from objects.static.voxel import VoxelObject\n", + "env = DualKukaEnv(objects=[VoxelObject(base_orientation=[0, 0, 0, 1], base_position=[0, 1, 1], half_extents=[0.2, 0.2, 0.2]),\n", + " VoxelObject(base_orientation=[0, 0, 0, 1], base_position=[0, -0.5, 0.7], half_extents=[0.3, 0.1, 0.4])])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# visualize environment\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "env.load()\n", + "plt.imshow(env.render())\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from planner.bit_star_planner import BITStarPlanner" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# sample a non-trival problem setting and solve\n", + "while True:\n", + " start, goal = env.robot.sample_random_init_goal()\n", + " if not env.edge_fp(start, goal):\n", + " result_initial = BITStarPlanner(num_batch=100, stop_when_success=True).plan(env, start, goal, timeout=('time', 10))\n", + " result_refined = BITStarPlanner(num_batch=100, stop_when_success=False).plan(env, start, goal, timeout=('time', 10))\n", + " if result_initial.solution and result_refined.solution:\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Visualization\n", + "from time import sleep\n", + "def visualize_traj(env, trajectory): \n", + " gifs = []\n", + " for timestep in np.linspace(0, len(trajectory.waypoints)-1, 100):\n", + " env.robot.set_config(trajectory.get_spec(timestep))\n", + " p.performCollisionDetection()\n", + " sleep(0.1)\n", + " gifs.append(p.getCameraImage(width=360, height=360, lightDirection=[1, 1, 1], shadow=1,\n", + " renderer=p.ER_BULLET_HARDWARE_OPENGL)[2]) \n", + " return gifs" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import pybullet as p\n", + "import pybullet_data\n", + "import numpy as np\n", + "from utils.utils import save_gif\n", + "from IPython.display import HTML\n", + "import base64\n", + "from objects.trajectory import WaypointLinearTrajectory\n", + "\n", + "env.load(GUI=True)\n", + "for title, result in [('rrt_star_initial', result_initial), ('rrt_star_refined', result_refined)]:\n", + " # generate collision-free trajectory\n", + " traj = WaypointLinearTrajectory(result.solution) \n", + " gifs = visualize_traj(env, traj)\n", + " save_gif(gifs, f'data/visualization/{title}.gif')\n", + " b64 = base64.b64encode(open(f'data/visualization/{title}.gif', 'rb').read()).decode('ascii')\n", + " display(HTML(f'')) " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "p.disconnect()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8.15 ('lemp')", + "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.8.15" + }, + "vscode": { + "interpreter": { + "hash": "c72f54e4f59ef741f6ce9a8d00eb4e33af6f143b90eb5c5a2b70c805b0346120" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/planner/bit_star_planner.py b/planner/bit_star_planner.py index 72d19ea..475b726 100644 --- a/planner/bit_star_planner.py +++ b/planner/bit_star_planner.py @@ -103,7 +103,7 @@ def informed_sample(self, c_best, sample_num, vertices): return sample_array def get_random_point(self): - point = self.robot.uniform_sample() + point = self.env.robot.uniform_sample() return tuple(point) def is_point_free(self, point): @@ -221,7 +221,7 @@ def get_best_path(self): point = self.edges[point] path.append(point) path.reverse() - return path if len(path) else None + return list(np.array(path)) if len(path) else None def path_length_calculate(self, path): path_length = 0 @@ -241,7 +241,6 @@ def _plan(self, env, start, goal, timeout, **kwargs): c_best = self.g_scores[self.goal] self.prune(c_best) self.samples.extend(self.informed_sample(c_best, self.batch_size, self.vertices)) - self.T += self.batch_size self.old_vertices = set(self.vertices) self.vertex_queue = [(self.get_point_value(point), point) for point in self.vertices]