Skip to content

Instantly share code, notes, and snippets.

@AshNguyen
Created April 23, 2019 19:46
Show Gist options
  • Save AshNguyen/e9ce9e5cea014c0e9b469a41da345c02 to your computer and use it in GitHub Desktop.
Save AshNguyen/e9ce9e5cea014c0e9b469a41da345c02 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from matplotlib.pyplot import Rectangle\n",
"from numpy.linalg import solve as line_solve"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"class Environment: \n",
" \n",
" def __init__(self, arm_1 = 5, arm_2 = 5, theta1=np.pi/2, theta2=0): \n",
" '''\n",
" Create a simplified environment for the biosafety room two-joint robot\n",
" \n",
" Inputs:\n",
" arm_1 (float): the length of the first arm of the two-joint robot\n",
" arm_2 (float): the length of the second arm of the two-joint robot\n",
" theta1 (float): the initial state of the robot first joint angle with\n",
" respect to the horizontal axis in radian(s) (0 <= theta1 <= pi)\n",
" - default pi/2\n",
" theta2 (float): the initial state of the robot second joint angle with\n",
" respect to the horizontal axis in radian(s) (0 <= theta2 <= 2*pi)\n",
" - default 0\n",
" Outputs: an instance of the environment object\n",
" \n",
" '''\n",
" \n",
" #Set default parameters for the environment\n",
" self.arm_length_1 = arm_1\n",
" self.arm_length_2 = arm_2\n",
" self.theta1 = theta1\n",
" self.theta2 = theta2\n",
" \n",
" #Calculate the coordinates of the joint and the effector in real space\n",
" self.joint = [10 - self.arm_length_1*np.cos(theta1), self.arm_length_1*np.sin(theta1)]\n",
" self.effector = [self.joint[0] - self.arm_length_2*np.cos(theta2), \\\n",
" self.arm_length_1*np.sin(theta1) + self.arm_length_2*np.sin(theta2)] \n",
" \n",
" #Creating obstacle, without enlarging\n",
" self.obstacle = []\n",
" self.enlarge = False\n",
" \n",
" #First obstacle\n",
" obstacle = [[0, 2], [4, 2], [4, 1.5], [0, 1.5]]\n",
" self.obstacle.append(obstacle)\n",
" #Second obstacle\n",
" obstacle = [[0, 6.5], [4, 6.5], [4, 6], [0, 6]]\n",
" self.obstacle.append(obstacle)\n",
" #Third obstacle\n",
" obstacle = [[15.5, 10], [16, 10], [16, 7], [15.5, 7]]\n",
" self.obstacle.append(obstacle)\n",
" #Fourth obstacle\n",
" obstacle = [[11, 10], [11.5, 10], [11.5, 7], [11, 7]]\n",
" self.obstacle.append(obstacle)\n",
" \n",
" def set_thetas(self, theta1, theta2):\n",
" '''\n",
" Set the theta values of the robot in its real space\n",
" \n",
" Inputs:\n",
" theta1 (float): the updated state of the robot first joint angle with\n",
" respect to the horizontal axis in radian(s) (0 <= theta1 <= pi)\n",
" theta2 (float): the updated state of the robot second joint angle with\n",
" respect to the horizontal axis in radian(s) (0 <= theta2 <= 2*pi)\n",
" \n",
" Outputs: None\n",
" \n",
" '''\n",
" \n",
" #Set thetas \n",
" self.theta1 = theta1\n",
" self.theta2 = theta2\n",
" \n",
" #Calculate new joints and effector coordinates\n",
" self.joint = [10 - self.arm_length_1*np.cos(theta1), self.arm_length_1*np.sin(theta1)]\n",
" self.effector = [self.joint[0] - self.arm_length_2*np.cos(theta2), \\\n",
" self.arm_length_1*np.sin(theta1) + self.arm_length_2*np.sin(theta2)] \n",
" \n",
" def enlarge_obstacle(self, rate=0.05): \n",
" '''\n",
" Create enlarge objects for safety maneuvering\n",
" \n",
" Inputs: \n",
" rate (float): the rate in which we enlarge the object with respect to the\n",
" environment size - default 0.05\n",
" \n",
" Outputs: None\n",
" \n",
" '''\n",
" self.enlarge = True\n",
" self.enlarged_obs = []\n",
" \n",
" #Create enlarged obstacles\n",
" for obstacle in self.obstacle: \n",
" enlarged_obstacle = []\n",
" enlarged_obstacle.append([obstacle[0][0]-10*rate, obstacle[0][1]+10*rate])\n",
" enlarged_obstacle.append([obstacle[1][0]+10*rate, obstacle[1][1]+10*rate])\n",
" enlarged_obstacle.append([obstacle[2][0]+10*rate, obstacle[2][1]-10*rate])\n",
" enlarged_obstacle.append([obstacle[3][0]-10*rate, obstacle[3][1]-10*rate])\n",
" self.enlarged_obs.append(enlarged_obstacle)\n",
" \n",
" #Keep the original obstacles\n",
" self.original_obs = self.obstacle.copy()\n",
" self.obstacle = self.enlarged_obs.copy()\n",
" \n",
" def visualize(self): \n",
" '''\n",
" Visualize the state of the room and robot arms on the real space\n",
" \n",
" Inputs: None\n",
" \n",
" Outputs: a matplotlib figure object\n",
" \n",
" '''\n",
" plt.figure(figsize=(20,10))\n",
" x1, y1 = [10, self.joint[0]], [0, self.joint[1]]\n",
" x2, y2 = [self.joint[0], self.effector[0]], [self.joint[1], self.effector[1]]\n",
" plt.plot(x1, y1, x2, y2, marker = 'o')\n",
" ax = plt.gca()\n",
" if self.enlarge == False: \n",
" for obstacle in self.obstacle:\n",
" ax.add_patch(Rectangle((obstacle[-1][0], obstacle[-1][1]), obstacle[1][0]-obstacle[0][0],\\\n",
" obstacle[0][1]-obstacle[2][1], alpha=1))\n",
" else: \n",
" for obstacle in self.obstacle:\n",
" ax.add_patch(Rectangle((obstacle[-1][0], obstacle[-1][1]), obstacle[1][0]-obstacle[0][0],\\\n",
" obstacle[0][1]-obstacle[2][1], alpha=1, fill=None, linestyle='--'))\n",
" for obstacle in self.original_obs:\n",
" ax.add_patch(Rectangle((obstacle[-1][0], obstacle[-1][1]), obstacle[1][0]-obstacle[0][0],\\\n",
" obstacle[0][1]-obstacle[2][1], alpha=1))\n",
" plt.xlim(0, 20)\n",
" plt.ylim(0, 10)\n",
" plt.show()\n",
"\n",
"#Testing\n",
"env = Environment(6.5, 5)\n",
"env.enlarge_obstacle()\n",
"env.visualize()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def find_slope(line): \n",
" '''\n",
" Find the slope and the canonical form of a line given two passing points\n",
" \n",
" Inputs: \n",
" line (list of lists): a list of two points the line pass through in\n",
" the form [[x_1, y_1], [x_2, y_2]]\n",
" \n",
" Outputs: the coefficients (a, b, 1) of the line in the canonical form ax+by=1\n",
" \n",
" '''\n",
" \n",
" #Construct a system of linear equations\n",
" M = np.array(line)\n",
" y = np.array([1,1])\n",
" \n",
" #Solve system\n",
" try:\n",
" a, b = line_solve(M, y)[0], line_solve(M, y)[1]\n",
" except np.linalg.LinAlgError: #When the determinant is 0\n",
" a = 0\n",
" b = 1/(line[0][1]+0.00000000001) #For numerical stability\n",
" return (a, b, 1)\n",
"\n",
"def intersection_check(line1, line2):\n",
" '''\n",
" Check whether two line segments intersect or not\n",
" \n",
" Inputs: \n",
" line1 (list of lists): a list of two points the line pass through in\n",
" the form [[x_1, y_1], [x_2, y_2]]\n",
" line2 (list of lists): a list of two points the line pass through in\n",
" the form [[x_1, y_1], [x_2, y_2]]\n",
" \n",
" Outputs: a boolean indicating whether the two segments intersect (True if intersect)\n",
" \n",
" '''\n",
" #Find the canonical form\n",
" a1, b1, c1 = find_slope(line1)\n",
" a2, b2, c2 = find_slope(line2)\n",
" \n",
" #Solve for intersection\n",
" if (a1*b2 - b1*a2) == 0: #When the determinant is 0, no intersection exists\n",
" return False\n",
" else: \n",
" #When the intersection exists, check whether it's in both segments\n",
" x_intersect = round((c2*b1 - c1*b2)/(b1*a2 - b2*a1), 3)\n",
" y_intersect = round((c1*a2 - c2*a1)/(b1*a2 - b2*a1), 3)\n",
" in_line_1 = ((y_intersect <= max(line1[1][1], line1[0][1])) and (y_intersect >= min(line1[1][1], line1[0][1]))) and \\\n",
" ((x_intersect <= max(line1[1][0], line1[0][0])) and (x_intersect >= min(line1[1][0], line1[0][0])))\n",
" in_line_2 = ((y_intersect <= max(line2[1][1], line2[0][1])) and (y_intersect >= min(line2[1][1], line2[0][1]))) and \\\n",
" ((x_intersect <= max(line2[1][0], line2[0][0])) and (x_intersect >= min(line2[1][0], line2[0][0])))\n",
" if in_line_1 and in_line_2: \n",
" return True\n",
" else: \n",
" return False\n",
"\n",
"def collision_check(env, theta1, theta2): \n",
" '''\n",
" Check whether a specific state in the configuration space results in a collision\n",
" in the real space or not\n",
" \n",
" Inputs: \n",
" env (Environment object): an environment instance\n",
" theta1 (float): the state of the robot first joint angle with\n",
" respect to the horizontal axis in radian(s) (0 <= theta1 <= pi)\n",
" theta2 (float): the state of the robot second joint angle with\n",
" respect to the horizontal axis in radian(s) (0 <= theta2 <= 2*pi)\n",
" \n",
" Outputs: a string indicating which scenario we are in with this state: \"Collide\" \n",
" if we collide with an obstacle, \"Out of frame\" if the effector go out of \n",
" the current room and \"Safe\" otherwise\n",
" \n",
" '''\n",
" \n",
" env.set_thetas(theta1, theta2)\n",
" collide = []\n",
" \n",
" #Detect collision with obstacles\n",
" for obstacle in env.obstacle: \n",
" cross_1 = intersection_check([obstacle[0], obstacle[1]], [[10, 0], env.joint])\n",
" cross_2 = intersection_check([obstacle[1], obstacle[2]], [[10, 0], env.joint])\n",
" cross_3 = intersection_check([obstacle[2], obstacle[3]], [[10, 0], env.joint])\n",
" cross_4 = intersection_check([obstacle[3], obstacle[-1]], [[10, 0], env.joint])\n",
" if (cross_1 == True) or (cross_2 == True) or \\\n",
" (cross_3 == True) or (cross_4 == True):\n",
" collide.append(True)\n",
" else: \n",
" collide.append(False)\n",
" cross_1 = intersection_check([obstacle[0], obstacle[1]], [env.joint, env.effector])\n",
" cross_2 = intersection_check([obstacle[1], obstacle[2]], [env.joint, env.effector])\n",
" cross_3 = intersection_check([obstacle[2], obstacle[3]], [env.joint, env.effector])\n",
" cross_4 = intersection_check([obstacle[3], obstacle[-1]], [env.joint, env.effector])\n",
" if (cross_1 == True) or (cross_2 == True) or \\\n",
" (cross_3 == True) or (cross_4 == True):\n",
" collide.append(True)\n",
" else: \n",
" collide.append(False)\n",
" \n",
" #Detect effector go out of the room\n",
" joint_in_frame = (env.joint[0] <= 20) and (env.joint[0] >=0) and\\\n",
" (env.joint[1] <= 10) and (env.joint[1] >=-10)\n",
" effector_in_frame = (env.effector[0] <= 20) and (env.effector[0] >=0) and\\\n",
" (env.effector[1] <= 10) and (env.effector[1] >=-10)\n",
" \n",
" if np.array(collide).any(): \n",
" return 'Collided'\n",
" if (not joint_in_frame) or (not effector_in_frame): \n",
" return 'Out of frame'\n",
" return 'Safe'\n",
"\n",
"def create_configuration_space(env, n): \n",
" '''\n",
" From the real space, create a configuration space for the movements of the robot\n",
" \n",
" Inputs: \n",
" env (Environment object): an environment instance\n",
" n (int): the number of discretization step we want to do\n",
" \n",
" \n",
" Outputs: \n",
" goal1 (list): a list of tuples indicating the points where we are in the \n",
" first biosafety container in the room\n",
" goal2 (list): a list of tuples indicating the points where we are in the \n",
" second biosafety container in the room\n",
" collide (list): a list of tuples indicating the points where we collide with\n",
" obstacles in the real space\n",
" out_of_frame (list): a list of tuples indicating the points where the effector\n",
" go out of frame\n",
" theta1_step (float): the step size of theta1 \n",
" theta2_step (float): the step size of theta2\n",
" \n",
" '''\n",
" #Discretize the configuration space\n",
" theta1s, theta1_step = np.linspace(0, np.pi, n, retstep=True)\n",
" theta2s, theta2_step = np.linspace(0, 2*np.pi, 2*n, retstep=True)\n",
" collide = []\n",
" out_of_frame = []\n",
" goal1, goal2 = [], []\n",
" \n",
" #Enumarating all possible state in the configuration space and check for collision\n",
" for theta1 in theta1s: \n",
" for theta2 in theta2s: \n",
" result = collision_check(env, theta1, theta2)\n",
" if result == 'Collided': \n",
" collide.append((theta1, theta2))\n",
" elif result == 'Out of frame': \n",
" out_of_frame.append((theta1, theta2))\n",
" else: \n",
" if (env.effector[0] <= env.obstacle[0][1][0]) and (env.effector[0] >= 0) and \\\n",
" (env.effector[1] <= env.obstacle[1][2][1]) and (env.effector[1] >= env.obstacle[0][0][1]): \n",
" goal1.append((theta1, theta2))\n",
" if (env.effector[0] <= env.obstacle[-2][0][0]) and (env.effector[0] >= env.obstacle[-1][1][0]) and \\\n",
" (env.effector[1] <= 10) and (env.effector[1] >= env.obstacle[-1][-2][1]): \n",
" goal2.append((theta1, theta2))\n",
" \n",
" return goal1, goal2, collide, out_of_frame, theta1_step, theta2_step"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Size of operating space 0.01775\n"
]
}
],
"source": [
"env = Environment(5, 5)\n",
"env.enlarge_obstacle()\n",
"g1, g2, obs, out, s1, s2 = create_configuration_space(env, 50)\n",
"\n",
"plt.figure(figsize=(4, 8))\n",
"for point in obs: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='r', markersize=10)\n",
"for point in out: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='b', markersize=10) \n",
"for point in g1: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
"for point in g2: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
" \n",
"plt.ylim(0, 2*np.pi)\n",
"plt.xlim(0, np.pi)\n",
"plt.show()\n",
"\n",
"print('Size of operating space', (len(g1)+len(g2))/(100*200))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Size of operating space 0.0013\n"
]
}
],
"source": [
"env = Environment(10, 5)\n",
"env.enlarge_obstacle()\n",
"g1, g2, obs, out, s1, s2 = create_configuration_space(env, 50)\n",
"\n",
"plt.figure(figsize=(4,8))\n",
"for point in obs: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='r', markersize=10)\n",
"for point in out: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='b', markersize=10) \n",
"for point in g1: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
"for point in g2: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
" \n",
"plt.ylim(0, 2*np.pi)\n",
"plt.xlim(0, np.pi)\n",
"plt.show()\n",
"\n",
"print('Size of operating space', (len(g1)+len(g2))/(100*200))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Size of operating space 0.00575\n"
]
}
],
"source": [
"env = Environment(5, 10)\n",
"env.enlarge_obstacle()\n",
"g1, g2, obs, out, s1, s2 = create_configuration_space(env, 50)\n",
"\n",
"plt.figure(figsize=(4,8))\n",
"for point in obs: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='r', markersize=10)\n",
"for point in out: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='b', markersize=10) \n",
"for point in g1: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
"for point in g2: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
" \n",
"plt.ylim(0, 2*np.pi)\n",
"plt.xlim(0, np.pi)\n",
"plt.show()\n",
"\n",
"print('Size of operating space', (len(g1)+len(g2))/(100*200))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Size of operating space 0.00895\n"
]
}
],
"source": [
"env = Environment(6, 6)\n",
"env.enlarge_obstacle()\n",
"g1, g2, obs, out, s1, s2 = create_configuration_space(env, 50)\n",
"\n",
"plt.figure(figsize=(4,8))\n",
"for point in obs: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='r', markersize=10)\n",
"for point in out: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='b', markersize=10) \n",
"for point in g1: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
"for point in g2: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
" \n",
"plt.ylim(0, 2*np.pi)\n",
"plt.xlim(0, np.pi)\n",
"plt.show()\n",
"\n",
"print('Size of operating space', (len(g1)+len(g2))/(100*200))"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Size of operating space 0.00565\n"
]
}
],
"source": [
"env = Environment(7, 6)\n",
"env.enlarge_obstacle()\n",
"g1, g2, obs, out, s1, s2 = create_configuration_space(env, 50)\n",
"\n",
"plt.figure(figsize=(4,8))\n",
"for point in obs: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='r', markersize=10)\n",
"for point in out: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='b', markersize=10) \n",
"for point in g1: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
"for point in g2: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize = 10) \n",
" \n",
"plt.ylim(0, 2*np.pi)\n",
"plt.xlim(0, np.pi)\n",
"plt.show()\n",
"\n",
"print('Size of operating space', (len(g1)+len(g2))/(100*200))"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#Searching for the optimal arm lengths\n",
"arm_1 = np.linspace(3, 10, 10)\n",
"arm_2 = np.linspace(3, 10, 10)\n",
"\n",
"ps = []\n",
"for arm1 in arm_1:\n",
" for arm2 in arm_2:\n",
" n = 20\n",
" env = Environment(arm1, arm2)\n",
" env.enlarge_obstacle()\n",
" g1, g2, obs, out, s1, s2 = create_configuration_space(env, n)\n",
" ps.append((len(g1)+len(g2))/(2*n**2))\n",
" \n",
"fig, ax = plt.subplots(figsize=(8,8))\n",
"plt.imshow(np.array(ps).reshape(10,10))\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"#Constructing a Voronoi diagram from the free space samples\n",
"from scipy.spatial import Voronoi, voronoi_plot_2d\n",
"\n",
"vor = Voronoi(samples)\n",
"\n",
"env = Environment(5, 5)\n",
"env.enlarge_obstacle()\n",
"g1, g2, obs, out, s1, s2 = create_configuration_space(env, 50)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"def free_space_sample(n, collide, out_frame, rate=0.8): \n",
" theta1s = np.linspace(0, np.pi, n)\n",
" theta2s = np.linspace(0, 2*np.pi, 2*n)\n",
" not_free = collide + out_frame\n",
" samples = []\n",
" for theta1 in theta1s: \n",
" for theta2 in theta2s:\n",
" point = (theta1, theta2)\n",
" try: \n",
" not_free.index(point)\n",
" continue\n",
" except ValueError: \n",
" if np.random.random() < rate: \n",
" samples.append(point)\n",
" return samples\n",
"\n",
"samples = free_space_sample(100, obs, out, rate=0.5)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(4, 8))\n",
"for point in obs: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='r', markersize=2)\n",
"for point in out: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='b', markersize=2) \n",
"for point in g1: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize=2) \n",
"for point in g2: \n",
" x, y = point\n",
" plt.plot(x, y, marker='o', color='g', markersize=2)\n",
" \n",
"plt.ylim(0, 2*np.pi)\n",
"plt.xlim(0, np.pi)\n",
"voronoi_plot_2d(vor, show_points=False, ax = ax )\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Sample output from for MTCS algorithm\n",
"\n",
"theta1, theta2 = np.pi/2, 0\n",
"start_state = (theta1, theta2)\n",
"\n",
"env = Environment(6, 6, theta1=theta1, theta2=theta2)\n",
"env.enlarge_obstacle()\n",
"g1, g2, obs, out, s1, s2 = create_configuration_space(env, 50)\n",
"\n",
"end_state_1 = g1\n",
"end_state_2 = g2\n",
"boundary = obs + out\n",
"step_size = (s1, s2)\n",
"\n",
"#Outputs for the MTCS\n",
"'''\n",
"start_state (tuple)\n",
"\n",
"end_state_1 (list of tuples)\n",
"\n",
"end_state_2 (list of tuples)\n",
"\n",
"boundary (list of tuples)\n",
"\n",
"step_size (tuple): (theta1_size, theta2_size) \n",
"'''\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment