From 48d3b65efc46d94e569a236974e662c7d4006872 Mon Sep 17 00:00:00 2001 From: rainorangelemon Date: Thu, 2 Mar 2023 22:05:16 -0800 Subject: [PATCH] finish example for static obstacle --- examples/sipp_planner.ipynb | 2 +- examples/static_gnn_planner.ipynb | 148 +++++++++++++++++--------- planner/learned/GNN_static_planner.py | 24 +++-- planner/learned/model/GNN_dynamic.py | 2 +- planner/learned/model/GNN_static.py | 6 +- wrappers/obstacles.py | 14 +++ 6 files changed, 131 insertions(+), 65 deletions(-) create mode 100644 wrappers/obstacles.py diff --git a/examples/sipp_planner.ipynb b/examples/sipp_planner.ipynb index e5c15e3..18190ab 100644 --- a/examples/sipp_planner.ipynb +++ b/examples/sipp_planner.ipynb @@ -414,7 +414,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.8.13 ('gnnmp')", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/examples/static_gnn_planner.ipynb b/examples/static_gnn_planner.ipynb index 39b492c..12954d2 100644 --- a/examples/static_gnn_planner.ipynb +++ b/examples/static_gnn_planner.ipynb @@ -1,7 +1,6 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -10,22 +9,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mFailed to start the Kernel. \n", - "\u001b[1;31mJupyter server crashed. Unable to connect. \n", - "\u001b[1;31mError code from Jupyter: 1\n", - "\u001b[1;31mError executing Jupyter command 'notebook': [Errno 2] No such file or directory. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], + "outputs": [], "source": [ "%cd -q .." ] @@ -34,12 +20,22 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "pybullet build time: Dec 1 2021 18:33:43\n" + ] + } + ], "source": [ "from environment.static.dual_kuka_env import DualKukaEnv\n", "from objects.static.voxel import VoxelObject\n", + "from wrappers.obstacles import ObstaclePositionWrapper\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])])" + " VoxelObject(base_orientation=[0, 0, 0, 1], base_position=[0, -0.5, 0.7], half_extents=[0.3, 0.1, 0.4])])\n", + "env = ObstaclePositionWrapper(env)" ] }, { @@ -49,12 +45,14 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "
" + "
" ] }, - "metadata": {}, + "metadata": { + "needs_background": "light" + }, "output_type": "display_data" } ], @@ -73,7 +71,7 @@ "metadata": {}, "outputs": [], "source": [ - "from planner.bit_star_planner import BITStarPlanner" + "from planner.learned.GNN_static_planner import GNNStaticPlanner" ] }, { @@ -86,9 +84,10 @@ "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", + " result = GNNStaticPlanner(num_batch=100, model_args=dict(config_size=env.robot.config_dim, \n", + " embed_size=64, \n", + " obs_size=6)).plan(env, start, goal, timeout=('time', 100))\n", + " if result.solution:\n", " break" ] }, @@ -113,25 +112,53 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "argv[0]=--background_color_red=1.0\n", + "argv[1]=--background_color_green=1.0\n", + "argv[2]=--background_color_blue=1.0\n", + "startThreads creating 1 threads.\n", + "starting thread 0\n", + "started thread 0 \n", + "argc=5\n", + "argv[0] = --unused\n", + "argv[1] = --background_color_red=1.0\n", + "argv[2] = --background_color_green=1.0\n", + "argv[3] = --background_color_blue=1.0\n", + "argv[4] = --start_demo_name=Physics Server\n", + "ExampleBrowserThreadFunc started\n", + "X11 functions dynamically loaded using dlopen/dlsym OK!\n", + "X11 functions dynamically loaded using dlopen/dlsym OK!\n", + "Creating context\n", + "Created GL 3.3 context\n", + "Direct GLX rendering context obtained\n", + "Making context current\n", + "GL_VENDOR=NVIDIA Corporation\n", + "GL_RENDERER=NVIDIA GeForce RTX 3080/PCIe/SSE2\n", + "GL_VERSION=3.3.0 NVIDIA 470.161.03\n", + "GL_SHADING_LANGUAGE_VERSION=3.30 NVIDIA via Cg compiler\n", + "pthread_getconcurrency()=0\n", + "Version = 3.3.0 NVIDIA 470.161.03\n", + "Vendor = NVIDIA Corporation\n", + "Renderer = NVIDIA GeForce RTX 3080/PCIe/SSE2\n", + "b3Printf: Selected demo: Physics Server\n", + "startThreads creating 1 threads.\n", + "starting thread 0\n", + "started thread 0 \n", + "MotionThreadFunc thread started\n", + "ven = NVIDIA Corporation\n", + "ven = NVIDIA Corporation\n" + ] }, { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -153,20 +180,43 @@ "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'')) " + "# generate collision-free trajectory\n", + "traj = WaypointLinearTrajectory(result.solution) \n", + "gifs = visualize_traj(env, traj)\n", + "save_gif(gifs, f'data/visualization/static_gnn.gif')\n", + "b64 = base64.b64encode(open(f'data/visualization/static_gnn.gif', 'rb').read()).decode('ascii')\n", + "display(HTML(f'')) " ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "numActiveThreads = 0\n", + "stopping threads\n", + "destroy semaphore\n", + "Thread with taskId 0 exiting\n", + "Thread TERMINATED\n", + "semaphore destroyed\n", + "destroy main semaphore\n", + "main semaphore destroyed\n", + "finished\n", + "numActiveThreads = 0\n", + "btShutDownExampleBrowser stopping threads\n", + "Thread with taskId 0 exiting\n", + "Thread TERMINATED\n", + "destroy semaphore\n", + "semaphore destroyed\n", + "destroy main semaphore\n", + "main semaphore destroyed\n" + ] + } + ], "source": [ "p.disconnect()" ] @@ -174,7 +224,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pybullet", + "display_name": "Python 3.8.12 ('gnn')", "language": "python", "name": "python3" }, @@ -188,11 +238,11 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.3" + "version": "3.8.12" }, "vscode": { "interpreter": { - "hash": "91da548c7234d9e42a976552f88f78aa923f188c3ddab2037cd41e2aa5ee13cb" + "hash": "23b2f028ee886613385a9dacdd1e4f1241a6243f9dd76c0791613257d600160a" } } }, diff --git a/planner/learned/GNN_static_planner.py b/planner/learned/GNN_static_planner.py index 59aa26c..74a3e28 100644 --- a/planner/learned/GNN_static_planner.py +++ b/planner/learned/GNN_static_planner.py @@ -3,6 +3,8 @@ from utils.utils import seed_everything, create_dot_dict, to_np from utils.graphs import knn_graph_from_points +from planner.learned.model.GNN_static import GNNet + from torch_sparse import coalesce from torch_geometric.nn import knn_graph from torch_geometric.data import Data @@ -12,16 +14,15 @@ class GNNStaticPlanner(LearnedPlanner): - def __init__(self, num_batch, model, k_neighbors=50, **kwargs): + def __init__(self, num_batch, model_args, k_neighbors=50, **kwargs): self.num_batch = num_batch - self.model = model + self.model = GNNet(**model_args) self.k_neigbors = k_neighbors self.num_node = 0 super(GNNStaticPlanner, self).__init__(self.model, **kwargs) self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - for model_ in self.model: - model_.to(self.device) + self.model.to(self.device) def _num_node(self): return self.num_node @@ -32,7 +33,7 @@ def _plan(self, env, start, goal, timeout, seed=0, **kwargs): self.model.eval() path = self._explore(env, start, goal, self.model, timeout, k=self.k_neigbors, n_sample=self.num_batch) - return create_dot_dict(solution=path) + return create_dot_dict(solution=path if len(path) else None) def create_graph(self): graph_data = knn_graph_from_points(self.points, self.k_neighbors) @@ -40,10 +41,11 @@ def create_graph(self): self.edge_index = graph_data.edge_index self.edge_cost = graph_data.edge_cost - def create_data(self, points, edge_index=None, k=50): + def create_data(self, points, obstacles, edge_index=None, k=50): goal_index = 1 data = Data(goal=torch.FloatTensor(points[goal_index])) - data.v = torch.FloatTensor(points) + data.v = torch.FloatTensor(np.array(points)) + data.obstacles = torch.FloatTensor() if edge_index is not None: data.edge_index = torch.tensor(edge_index.T).to(self.device) @@ -73,7 +75,7 @@ def _explore(self, env, start, goal, model_gnn, timeout, k, n_sample, loop=10): while not success: - data = self.create_data(points, k) + data = self.create_data(points, env.get_obstacles(), k=k) self.num_node = len(data.v) policy = model_gnn(**data.to(self.device).to_dict(), loop=loop) policy = policy.cpu() @@ -89,12 +91,12 @@ def _explore(self, env, start, goal, model_gnn, timeout, k, n_sample, loop=10): end_a, end_b = int(end_a), int(end_b) end_a = explored[end_a] explored_edges.extend([[end_a, end_b], [end_b, end_a]]) - if env._edge_fp(to_np(data.v[end_a]), to_np(data.v[end_b])): + if env.edge_fp(to_np(data.v[end_a]), to_np(data.v[end_b])): explored.append(end_b) prev[end_b] = end_a policy[:, end_b] = 0 - if env.in_goal_region(to_np(data.v[end_b]), to_np(data.v[1])): + if end_b==1: success = True path = [end_b] node = end_b @@ -114,7 +116,7 @@ def _explore(self, env, start, goal, model_gnn, timeout, k, n_sample, loop=10): new_points = env.sample_n_points(n_sample, need_negative=True) points = points + list(new_points) - return create_dot_dict(solution=list(data.v[path].data.cpu().numpy()) if len(path) else None) + return list(data.v[path].data.cpu().numpy()) diff --git a/planner/learned/model/GNN_dynamic.py b/planner/learned/model/GNN_dynamic.py index 0769665..b59e857 100644 --- a/planner/learned/model/GNN_dynamic.py +++ b/planner/learned/model/GNN_dynamic.py @@ -2,7 +2,7 @@ from torch.nn import Sequential as Seq, Linear as Lin, ReLU, Sigmoid from torch_geometric.nn import MessagePassing -from base_models import Block +from planner.learned.model.base_models import Block class MPNN(MessagePassing): diff --git a/planner/learned/model/GNN_static.py b/planner/learned/model/GNN_static.py index e58345a..3649c46 100644 --- a/planner/learned/model/GNN_static.py +++ b/planner/learned/model/GNN_static.py @@ -2,7 +2,7 @@ from torch.nn import Sequential as Seq, Linear as Lin, ReLU, Sigmoid from torch_geometric.nn import MessagePassing -from base_models import Block +from planner.learned.model.base_models import Block class MPNN(MessagePassing): @@ -73,8 +73,8 @@ def forward(self, v, labels, obstacles, edge_index, loop, **kwargs): obs_edge_code = self.obs_edge_code(obstacles.view(-1, self.obs_size)) for na, ea in zip(self.node_attentions, self.edge_attentions): - x, obs_node_code = na(x, obs_node_code) - y, obs_edge_code = ea(y, obs_edge_code) + x = na(x, obs_node_code) + y = ea(y, obs_edge_code) for i in range(loop): x = self.mpnn(x, edge_index, y) diff --git a/wrappers/obstacles.py b/wrappers/obstacles.py new file mode 100644 index 0000000..4673adf --- /dev/null +++ b/wrappers/obstacles.py @@ -0,0 +1,14 @@ +import numpy as np + +class ObstaclePositionWrapper(): + ''' + return representation of obstacles as concatenated vector of positions + ''' + def __init__(self, baseObject): + self.__class__ = type(baseObject.__class__.__name__, + (self.__class__, baseObject.__class__), + {}) + self.__dict__ = baseObject.__dict__ + + def get_obstacles(self): + return np.array([list(obj.base_position)+list(obj.half_extents) for obj in self.objects]) \ No newline at end of file