Added some more functionality to map generator.
This commit is contained in:
3 files changed
+295
-107
No files matched your search
@@ -205,3 +205,4 @@ dmypy.json
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
*.pickle
|
||||
@@ -0,0 +1,17 @@
|
||||
version: '3.9'
|
||||
services:
|
||||
ros-nodes:
|
||||
build:
|
||||
context: ros-nodes
|
||||
dockerfile: ros.dockerfile
|
||||
args:
|
||||
username: ${username}
|
||||
password: ${password}
|
||||
pyrate_branch: ${pyrate_branch}
|
||||
model_branch: ${pyrate_branch}
|
||||
ros_nodes_branch: ${ros_nodes_branch}
|
||||
restart: no
|
||||
container_name: ros_nodes:st
|
||||
volumes:
|
||||
influxdb-storage:
|
||||
grafana-storage:
|
||||
+277
-107
@@ -46,7 +46,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 41,
|
||||
"execution_count": 382,
|
||||
"metadata": {
|
||||
"collapsed": true,
|
||||
"pycharm": {
|
||||
@@ -55,8 +55,11 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from typing import Optional, Union, Any\n",
|
||||
"\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import numpy as np\n",
|
||||
"import pandas as pd\n",
|
||||
"from PIL import ImageDraw, Image\n",
|
||||
"from shapely.geometry import Polygon, Point\n",
|
||||
"from shapely.ops import unary_union"
|
||||
@@ -64,11 +67,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 42,
|
||||
"execution_count": 383,
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"size_inner = 50\n",
|
||||
"SIZE_ROUTE = 100"
|
||||
"SIZE_INNER = 50\n",
|
||||
"SIZE_ROUTE = 100\n",
|
||||
"MIN_DESTINATION_DISTANCE = 25"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
@@ -79,7 +83,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 384,
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# https://stackoverflow.com/questions/16444719/python-numpy-complex-numbers-is-there-a-function-for-polar-to-rectangular-co\n",
|
||||
@@ -121,8 +125,17 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"outputs": [],
|
||||
"execution_count": 385,
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "(array('d', [7.834251210977271, 48.43780293223563, 22.372740082639517, 7.834251210977271]),\n array('d', [-60.57486395322814, -63.49031084137326, -27.286653804050623, -60.57486395322814]))"
|
||||
},
|
||||
"execution_count": 385,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def random_polygon(\n",
|
||||
" radius_mean: float = 2,\n",
|
||||
@@ -160,13 +173,13 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 45,
|
||||
"execution_count": 386,
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"POLYGON ((-141.43295005166468 -74.41318452416584, -121.15794381202393 -47.146999169918864, -140.7403966165064 -107.63346548905606, -141.43295005166468 -74.41318452416584))\n"
|
||||
"POLYGON ((-27.951979105071 -66.53134677013938, -45.511910934378555 -68.64134887839623, -37.309218213928624 -98.84106120532472, -27.951979105071 -66.53134677013938))\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -182,27 +195,36 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 46,
|
||||
"execution_count": 387,
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def generate_map(seed=None, plot=True):\n",
|
||||
"def generate_obstacles(\n",
|
||||
" seed=None,\n",
|
||||
" number_of_polygons: int = 50,\n",
|
||||
" radius_mean: float = 2,\n",
|
||||
" radius_sigma: float = 1,\n",
|
||||
"):\n",
|
||||
" \"\"\"Generates a set of obstacles from a union of triangles.\n",
|
||||
"\n",
|
||||
" The union of triangles meas that if polygons overlap o polygon containing the union of those polygons is returned.\n",
|
||||
" Args:\n",
|
||||
" seed: A seed to generate a set of obstacles from.\n",
|
||||
" number_of_polygons: The number of polygons that should be drawn.\n",
|
||||
" radius_mean: The average radius defining a circumcircle of an obstacle triangle.\n",
|
||||
" radius_sigma: The variance of a radius defining a circumcircle of an obstacle triangle.\n",
|
||||
"\n",
|
||||
" Returns:\n",
|
||||
" A list of unified obstacles.\n",
|
||||
" \"\"\"\n",
|
||||
" if seed is not None:\n",
|
||||
" np.random.seed(seed=seed)\n",
|
||||
" if plot:\n",
|
||||
" plt.figure(figsize=(8, 8))\n",
|
||||
" plt.axis([-SIZE_ROUTE, SIZE_ROUTE, -SIZE_ROUTE, SIZE_ROUTE])\n",
|
||||
" number_of_polygons = 40\n",
|
||||
" np.random.seed(seed)\n",
|
||||
" polygons = []\n",
|
||||
" for _ in range(number_of_polygons):\n",
|
||||
" poly = random_polygon(1.9, 1)\n",
|
||||
" poly = random_polygon(radius_mean, radius_sigma)\n",
|
||||
" if poly.contains(Point(0, 0)):\n",
|
||||
" continue\n",
|
||||
" polygons.append(poly)\n",
|
||||
" polygon_list = list(unary_union(polygons).geoms)\n",
|
||||
" if plot:\n",
|
||||
" for polygon in polygon_list:\n",
|
||||
" plt.fill(*polygon.exterior.xy)\n",
|
||||
" plt.show()\n",
|
||||
" return polygon_list"
|
||||
],
|
||||
"metadata": {
|
||||
@@ -214,19 +236,162 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 64,
|
||||
"execution_count": 390,
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"POINT (32 36)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def generate_destination(obstacles: list[Polygon], seed: Optional[int] = None) -> Point:\n",
|
||||
" \"\"\"Generates for a map.\n",
|
||||
"\n",
|
||||
" Can be used to generate a valid destination for list of obstacles.\n",
|
||||
" Args:\n",
|
||||
" obstacles: A list of obstacles.\n",
|
||||
" seed: The seed determining the point.\n",
|
||||
"\n",
|
||||
" Returns:\n",
|
||||
" A goal that should be reached by the ship.\n",
|
||||
" \"\"\"\n",
|
||||
" # sets the seed\n",
|
||||
" if seed is not None:\n",
|
||||
" np.random.seed(seed)\n",
|
||||
"\n",
|
||||
" # generates the point\n",
|
||||
" point: Optional[Point] = None\n",
|
||||
" while (\n",
|
||||
" point is None\n",
|
||||
" or abs(point.x) < MIN_DESTINATION_DISTANCE\n",
|
||||
" or abs(point.y) < MIN_DESTINATION_DISTANCE\n",
|
||||
" or any(obstacle.contains(point) for obstacle in obstacles)\n",
|
||||
" ):\n",
|
||||
" point = Point(np.random.randint(-SIZE_INNER, SIZE_INNER, size=(2,), dtype=int))\n",
|
||||
" return point\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"print(generate_destination(generate_obstacles(42), 42))"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"pycharm": {
|
||||
"name": "#%%\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 419,
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "[<shapely.geometry.polygon.Polygon at 0x2ca812abeb0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab400>,\n <shapely.geometry.polygon.Polygon at 0x2ca812abaf0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab130>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab340>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab1c0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812abdc0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab730>,\n <shapely.geometry.polygon.Polygon at 0x2ca812abb80>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab940>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab6a0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812aba90>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab910>,\n <shapely.geometry.polygon.Polygon at 0x2ca812abb20>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab520>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab610>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab3d0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab7f0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab250>,\n <shapely.geometry.polygon.Polygon at 0x2ca812ab2e0>,\n <shapely.geometry.polygon.Polygon at 0x2ca812abd00>]"
|
||||
"text/plain": "<Figure size 576x576 with 1 Axes>",
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfgAAAHiCAYAAAAEZd6CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAACA/0lEQVR4nO3dd3hUxdcH8O+kZ1MA6VIFKdJLKIIiiCgIAiIoCCo2xO5rRbFgwYrdnyj2AihiQbGBqIhKSwCp0lsA6S3Z9Mz7xzdLetnsvXvv3T2f59knySZ7dzZbzp2ZM2eU1hpCCCGECCwhVjdACCGEEMaTAC+EEEIEIAnwQgghRACSAC+EEEIEIAnwQgghRACSAC+EEEIEIAnwQgghRACSAC9EkFFKpRS45Cql0gr8PLoSx/tdKXWDGW0VQlRemNUNEEL4l9Y61vO9UmoHgBu01r9Y1yIhhBmkBy+EAAAopUKUUhOUUluVUoeVUrOUUqfl/S5KKfVp3vXHlFLLlVK1lVKTAZwL4I28EYA3rH0UQggPCfBCCI/bAQwFcB6A0wEcBfC/vN9dA6AKgAYAqgMYDyBNaz0RwCIAt2mtY7XWt/m70UKIkkmAF0J4jAcwUWudrLXOADAJwHClVBiALDCwn6m1ztFaJ2mtT1jYViFEOWQOXgjh0QjA10qp3ALX5QCoDeATsPf+mVKqKoBPwZOBLL+3UghRIdKDF0J47AYwQGtdtcAlSmu9R2udpbV+XGvdCkAPAIMAXJ13O9mSUggbkgAvhPB4C8BkpVQjAFBK1VRKDcn7vo9Sqq1SKhTACXDI3tPT3w+giRUNFkKUTgK8EMLjVQDfApinlDoJYAmAbnm/qwNgNhjcNwBYCA7be243XCl1VCn1mn+bLIQojdJaRteEEEKIQCM9eCGEECIAGRLglVLvK6UOKKXWFrjuNKXUfKXU5ryv1fKuV0qp15RSW5RSq5VSnYxogxBCCCHyGdWD/xBA/yLXTQCwQGvdDMCCvJ8BYACAZnmXcQCmGtQGIYQQQuQxJMBrrf8AcKTI1UMAfJT3/UdghSzP9R9rWgKgqlKqrhHtEEIIIQSZOQdfW2u9L+/7/8BiGQBQD1xv65Gcd50QQgghDOKXSnZaa62U8ipdXyk1DhzCR0xMTOeWLVtW7IZZWcCGDfwKAPXrA7Vrl32bYLBiBeDrionQUKBNGyBMCiAKm8vNBVauBMLDgbPO4ldhb3v2AP/9Byjl3WdVZCQ/lwJQUlLSIa11zcre3sxP6v1Kqbpa6315Q/AH8q7fA5a89Kifd10hWutpAKYBQEJCgk5MTCz73nbsAFq2BDIy+PP77wPXXuvjQwggMTGA2+3bMUJCgLg4YOFCfi+EXSUmAn37AqmpwMGDwJIlQMOGVrdKlCU1FejUCdi6FcjJqfjtcnOBpUvZAQkwSqmdvtzezE/pb8EdqJD3dU6B66/Oy6bvDuB4gaF8761bxzO+M85gcP/6a579SXAvzIiAnJXFkYBJk3w/lhBmWrkSyM5moNi/H+jalZ0AYV8xMcCCBUB8vHe3i4gAtm83p00OZ9QyuZkAFgNooZRKVkpdD+BZAP2UUpsBXJD3MwD8AGAbgC0A3gFwS6Xv+O2384dmfv2VgX3o0EofLqAZdXbrdgNTpgDz5xtzPCHMsGRJ/ohVbi578V27snco7Kt+fX62uFwVv01oKLB2bfl/F4QcUcmu1CH69HT24Dt39n+jnOa004CjR407XpUq/N/Xk/xIYUNt2vD1WZBSfB8sXgw0a2ZNu0TFfPklcNVVQFpa+X8bGgo8+igvAUYplaS1Tqjs7Z09kRoVJcG9ooyen0pJAQYNyk9mFMIucnKALVuKX681cOQI0K0b8O+//m+XqLjLLgMefLBiPfmcHM7Bi2KcHeBFxRmdFJeTA2zaBNxzj7HHFcJXW7eWvtJDa+DYMeDss4v38IW9PPwwOxHR0eX/7Zo15rfHgSTABwszlra53cB77wFffWX8sYWorFWryj6h9QT5nj2B1av91SrhLaWAjz+u2DLHffuAzEz/tMtBJMAHC7OWtbndwDXXSPKSsI+NGys2d3v8OHDuuTwhEPYUGQn8/DNQowYDfmmio/m8i0IkwAcLM9eIut3AgAEV+1AVwmw33wzcfjuXXcXElP23J04AvXoBSUn+aZvwXo0aXCVV3nMpmfTFSIAPFmYG+NxcIDkZGDfOvPsQoqJq1ABeeonr3597jis9YmNL//uTJ4HevSVRy85atuRUYGnz8SkpMhJTAgnwwcLs8rJpaXwDfvihufcjgsvmzZwCqoyYGODWW4Fdu4DPP2f2fHR0ySe7KSmsfPf33761V5inXz/ghRdKzqzXGli2zP9tsjkJ8MHCH6Vl3W5+oEpGq/BVdjYz3Zs3Z6KVL/U6QkKAiy9m8ZulS4ErruAS26iown+XmgpceCGwaJFvbRfmufVWnvCVFOTXr/d/e2xOAnyw8NcGMZ75+JMn/XN/IvC89x6zppcsAd59l8G9rAQrb7RtC0yfDuzcCdx3Hws2FRy+T03l6/e334y5P2G811/naExkZOHrjxzh8ydOkQAfLPy5A9yhQ8CVV/q+e50IPseOATfcAHTvziJK119vzv3UqgU88QTn6V9/HWjaND+JKzWV66+lHLM9hYYCc+Ywt6LgyKTLJb34IiTABwt/7rSUkcEe0Kuv+u8+RWCoWpVFlBYv9s9JaWQkMHYs5/rnzgXOP59D9+np7Mn/+KP5bRDei4tjZn3BjWlyciSTvggJ8MHC33u4p6YCDz0kmcnCe1ZsRawUM+kXLGAOyfXX86T4kkuA77/3f3tE+Ro1An76KT+zPjVVljsWIQE+WPg7wAPMrB80CDh82P/3LURlnXkmMG0ah++ffprLQIU9devGnA1PkF++3Nr22IwE+GBhRYAHWC1s2DD5kBTOU7UqcP/97MUL+xo1intihIdLNbsiJMAHC3/OwReUlQUkJjKhSQghzPDEExwtPH5cRgwLkAAfLMrbrMFMbjfw/PNMihFCCKMpBcyYAUyaZO1nnc1IgA8WVvXgPdLSOFS/d6+17RBCWOONN8ytLxAVBTz2WOHM+iAnAT5Y2OGsNjWV85nZ2Va3RAjhT1oDEycCd95pdUuCigT4YGFVkl1B2dnAv/8C995rdUuEEP60YQPf/1u3Sqa7H0mADxZ26MEDnI9/5x3gm2+sbokQwl9+/ZW9+LQ04JlnrG5N0JAAHyzs0IP3cLuBq64Ctm2zuiVCCH/47jsGd62BH36QXBw/kQAfLOzSg/dwu7nDV3q61S0RQpgpNxf466/C1732mjVtCTIS4IOF3QJ8bi736b7pJqtbIoQw07p1hXcDzMgA3nxTTu79QAJ8sLBbgAc4ZDd7Nvf7FkIEpl9/Lb5yRmuuWxcl++Yb4PLLfT6MBPhgYccAD3Co/uabeZYvhAg8335bvLeekgJMnixbSpckMxO48UZ2fnwkAT5Y2CnJrii3G+jfHzh50uqWCCGMlJsLLFlS8u8OHAAWLvRve5zgvffyExJ9JAE+WEREWN2Csh08CIwZI2f0QgSSf/4pffvflBTgqaf82x67y8wEHn2URcEMIAE+WNi5Bw8w8eaXX1jOUggRGH79lRtOleavv2S5bEGe3rtBJMAHi/DwwpmsduR2Aw88ACxbZnVLhBBG+PZbnryXJicHmDLFf+2xs4wM4JFHDOu9AxLgg0doqP0DPMCz10GDgCNHrG6JEMIX2dnln6xnZQEffQScOOGfNtnZe+8VTkZ0uXw+pAT4YBEWVvpcmN0cPw5cdhkTdIQQzrRyZcVX77z/vrltsbuMjMJz79HRwIcf+nxYh3ziC585pQcPMNFk2TJJwBHCyRYsKHt43sPtBp57LrhP6Av23l0u4OmngREjfD6sBPhg4aQePMA3/bPPmrt/tBDCPHPn8mS9IlJSgO+/N7c9dlWw9+5yAbfcAtx1lyGHdtAnvvCJk3rwHmlpwLBhwL59VrdECOGNrCwgKanifx/MS+Y8vffoaOCSS4Dnnzfs0M4I8AcOALNmAb//zopnBw8y+1JUXFiY8wI8wDf+JZcUL3UphLCvpCTvq2euWQOsXWtOe+zK03tPTwe6dAE++cTQz2mbL47Ok5wM3HADh5hzc3l2mJEBxMQAVasCNWoAtWsD9eoBDRrw+5o1gVq18r9Wq+asIWqjObEHDzCwb9gA3Hcf8PLLVrdGCFERCxZ4v5lMZian5T791Jw22dF77wGHDwOtWnEbXYNLiivtgMphCUrpRG9uEBXFf5TnhCAzkycFMTEM9NWrA3Xq5J8Q1KpV+GSgZk2eOATSCcGHHwK33WboGku/io4GPvsMGDzY6pYIIcrTrVvl6llERQG7d7PTFugyMoD69YHISK44qFmz2J8opZK01gmVvQtn9OC9lZ5e8tnjyZO87NqVf51S+ScESvGEICODUwCeE4IaNYC6dYHTT+cTUtIIQZUq9u4hO3WI3iMtDRg9Gli9GjjjDKtbI4QoTWYmsGpV5W//5psctg50M2Yw3vzxR4nB3QiB2YM3U0gIz7g8JwQ5OXxB5+QAcXHs+desyRGC+vU5SlD0hKBmTSA+3r8Bd+ZM7r3u5A1dQkKA5s354REZaXVrhFOsXw+88ALwyis8ERfm+vNPYODAyhevqVYN2L/fvjtgGiU9Hdi7F2jSpNQ/kR68v+XmsjdZUr3gY8d42bEj/7qQEI4QeHrQOTkcIcjNZZCvVo0Bv25dngzUq1fylEFsrG8nBHavRV8RubnAzp3cXjbYC2OI8mnNOc4772QuxxVXcNdCYa5ffuEy18rKygK++AK48krj2mRHUVFlBncjBMCnvs3l5pb+Yj96lJeCmy2EhuaPEAD8YPIUi/CcENSqxRGCBg04bVD0ZKBWLU4vFOTUJLui0tKAzz8Hzj+fu88JUZKTJ4FrrgF+/pnvv7AwzglLgDffd9/5turFs1d8oAd4P5AheqcLC+MLine truncated
|
||||
},
|
||||
"execution_count": 64,
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def plot_obstacles(\n",
|
||||
" obstacles: list[Polygon],\n",
|
||||
" destination: Optional[Point] = None,\n",
|
||||
" obstacle_color: Optional[str] = None,\n",
|
||||
" legend: bool = True,\n",
|
||||
") -> None:\n",
|
||||
" \"\"\"PLots the obstacles into a matplotlib plot.\n",
|
||||
"\n",
|
||||
" Args:\n",
|
||||
" obstacles: A list of obstacles.\n",
|
||||
" obstacle_color: The color the obstacles should have. Can be None.\n",
|
||||
" If none all obstacles will have different colors.\n",
|
||||
" legend: If true plots a legend.\n",
|
||||
" Returns:\n",
|
||||
" None\n",
|
||||
" \"\"\"\n",
|
||||
" plt.figure(figsize=(8, 8))\n",
|
||||
" plt.axis([-SIZE_ROUTE, SIZE_ROUTE, -SIZE_ROUTE, SIZE_ROUTE])\n",
|
||||
" plt.title(\"Test\")\n",
|
||||
" for polygon in obstacles:\n",
|
||||
" if obstacle_color is not None:\n",
|
||||
" plt.fill(*polygon.exterior.xy, color=obstacle_color, label=\"Obstacle\")\n",
|
||||
" else:\n",
|
||||
" plt.fill(*polygon.exterior.xy)\n",
|
||||
" plt.scatter(*destination.xy, marker=\"X\", color=\"green\", label=\"Destination\")\n",
|
||||
" plt.scatter(0, 0, marker=\"o\", color=\"green\", label=\"Start\")\n",
|
||||
" if legend:\n",
|
||||
" # https://stackoverflow.com/questions/13588920/stop-matplotlib-repeating-labels-in-legend\n",
|
||||
" handles, labels = plt.gca().get_legend_handles_labels()\n",
|
||||
" by_label = dict(zip(labels, handles))\n",
|
||||
" plt.legend(by_label.values(), by_label.keys())\n",
|
||||
" plt.show()\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"o = generate_obstacles(4)\n",
|
||||
"plot_obstacles(o, generate_destination(o, 4), \"RED\")"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"pycharm": {
|
||||
"name": "#%%\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 391,
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "<PIL.Image.Image image mode=RGB size=200x200>",
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAI3klEQVR4nO2d2ZLcIAxFcSr//8udB2c8bi8gselK3POQSiU9PSwHgQHD9vl8EhTb9vt3tLSN4JzfFCfLf6wTkOVS6PEIalVCFyvFdWvbAluVHIiVwrl1VypFsyql9Nc6ASvx1kLCWZXciLVtvkt/JaV2PHSFO047xMeObyeuVQkxYoUu7l+iZ9NPxIpEdKsSxTJgAasSxZrNGlYlxDFWJFZbnjrBiDWFxaxKjFgzcGdVj0C7fRp+eCBH3gDTJmTPgrv0d5qL3v5/B2b+ndaNOwaU8/b7Zcj1531JB5ORpbp9fTF45TGAtTOrDLfrb8CvtgDDr8lYNMibWNNTUAn1wuZJrOSqtmgYJC9i7TiqKo7uwciKlVy5RVQMHniVlnScbq8jEkZGDcFaId2Kx/g6lS1C903HvluXvtoyeJBTGmOd6Z4UjrhNmDKtpRErcSzfzDJtSbkfi/1XCyuVnjJi7XhvcyZzqovtJq3aQeq95X0+/6t2ZkYWkOlMVcTaWaykOrBS0GrY8+49bs0nukxn2l6moFtaDreiF92f3wFHHdELiNTxE7Fa9KJbKtYIWt9dId2awwKDrdsYqzp00a0K4hbay+Cdbo0metB6fyqsC110S0vQEitNN9CtcYQOWoJ5rIrQRbeE9FpZwtvfJp4gpVuwQL7Hq5l514YuuiVh/nL4FPRLOnSrO+0rH6PDlb6rrVorVIUuuiUEtqCq3N1ab/8SFgfYCMAMSXFVNNpxxVsbEZuPihT+StjmOJlicUVpgT3OIBX2jHRr562sqp+7R4erKvodbit0i3qlp7La/wUqXLXVVNdTkxm6pjG6DJt3UQ84jptuSTiXElSg6kQPsR6vdSwWFt2q7v4mvJTR/LXNYu2ZrLs1lG65jlXZ6uv6MsXjPcf5sjt/np5JmFZKkoD6/jRWezNFJnv3KbXPp/D5Iw/LHG1Qj5PyGfYm9MXlfOhi3MIkL3H2f/ViqSr+chRW0a3RS/08mmsWzWuFv9+kWQXLXJNsMqHspH+B430lsZ9YmV98Ia/XZUBmuF5B24q8R4HBYmVSI+/1Jmw2kkPbzmCJdQcheLQMvBDK0IR3sTBuWEWYSq173a3x5AvvvOcdQ6yknEo1TMblw+QFsKt7z1VlOFkqeXolWWAi1oVjCdKWxwBGqwSMEatdCKizfg69Fh9RaRjwVNj36R3ybUzyxdOgpatYg2YN6BY4TxXUb/B+3zDTi2MqlW75oYdYe5WPrnVa5YpOr395h1seegM2j2VFgLYBBuo8FnHEU7OMKxa7NlMidoVUCoBwEYvb5zEIJBaf7Gz5LvwoYlEpMPyLlQ9UFG4OoDtIW+AUFCT+xUp0C4ZT/4DxMkUXMr1emDz6IUTE2qE9SAQSiyARS6y3oOX62dBn4sMt6eSPTHJK3xxNGTPEilg7jwUXz7Y6Zo1EI4qVYg3ke+Vl7itGQcVKsdxqZ3ppxBUr3Upzzd7Q6F3I0GKl5eOWXfY1Yjlt8Wu6Zf3StkysfQdBgBpy2ja0ANRUSaxjUwpAWutxnfikSb91oDooiQV4K1UdAbJQBCmPgq4QKblNjD7r2xawaor+VHghpFsw3d+ZcGuFRfDqoAnU7KwnVhhQldpZrCv0y0UjbKsSI1YZtNkWnJRkARBrwuU5YfBTRKZioQUDcFwVlIVYvkJUyC2p45kl1pwLvQgMI8WKdC1gjDX4iYwUi6cdL8z4eSxatSScIBXAtqGHYonhs6EGgAlSLywet5TP9RQrC6PUjv4J7EUsX3OYfXmcJVncML0G2fOxllpyyV+mulRR9KB08Frs0KW6B48TchoEL1McTTbeedf5Tb1yjYIVSw9kg/fYLfXxmuDYWR4P57FOnO9+1v4gg9Y3FOvGtFgV2MVto1gaeDDzjuDSBoolZil1MuRnXn6Eo1hEj6CNUaxZXPoOpwOsfLJP/0uxNDT2hvehiUe9ZGeeU6zpeJRpR3PLmnOxnFaS02RrTh/xLJbT6onHU0X4FCvSqqX3jLyk36FYTmsivz3Jaabek60Xy7wUop7eHiYjKaXKiGU+Bw15hl0TkhyhmZdNj37PO06NAu4pqHj5G6c8VZRK3vnLFLtbIHs7Y++2PSNozw4H7xcQusVjXbaYmPa5eyf4FwsBoS4tfTeOUrKUUCwgtgRjzxtivykWEJ9k3afn0URNiuUNnD4xC8WaiBMnnlEmnmKtR4Xf+h9xPo9FtOyKqGb+VFb9fC3Fsmbm7G73Kdz376FYs2gZYN03NFeYUWfV5VeLf5ZirUG1VbWxjWItQPUZTA09Jp8Ko2N0shfFmkL3GSzhF9qdF0ex4mJ6CiHHWFOYv53a+mxLimXB5QTKPNUT5ZlXlscLx67Qmuo6fhNOchrM8eewV2MoVixUPeD5gNnesCsMRLGPOwt0fHhMt8iIFQWQN0p+oFghkFh17+9GPpxSLM9U7IGZBcVyjtCq/CPkACgWNqpLWSoYFuoo1gLk758aA8VyTnVfNnhYRrGi82je+ME+J0hR2UflkkkE7VPhlEfIhcWCfEpPSb8sU/wq+ef7sapYyO+ODqr7ua2o6qjIMETKyx3T6xc1Ect671g3Yvt0B3prchirknKfnVOsjxcURCzrJJJ67KpMHLGCWRU7aAF0LyWxAJJIarCusqxYsa2Kmi+M+bntA5AIM0wfyGOz9lohZRrG2mKdiTeEN2V5sRi0xrC8WOnkFoNWPygWGYIrscZFFGGHyJAmxo9YcyqV6nTCj1ij4Si+KxTrxvRX8ELiR6wJEYVBqx9+xJoJg1MzFOsbBq1OzH2ZAmPhvQDUPdPt8L3CMoY17bdzvBfacTzkyPKcLpaLSNByeTM+kiOcm+torli+KsxFG2jnMaQ1YzF4d+HWCkq90SPv08XyVWHnw6sN0+CiKX5jNN3goqQe28D8lPtqij9YiOWrpBDagK+xaUrJcoLURUnhtAFvbhmJhVNhRaCS6sct0yUdF8WEk8hh15OMwE4sqEjgBT9umUYsb+MGCJy4xd0NJQAjqwe3rMVyEbTolp5/jGZsnhzJIdkAAAAASUVORK5CYII=\n"
|
||||
},
|
||||
"execution_count": 391,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"generate_map(seed=3, plot=False)"
|
||||
"def generate_image_from_map(\n",
|
||||
" obstacles: list[Polygon], destination: Point, solution\n",
|
||||
") -> Image:\n",
|
||||
" \"\"\"Generate an image from the map.\n",
|
||||
"\n",
|
||||
" Can be used to feed an ANN.\n",
|
||||
" - Obstacles are marked as reed.\n",
|
||||
" - The destination is marked as green.\n",
|
||||
" - The points where the route will likely change are blue.\n",
|
||||
"\n",
|
||||
" Args:\n",
|
||||
" obstacles: A list of obstacles as shapely Polygons.\n",
|
||||
" destination: A destination that should be navigated to.\n",
|
||||
" \"\"\"\n",
|
||||
" img = Image.new(\n",
|
||||
" \"RGB\",\n",
|
||||
" (SIZE_ROUTE * 2, SIZE_ROUTE * 2),\n",
|
||||
" \"#ffffff\",\n",
|
||||
" )\n",
|
||||
" draw = ImageDraw.Draw(img)\n",
|
||||
" for polygon in obstacles:\n",
|
||||
" draw.polygon(\n",
|
||||
" list(np.dstack(polygon.exterior.xy).reshape((-1)) + SIZE_ROUTE),\n",
|
||||
" fill=\"#FF0000\",\n",
|
||||
" outline=\"#FF0000\",\n",
|
||||
" )\n",
|
||||
" img.putpixel((int(destination.x) + 100, int(destination.y) + 100), (0, 0xFF, 0))\n",
|
||||
" return img\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"o = generate_obstacles(42)\n",
|
||||
"g = generate_destination(o, 42)\n",
|
||||
"og_img = generate_image_from_map(o, g, None)\n",
|
||||
"og_img"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
@@ -237,91 +402,51 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 63,
|
||||
"execution_count": 392,
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "<Figure size 576x576 with 1 Axes>",
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfgAAAHWCAYAAACbjps5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABXNElEQVR4nO3deXxcVf3/8deZmexJkzRJ03RJ90JbKN1YlEV2yq4IAgqIooiyiMpXxQVQv/5cccWvisoiyiYFRKgiUJECLbRlKV1omu5J0+xp9mQyc35/zKTNvs7MnZm8n49HHs3cuXPvJ5207znnnnuOsdYiIiIi8cXldAEiIiISegp4ERGROKSAFxERiUMKeBERkTikgBcREYlDCngREZE4FJKAN8bcZ4ypMMZs6rJtvDHmBWPM9uCf2cHtxhjzK2NMsTFmozFmSShqEBERkcNC1YJ/AFjeY9vXgZestXOAl4KPAc4F5gS/rgd+G6IaREREJCgkAW+tfQWo6bH5YuDB4PcPAh/usv3PNmAtkGWMKQhFHSIiIhIQzmvw+dbasuD3B4D84PeTgX1d9isJbhMREZEQ8UTiJNZaa4wZ1py4xpjrCXThk5aWtvTII48MS23xonPKYWttt+9dLhcul8ZSioiE2o7mNhp9vkOPE4xhfnpKyI6/YcOGKmtt3khfH86ALzfGFFhry4Jd8BXB7aXA1C77TQlu68Zaey9wL8CyZcvs+vXrw1iqiMSb+vqN+HytZGTMw+PJcLociUOfeHcnL9XUH3o8KSmB9R9cELLjG2P2jOb14Qz4Z4BPAj8M/vn3LttvMsY8ChwPHOzSlS8iMmplZSvY+v43sLYDgNTUGWSkLyAjo/PrKBISMh2uUmJdqrt776jLOFRIP0IS8MaYR4BTgVxjTAlwJ4Fgf9wYcx2wB/hYcPeVwHlAMdAMfCoUNYiIWGvZtfvX7Nr1y27bm5t30dy8i/KKZw9tS06eSkbGAsYFQz8zc4la+jIsKe7uie4muhI+JAFvrb2yn6fO6GNfC9wYivOKiHTy+9t5//1vUXZgRbftLlcySUn5ga/ECSQmTSApaQJJifmBP5PySUzMw+NJd6hyiVWpbne3x24ThwEvIuK06upXSE2bxfx5Pz0U3ElJ+bjd6Zgo+49X4kNKjz75uOyiFxFxWl7emeRxptNlyBjS6xp8lHXR6/4pERGREUjpcQuyO7ryXQEvIiIyEj1b8NF2DV4BLyIiMgIpUX6bnAJeRERkBHQNXkREJA7pGryIiEgc0jV4ERGROJTq6tlFH12irR4REZGY0HuQnVrwIiIiMa93F71DhfRDAS8iIjICvQJeo+hFRERiX89R9LoPXkREJA70vAavUfQiIiJxwG0MSV2a7WrBi4iIxImut8rpGryIiEic6NpNrxa8iIhInOg6kl7X4EVEROJE15H00Rao0VaPiIhIzFALXkREJA51a8FHV74r4EVEREZKLXgREZE41HUUvW6TExERiROpuk1OROKJ9VmnSxhT2tvbnS5B+tH9Gnx0JbwCXkSGz29p39/odBVjQmtrKy+88ILTZUg/ul2Dd7COvijgRWTYTIKL1m01WKuWfDhZa/nHP/5BWVmZ06VIP7q24DXITkTigivJQ+vmaqfLiGvvvPMOmzdvprW11elSpB9dW/BRlu8KeBEZmZQFOTS+UYb1+Z0uJS5VVVWxcuVKAAV8FNMoehGJO+7MJMZfcSQdNQqfUOvo6OCJJ57A6/UCCvho1v0+eAcL6YPH6QJEJHa50xJwpyU4XUbcefHFFzlw4MChxx0dHXi9XhIS9HcdbVK63Buna/AiItKvoqIi1q5d22t7W1ubA9XIYFLdh8fO6z54ERHpU0NDA08//XSfz7W0tES2GBmSri14l67Bi4hIT36/n6eeeorm5uY+n9d1+OgUzdfgFfAiIlFgzZo17Ny5s9/nFfDRKUWLzYiISH9KS0t56aWXBtxHAR+dus1F72AdfYm2ekRExpTW1laeeOIJ/P6B5xNQwEcnzUUvIiJ9WrlyJbW1tYPup4CPTroGLyIivbz77rts3LhxSPsq4KNTgjGHgl3X4EVEhOrqap577rkh76/b5KKTMYbUYDd9tAVqtNUjIhL3Ojo6WLFixbDWeVcLPnp1jqRXC15EZIxbtWoV+/fvH9ZrTJSFhxzWeR0+2may01z0IiIRVFxczOuvvz6kfV0uF/PmzWPp0qVMnz49vIXJiHWOpI+21eQU8CIiEdLY2MhTTz016H45OTksWbKERYsWkZaWFoHKZDTUghcRGcP8fj9PP/00TU1NfT7vdruZP38+S5cuZdq0aeqSjyGHWvBR9p4p4EVEIuCNN96guLi41/bc3FyWLl3KwoUL1VqPUYda8A7X0VNYA94YcwTwWJdNM4E7gCzgs0BlcPs3rLUrw1mLiIhT9u/fzwsvvHDosdvtZsGCBSxdupTCwkK11mNctI6iD2vAW2u3AYsAjDFuoBR4CvgU8HNr7U/DeX4REae1tbUdmoo2Ly/vUGs9NTXV6dIkRA5fgx9DAd/DGcAOa+0efVoVkbHixRdfpLCwkA9/+MNMnTpVrfU4dPgavMOF9BDJgL8CeKTL45uMMdcA64GvWGu7TcZsjLkeuB6gsLAwYkWKiIRKR0cHp59+OikpKU6XImHU2YKPttvkIjImwBiTCFwE/C246bfALALd92XA3T1fY62911q7zFq7LC8vLxJlioiElMfjUbiPAZ0t+Gi7TS5Sg/7OBd6y1pYDWGvLrbU+a60f+ANwXITqEBERCalovQYfqYC/ki7d88aYgi7PfQTYFKE6REREQurQKHqH6+gp7NfgjTFpwFnA57ps/rExZhFggd09nhOJiPaWZhJTNJJZREYndSzeJgdgrW0Ccnpsuzrc5xUZyNonH8P6/Xzg0iudLkVEYtxYvwYvElVaG+txJyQ4XYaIxIHDM9lFV8Ir4GVMSkhKxu3RTM0iMnrReh+8Al7GJE9iEm6PWvAiMnrReg1eAS9jUkJy8pC76K211K14EmttmKsSkViUEqXLxSrgZUwaThd9w/P/puyb36T2ob+EuSoRiUW6Bi8SRTxJSUNqwfsaGij//vcBKP/Rj2ha+0a4SxORGKNr8CJRJCEpGdcQWvAVP/sZHZXBVY19Pkq/9CW8paVhrk5EYomuwYtEkYTEJDyDDLJrfvtt6h59rNs2X20tJTffgr+1NZzliUgMSQ5efNc1eJEokJA8cBe99Xo5cMed0MfAutYtWyi74w4NuhMRIDAHfYrLNTZXkxOJNp7EpAG76Kvvu5+27dv7fb7+mX9Q++c/h6M0EYlBKW6jFrxINEhITu63i759zx6qfvObQY9R/uOfaNCdiACB6/C6Bi8SBRIS++6it9ZSdtdd2Pb2wQ+iQXciEpTickVdoEZbPSIRkZDc9yj6+meeoXnN2iEfx1dby76bb8bf0hLK8kQkxqgFLxIlPIlJeHq04Dtqayn/4Y+Gfay2LVspu+NODboTGcNSXC5dgxeJBm6Ph4TklG7bKn78E3y1tSM6Xv0//kHNgw+GojQRiUGpbo2iF4kaSalph75vWvsGB596alTHq/jJT2laO/TufRGJHyluFy510YtEh8656P1tbRy4887RH9Dno/TWL9FeokF3ImNN4Bq801V0p4CXMa/qd7+jfc+ekBzLV1dHiQbdiYw5KS4NshOJKm3FxVT/8U+hPebWrZR969sadCcyhqS6dZucSNSwfj9ld9wJXm/Ij13/3HPU3P9AyI8rItEpVdfgRaJH3d+eoOWtt8J2/Iqf/pSm118P2/FFJHoEuuidrqI7BbyMSR2VlVT89KfhPYnfT+mXvkx7SUl4zyMijovG2+QGXxBbJMystfgbG/HV1OCrraWjthZfbR2+2i6Pa2rx1dbiysgg7+abSFm4cFTnLP/BD/A3NIToJ+if7+BBSm66memPPIwrJWXwF4hITArcJud0Fd0p4CXk/G1t+GoDgdxRUxMM6+Dj2i6Pa2roqAuEOR0dQz5+0+rVZJxzDnm3fpGkGTOGXV/jf/9L/cp/Dvt1I9X2/vuUffNbTLr7p5hhXqPzef24E9TRJhLt0qLwGrwCXobM19BAy9tv4y07cCiwfXW1dARb151f/ubmsNfS8PzzNLz4IlmXXUruF75AwoQJQ3qdv7mZA9/5bpir661+5UqSFywg57pPD/k1Pq+flx7cwlnXLRj2BwMRiawMt9vpEnpR00CGzJ2RQdqJJ5J63LEkzpyBa1wG/rZ2vPv307p1K97S0oiE+yE+H3WPPsaOc5ZT8ctf4mtsHPQllb++B+/+/REorreKu++m8bXXhrx/c0M729dXsOFfoblHX0TCJ90dfXFqYuFe3WXLltn169c7XYYMwN/eTvuuXbQVbadt++EvbwQHmLmzssj9/A1kXXklrsTEXs+3btnCrss+Bj5fxGrqyZ2ZyfQVT5A4Zcqg+1bsqedvPwj83p97w9HMXJQX7vJEZIS2NLYwPz2042yMMRustctG/HoFvISTv6mJth07AoFftJ227UW0bt+Or7IqbOdMmDyZvC/ewrgLLsC4Ap+qrc/H7suvoHXTprCdd6iSjjgiMOguNXXA/Xa/V8Vzv9kIQEKSm49+dSk5k9MjUaKIDNOeljampSSF9JgKeIlJHbW13Vr6bduLadu+HX99fcjOkXTkkUz4ypdJO+kkah96iPL/94OQHXu0xp13LpPuvnvAa+tbXtvPfx56//BrcpO57OvHkpye0O9rRMQZNd4OxieEdlibAl7ihrWWjoqKXt38bcXF2NbWER839bjjaNm0CRvJ8QFDMOF/biPnuuv6fb5ybwPv/beE0m211FcFfv7JR2Rx4S2LcEfh9T6Rsazd7yfRFdp/lwp4iXvW58NbWno48Ds/AOzaNazb66KOy8XUP9xL+oknDrprQ00rpUW1lG6rZfykdBafVRiBAkXESQp4GbNsezvte/bQtn0Line truncated
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "<Figure size 576x576 with 1 Axes>",
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfgAAAHWCAYAAACbjps5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABdOElEQVR4nO3dd5zcVb3/8deZtr23ZDc92VQCSdgUCEGQ3qUXpamAV6+Kei1X789rufaOCgiCigKKSBUEARGlk4QkpPeQui3by+zOzPn9sZOwm2zfmfnOzL6fj8c+Mvud8v1sZnffe873FGOtRURERJKLy+kCREREJPIU8CIiIklIAS8iIpKEFPAiIiJJSAEvIiKShBTwIiIiSSgiAW+MudcYU2WMWdvtWL4x5jljzJbwv3nh48YYc5sxZqsxZo0xZkEkahAREZH3RKoF/1vg7COOfQl4wVpbDrwQ/hzgHKA8/HEzcEeEahAREZGwiAS8tfZfwMEjDl8E/C58+3fAB7odv892eR3INcaMjUQdIiIi0iWa1+BLrLX7w7cPACXh22XA7m6P2xM+JiIiIhHiicVJrLXWGDOkNXGNMTfT1YVPRkbG8TNnzoxKbSIiw1Xb0kFeuheXMU6XIkloxYoVNdbaouE+P5oBX2mMGWut3R/ugq8KH98LjO/2uHHhYz1Ya+8C7gKoqKiwy5cvj2KpIiJD952/beDtd+t56JYTnC5FkpAxZtdInh/NLvongOvDt68HHu92/LrwaPolQEO3rnwRkYQxtSiTpvaA02WI9CoiLXhjzIPAKUChMWYP8L/Ad4GHjDEfAXYBV4Qf/jRwLrAVaAVujEQNIiKxNrUok/wMr9NliPQqIgFvrb26j7tO6+WxFvhEJM4rIuKkqUUZ5Kb7nC5DpFdayU5EZJhy031ML85yugyJoZZA0OkSBk0BLyIyAhWT8pwuQWLoTweOXPIlfingRURGYN74XKdLkBhZ09TKa/UtI34day119W/R1LQOa0MRqKx3MZkHLyKSrDJS9Gt0NLDW8vWt+zgmK23Er2WMISf7OLZt/zH7V11PTs7x5OUtIS93CZmZMzAmMm1vfWeKiIgM4PnaRl6pb+ba0oKIvJ7L5aN82pcoyF/GuvWfo6bmeQA8nlzy8haRl7tk5OcY8SuIiIgksUDI8o1t+7hpXCEfKInsmIv8/KUsXvQUhQXv7zpXoJ7q6r+zecs3RvzaCngREZF+3L+/lvL0VL42LTrbpvh8BRx77F1Mn/6/uFyRm3apgBcREelDUyDIiwcb+eXsibijuOeAMYbx466jouJRMjLKI/KaCngREZE+PF3dwA9nTCDNHZu4zMqcycKKxygr++CIX0sBLyIi0ov2YIiT8zMp9MV2PLrbncrMGSO/Bq9R9CIiIr1IdbsY607cpYjVghcREUlCCngREZEkpIAXERFJQgp4ERGRJKSAFxERSUIKeBERkSSkgBcREUlCCngREZEhaG5uprOz0+kyBqSAFxERGaS2tjZ+//vfK+BFRESShd/v5w9/+AOVlZWYKG48EykKeBERkQF0dnby4IMPsnfvXgAFvIiISKILBoM89NBD7Ny50+lShkQBLyIi0odQKMQjjzzCli1behxXC15ERCRBhUIhnnzySdatW+d0KcOigBcRETmCtZZnn32Wt99+u9f71YIXERFJQC+++CJvvPGG02WMiAJeRESkm1deeYV//etf/T4mEVrwHqcLEBERiRdvvfUWzz33XK/3eTwe5s6dy8KFC/F6vTGubOgU8CIiIsDq1at56qmnjjqel5dHRUUF8+fPJz093YHKhkcBLyIio96GDRt47LHHehybNm0aixYtYtq0abhciXdFWwEvUdPQsJKcnAVOlyEi0q+tW7fy8MMPY60lNTWV+fPns3DhQvLz850ubUQU8BIVTU3rOFj3mgJeROLarl27+OMf/0hRURGLFi3imGOOwefzOV1WRCjgJeKstWze8i1Kx17mdCkiIn2qrKzknXfe4brrrmP8+PEJMTJ+KBLvooLEvZqa56mvf4PU1DKnSxER6VNBQQHnn38+EyZMSLpwBwW8RFgo1MGWrd8BIDW11OFqRET65vEkdye2Al4ias/e+2lr2wW4SEkZ43Q5IiKjlgJeIqazs44dO24DICWlGJcr/heCEBFJVgp4iZjtO35OINAIoOvvIiIOU8BLRLS0bGfv3vsPf67r7yIizlLAS0Rs3fZdrA0c/lwteBERZyngZcQOHnyFmpoXehxTwIuIOEsBLyNibZAtW7991PHUlLEOVCMiIoco4GVE9u1/mObmjUcdVwteRMRZCngZtkCgme3bf9zrfQp4ERFnKeBl2HbtupOOjpqjjns8uXg8GQ5UJCIih0R1nT5jzAzgT90OTQG+CuQC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 truncated
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "<Figure size 576x576 with 1 Axes>",
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "<Figure size 576x576 with 1 Axes>",
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": "<Figure size 576x576 with 1 Axes>",
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for seed in range(5):\n",
|
||||
" _ = generate_map(seed=seed)"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"pycharm": {
|
||||
"name": "#%%\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 66,
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "ValueError",
|
||||
"evalue": "incorrect coordinate type",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
|
||||
"\u001B[1;31mValueError\u001B[0m Traceback (most recent call last)",
|
||||
"Input \u001B[1;32mIn [66]\u001B[0m, in \u001B[0;36m<cell line: 3>\u001B[1;34m()\u001B[0m\n\u001B[0;32m 1\u001B[0m img \u001B[38;5;241m=\u001B[39m Image\u001B[38;5;241m.\u001B[39mnew(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mL\u001B[39m\u001B[38;5;124m\"\u001B[39m, (SIZE_ROUTE \u001B[38;5;241m*\u001B[39m \u001B[38;5;241m2\u001B[39m, SIZE_ROUTE \u001B[38;5;241m*\u001B[39m \u001B[38;5;241m2\u001B[39m), \u001B[38;5;241m0\u001B[39m)\n\u001B[0;32m 2\u001B[0m img\n\u001B[1;32m----> 3\u001B[0m \u001B[43mImageDraw\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mDraw\u001B[49m\u001B[43m(\u001B[49m\u001B[43mimg\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mpolygon\u001B[49m\u001B[43m(\u001B[49m\u001B[43mgenerate_map\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m2\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m)\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;241;43m0\u001B[39;49m\u001B[43m]\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mexterior\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mxy\u001B[49m\u001B[43m)\u001B[49m\n",
|
||||
"File \u001B[1;32m~\\AppData\\Local\\pypoetry\\Cache\\virtualenvs\\ml-programmiereprojekt-diBy_Al7-py3.9\\lib\\site-packages\\PIL\\ImageDraw.py:243\u001B[0m, in \u001B[0;36mImageDraw.polygon\u001B[1;34m(self, xy, fill, outline, width)\u001B[0m\n\u001B[0;32m 241\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m ink \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m ink \u001B[38;5;241m!=\u001B[39m fill \u001B[38;5;129;01mand\u001B[39;00m width \u001B[38;5;241m!=\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[0;32m 242\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m width \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m1\u001B[39m:\n\u001B[1;32m--> 243\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdraw\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdraw_polygon\u001B[49m\u001B[43m(\u001B[49m\u001B[43mxy\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mink\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m0\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mwidth\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 244\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m 245\u001B[0m \u001B[38;5;66;03m# To avoid expanding the polygon outwards,\u001B[39;00m\n\u001B[0;32m 246\u001B[0m \u001B[38;5;66;03m# use the fill as a mask\u001B[39;00m\n\u001B[0;32m 247\u001B[0m mask \u001B[38;5;241m=\u001B[39m Image\u001B[38;5;241m.\u001B[39mnew(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m1\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mim\u001B[38;5;241m.\u001B[39msize)\n",
|
||||
"\u001B[1;31mValueError\u001B[0m: incorrect coordinate type"
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"7.15 ms ± 166 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"img = Image.new(\"L\", (SIZE_ROUTE * 2, SIZE_ROUTE * 2), 0)\n",
|
||||
"img\n",
|
||||
"ImageDraw.Draw(img).polygon(generate_map(2, False)[0].exterior.xy)"
|
||||
"def generate_all_to_series(\n",
|
||||
" seed: Optional[int] = None, image: bool = False\n",
|
||||
") -> pd.Series:\n",
|
||||
" \"\"\"Generates everything and aggregates all data into a `pd:Series`.\n",
|
||||
"\n",
|
||||
" Args:\n",
|
||||
" seed:The seed that should be used to generate map and destination.\n",
|
||||
" image: If an image should be generated or if that should be postponed to save memory.\n",
|
||||
" Returns:\n",
|
||||
" Contains a `pd.Series`containing the following.\n",
|
||||
" - The seed tha generated the map.\n",
|
||||
" - The destination in x\n",
|
||||
" - The destination in y\n",
|
||||
" - A list of Obstacle polygons.\n",
|
||||
" - The route generated for this map by the roBOOTer navigation system.\n",
|
||||
" - Optionally the image containing all the information. Can be generated at a later date without the fear for a loss of accuracy.\n",
|
||||
" \"\"\"\n",
|
||||
" obstacles = generate_obstacles(seed)\n",
|
||||
" destination = generate_destination(obstacles, seed)\n",
|
||||
"\n",
|
||||
" return pd.Series(\n",
|
||||
" data={\n",
|
||||
" \"seed\": str(seed),\n",
|
||||
" \"obstacles\": obstacles,\n",
|
||||
" \"destination_x\": destination.x,\n",
|
||||
" \"destination_y\": destination.y,\n",
|
||||
" \"image\": generate_image_from_map(obstacles, destination, None)\n",
|
||||
" if image\n",
|
||||
" else pd.NA,\n",
|
||||
" }\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"%timeit generate_all_to_series()"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
@@ -332,10 +457,55 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"outputs": [],
|
||||
"execution_count": 393,
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"7.04 s ± 129 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": " obstacles destination_x \\\nseed \n0 [POLYGON ((-93.57082194649087 -66.947987633875... -6.0 \n1 [POLYGON ((-81.7284773501737 -78.1366517664776... -13.0 \n2 [POLYGON ((-84.97456253498679 -96.322348952267... -10.0 \n3 [POLYGON ((-72.52222134370759 -84.370870527173... -26.0 \n4 [POLYGON ((-49.01395292839513 -91.236864062937... -4.0 \n... ... ... \n995 [POLYGON ((-51.07604481480806 -110.26281808589... -41.0 \n996 [POLYGON ((-73.53136121570428 -96.869509434739... 28.0 \n997 [POLYGON ((-40.84353887456576 -93.533626866125... 20.0 \n998 [POLYGON ((-103.97610620795356 -105.6733356239... 45.0 \n999 [POLYGON ((-63.84493689800847 -95.735428561017... 14.0 \n\n destination_y image \nseed \n0 -3.0 <NA> \n1 -38.0 <NA> \n2 -35.0 <NA> \n3 -47.0 <NA> \n4 5.0 <NA> \n... ... ... \n995 -20.0 <NA> \n996 39.0 <NA> \n997 -41.0 <NA> \n998 -12.0 <NA> \n999 42.0 <NA> \n\n[1000 rows x 4 columns]",
|
||||
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>obstacles</th>\n <th>destination_x</th>\n <th>destination_y</th>\n <th>image</th>\n </tr>\n <tr>\n <th>seed</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>[POLYGON ((-93.57082194649087 -66.947987633875...</td>\n <td>-6.0</td>\n <td>-3.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>1</th>\n <td>[POLYGON ((-81.7284773501737 -78.1366517664776...</td>\n <td>-13.0</td>\n <td>-38.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>2</th>\n <td>[POLYGON ((-84.97456253498679 -96.322348952267...</td>\n <td>-10.0</td>\n <td>-35.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>3</th>\n <td>[POLYGON ((-72.52222134370759 -84.370870527173...</td>\n <td>-26.0</td>\n <td>-47.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>4</th>\n <td>[POLYGON ((-49.01395292839513 -91.236864062937...</td>\n <td>-4.0</td>\n <td>5.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>...</th>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n </tr>\n <tr>\n <th>995</th>\n <td>[POLYGON ((-51.07604481480806 -110.26281808589...</td>\n <td>-41.0</td>\n <td>-20.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>996</th>\n <td>[POLYGON ((-73.53136121570428 -96.869509434739...</td>\n <td>28.0</td>\n <td>39.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>997</th>\n <td>[POLYGON ((-40.84353887456576 -93.533626866125...</td>\n <td>20.0</td>\n <td>-41.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>998</th>\n <td>[POLYGON ((-103.97610620795356 -105.6733356239...</td>\n <td>45.0</td>\n <td>-12.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>999</th>\n <td>[POLYGON ((-63.84493689800847 -95.735428561017...</td>\n <td>14.0</td>\n <td>42.0</td>\n <td><NA></td>\n </tr>\n </tbody>\n</table>\n<p>1000 rows × 4 columns</p>\n</div>"
|
||||
},
|
||||
"execution_count": 393,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"mask = np.array(img)"
|
||||
"%timeit pd.DataFrame([generate_all_to_series(i) for i in range(1000)]).set_index(\"seed\")\n",
|
||||
"df = pd.DataFrame([generate_all_to_series(i) for i in range(1000)]).set_index(\"seed\")\n",
|
||||
"df.to_pickle(\"test.pickle\")\n",
|
||||
"df"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"pycharm": {
|
||||
"name": "#%%\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 395,
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": " obstacles destination_x \\\nseed \n0 [POLYGON ((-93.57082194649087 -66.947987633875... -6.0 \n1 [POLYGON ((-81.7284773501737 -78.1366517664776... -13.0 \n2 [POLYGON ((-84.97456253498679 -96.322348952267... -10.0 \n3 [POLYGON ((-72.52222134370759 -84.370870527173... -26.0 \n4 [POLYGON ((-49.01395292839513 -91.236864062937... -4.0 \n... ... ... \n995 [POLYGON ((-51.07604481480806 -110.26281808589... -41.0 \n996 [POLYGON ((-73.53136121570428 -96.869509434739... 28.0 \n997 [POLYGON ((-40.84353887456576 -93.533626866125... 20.0 \n998 [POLYGON ((-103.97610620795356 -105.6733356239... 45.0 \n999 [POLYGON ((-63.84493689800847 -95.735428561017... 14.0 \n\n destination_y image \nseed \n0 -3.0 <NA> \n1 -38.0 <NA> \n2 -35.0 <NA> \n3 -47.0 <NA> \n4 5.0 <NA> \n... ... ... \n995 -20.0 <NA> \n996 39.0 <NA> \n997 -41.0 <NA> \n998 -12.0 <NA> \n999 42.0 <NA> \n\n[1000 rows x 4 columns]",
|
||||
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>obstacles</th>\n <th>destination_x</th>\n <th>destination_y</th>\n <th>image</th>\n </tr>\n <tr>\n <th>seed</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>[POLYGON ((-93.57082194649087 -66.947987633875...</td>\n <td>-6.0</td>\n <td>-3.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>1</th>\n <td>[POLYGON ((-81.7284773501737 -78.1366517664776...</td>\n <td>-13.0</td>\n <td>-38.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>2</th>\n <td>[POLYGON ((-84.97456253498679 -96.322348952267...</td>\n <td>-10.0</td>\n <td>-35.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>3</th>\n <td>[POLYGON ((-72.52222134370759 -84.370870527173...</td>\n <td>-26.0</td>\n <td>-47.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>4</th>\n <td>[POLYGON ((-49.01395292839513 -91.236864062937...</td>\n <td>-4.0</td>\n <td>5.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>...</th>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n </tr>\n <tr>\n <th>995</th>\n <td>[POLYGON ((-51.07604481480806 -110.26281808589...</td>\n <td>-41.0</td>\n <td>-20.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>996</th>\n <td>[POLYGON ((-73.53136121570428 -96.869509434739...</td>\n <td>28.0</td>\n <td>39.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>997</th>\n <td>[POLYGON ((-40.84353887456576 -93.533626866125...</td>\n <td>20.0</td>\n <td>-41.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>998</th>\n <td>[POLYGON ((-103.97610620795356 -105.6733356239...</td>\n <td>45.0</td>\n <td>-12.0</td>\n <td><NA></td>\n </tr>\n <tr>\n <th>999</th>\n <td>[POLYGON ((-63.84493689800847 -95.735428561017...</td>\n <td>14.0</td>\n <td>42.0</td>\n <td><NA></td>\n </tr>\n </tbody>\n</table>\n<p>1000 rows × 4 columns</p>\n</div>"
|
||||
},
|
||||
"execution_count": 395,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"df2 = pd.read_pickle(\"test.pickle\")\n",
|
||||
"df2"
|
||||
],
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
|
||||
Reference in new issue
Block a user