{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Task and Motion Planning via UP SpiderPlan\n", "\n", "Note: this will not run in docker or on Colab since up-spiderplan requires docker. \n", "\n", "## Setup\n", "\n", "Install jupyter in a python 3.7 or 3.8. For more details on up-spiderplan see https://github.com/aiplan4eu/up-spiderplan.\n", "\n", "## Install Requirements\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "H6za5Bu3IDUE", "outputId": "1f2e7a58-8626-40f4-b560-f9375f0c7d3b", "tags": [ "remove_from_CI" ] }, "outputs": [], "source": [ "%pip install unified-planning\n", "%pip install up-spiderplan==0.6.4" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "xd9G9eWIHffc" }, "outputs": [], "source": [ "import os\n", "import math\n", "import unified_planning.engines.results as results\n", "from unified_planning.shortcuts import *" ] }, { "cell_type": "markdown", "metadata": { "id": "JskjdsH-UFGf" }, "source": [ "## Creating Movable Robot\n", "\n", "We declare a type for robots using the `MovableType`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "YLiF_BdnUYYA" }, "outputs": [], "source": [ "t_robot = MovableType(\"robot\")" ] }, { "cell_type": "markdown", "metadata": { "id": "x7IxmDuPUggo" }, "source": [ "## Using a Map\n", "\n", "Next we add an occupancy map by using a reference to a YAML file in the format used by the Robot Operating System (ROS). See http://wiki.ros.org/map_server.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "qkpJ6v9wU14A" }, "outputs": [], "source": [ "occ_map = OccupancyMap(\"./maps/office-map-1.yaml\", (0, 0))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "NGTBaSbNU9df" }, "source": [ "## Adding Configuration Types\n", "\n", "A configuration specifies a location and orientation in our map. The last value is the number of dimensions of a configuration (here we have three for X, Y coordnates and angle)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "UMtrja_7VO0g" }, "outputs": [], "source": [ "t_robot_config = ConfigurationType(\"robot_config\", occ_map, 3)" ] }, { "cell_type": "markdown", "metadata": { "id": "WzKtAX8ZVVSh" }, "source": [ "## Adding Fluents\n", "\n", "Fluents are added as ususal, but we use our previously added `ConfigurationType` in place of a regular location." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "KOXaF3i9VoC3" }, "outputs": [], "source": [ "t_parcel = UserType(\"parcel\")\n", "\n", "robot_at = Fluent(\"robot_at\", BoolType(), robot=t_robot, configuration=t_robot_config)\n", "parcel_at = Fluent(\"parcel_at\", BoolType(), parcel=t_parcel, configuration=t_robot_config)\n", "carries = Fluent(\"carries\", BoolType(), robot=t_robot, parcel=t_parcel)" ] }, { "cell_type": "markdown", "metadata": { "id": "w2Ir9L0XVtQz" }, "source": [ "## Creating Configuration Objects\n", "\n", "Configuration objects combine a symbolic name like `parkin-1` with a pose. Each pose is a tuple with the number of elements specified by the configuration type (so three in this case)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "HcXDje1hWXtJ" }, "outputs": [], "source": [ "park1 = ConfigurationObject(\"parking-1\", t_robot_config, (46.0, 26.0, 3*math.pi/2))\n", "park2 = ConfigurationObject(\"parking-2\", t_robot_config, (40.0, 26.0, 3*math.pi/2))\n", "\n", "office1 = ConfigurationObject(\"office-1\", t_robot_config, (4.0, 4.0, 3*math.pi/2))\n", "office2 = ConfigurationObject(\"office-2\", t_robot_config, (14.0, 4.0, math.pi/2))\n", "office3 = ConfigurationObject(\"office-3\", t_robot_config, (24.0, 4.0, 3*math.pi/2))\n", "office4 = ConfigurationObject(\"office-4\", t_robot_config, (32.0, 4.0, 3*math.pi/2))\n", "office5 = ConfigurationObject(\"office-5\", t_robot_config, (4.0, 24.0, 3*math.pi/2))\n", "office6 = ConfigurationObject(\"office-6\", t_robot_config, (14.0, 24.0, math.pi/2))\n", "office7 = ConfigurationObject(\"office-7\", t_robot_config, (24.0, 24.0, math.pi/2))\n", "office8 = ConfigurationObject(\"office-8\", t_robot_config, (32.0, 24.0, math.pi/2))" ] }, { "cell_type": "markdown", "metadata": { "id": "fcJPXKbGWZor" }, "source": [ "## Adding Movable Objects\n", "\n", "Motion planning requires objects that can move in our map. For this purpose we add two MovableObject instances for our robots names `r1` and `r2`.\n", "\n", "The footprint specifies the 2-dimensional outline of the robot. The motion model specifies how the robot moves. Here we use the Reeds-Shepp car model (see, e.g., https://lavalle.pl/planning/ch13.pdf) which allows movement forward and backwards, and turning at a specific `turning_radius`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "HZcbs359X1hf" }, "outputs": [], "source": [ "r1 = MovableObject(\n", " \"r1\",\n", " t_robot,\n", " footprint=[(-1.0, 0.5), (1.0, 0.5), (1.0, -0.5), (-1.0, -0.5)],\n", " motion_model=MotionModels.REEDSSHEPP,\n", " parameters={\"turning_radius\": 2.0},\n", ")\n", "\n", "r2 = MovableObject(\n", " \"r2\",\n", " t_robot,\n", " footprint=[(-1.0, 0.5), (1.0, 0.5), (1.0, -0.5), (-1.0, -0.5)],\n", " motion_model=MotionModels.REEDSSHEPP,\n", " parameters={\"turning_radius\": 2.0},\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "raMc5ephX6Sl" }, "source": [ "## Some Additional Objects\n", "\n", "Creating some parcels in the regular Unified Planning style." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "ABj9LOvjYIdh" }, "outputs": [], "source": [ "nothing = Object(\"nothing\", t_parcel)\n", "p1 = Object(\"parcel-1\", t_parcel)\n", "p2 = Object(\"parcel-2\", t_parcel)" ] }, { "cell_type": "markdown", "metadata": { "id": "eQCtIejKYUd1" }, "source": [ "## Operators\n", "\n", "Now we can create operators that can use motion constraints.\n", "\n", "### Move\n", "\n", "The move operators has a motion constraint that requires the robot to move from its current configuration to the goal configuration. Apart from the last line that adds this constraints and the type `InstantaneousMotionAction`, this looks just like classical planning operators defined in Unified Planning." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "cfvnsYFwYsP7" }, "outputs": [], "source": [ "move = InstantaneousMotionAction(\n", " \"move\", robot=t_robot, c_from=t_robot_config, c_to=t_robot_config\n", ")\n", "robot = move.parameter(\"robot\")\n", "c_from = move.parameter(\"c_from\")\n", "c_to = move.parameter(\"c_to\")\n", "move.add_precondition(robot_at(robot, c_from))\n", "move.add_effect(robot_at(robot, c_from), False)\n", "move.add_effect(robot_at(robot, c_to), True)\n", "move.add_motion_constraint(Waypoints(robot, c_from, [c_to]))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "o7OJ7t5zZBDT" }, "source": [ "### Pick\n", "\n", "Robots can pick parcels at their current location if they carry nothing. This operator does not use a motion planning constraint." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "P_Fz11DtZRR6" }, "outputs": [], "source": [ "pick = InstantaneousMotionAction(\n", " \"pick\", robot=t_robot, loc=t_robot_config, parcel=t_parcel\n", ")\n", "pick_robot = pick.parameter(\"robot\")\n", "pick_loc = pick.parameter(\"loc\")\n", "pick_parcel = pick.parameter(\"parcel\")\n", "pick.add_precondition(robot_at(pick_robot, pick_loc))\n", "pick.add_precondition(parcel_at(pick_parcel, pick_loc))\n", "pick.add_precondition(carries(pick_robot, nothing))\n", "pick.add_precondition(Not(carries(pick_robot, pick_parcel)))\n", "pick.add_effect(carries(pick_robot, pick_parcel), True)\n", "pick.add_effect(parcel_at(pick_parcel, pick_loc), False)\n", "pick.add_effect(carries(pick_robot, nothing), False)" ] }, { "cell_type": "markdown", "metadata": { "id": "_gfOmdfnZTkI" }, "source": [ "### Place\n", "\n", "Robots can place objects they carry at their current location. Again, no special motion planning constraint is used." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "id": "9qf-WsdDZT2I" }, "outputs": [], "source": [ "place = InstantaneousMotionAction(\n", " \"place\", robot=t_robot, loc=t_robot_config, parcel=t_parcel\n", ")\n", "place_robot = place.parameter(\"robot\")\n", "place_loc = place.parameter(\"loc\")\n", "place_parcel = place.parameter(\"parcel\")\n", "place.add_precondition(robot_at(place_robot, place_loc))\n", "place.add_precondition(carries(place_robot, place_parcel))\n", "place.add_precondition(Not(parcel_at(place_parcel, place_loc)))\n", "place.add_precondition(Not(carries(place_robot, nothing)))\n", "place.add_effect(carries(place_robot, place_parcel), False)\n", "place.add_effect(carries(place_robot, nothing), True)\n", "place.add_effect(parcel_at(place_parcel, place_loc), True)\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "NDu6DJzxZi6q" }, "source": [ "Finally, we can assemble the problem. There is nothing specific to motion planning here. We use the regular UP syntax." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 248 }, "id": "sChGIwQ1Iomc", "outputId": "a290fbfe-5767-422b-8a0e-713b790282e2" }, "outputs": [], "source": [ "problem = Problem(\"TAMP\")\n", "problem.add_fluent(robot_at, default_initial_value=False)\n", "problem.add_fluent(parcel_at, default_initial_value=False)\n", "problem.add_fluent(carries, default_initial_value=False)\n", "problem.add_action(move)\n", "problem.add_action(pick)\n", "problem.add_action(place)\n", "\n", "problem.add_object(park1)\n", "problem.add_object(park2)\n", "problem.add_object(office1)\n", "problem.add_object(office2)\n", "problem.add_object(office3)\n", "problem.add_object(office4)\n", "problem.add_object(office5)\n", "problem.add_object(office6)\n", "problem.add_object(office7)\n", "problem.add_object(office8)\n", "\n", "problem.add_object(r1)\n", "problem.add_object(r2)\n", "\n", "problem.add_object(nothing)\n", "problem.add_object(p1)\n", "problem.add_object(p2)\n", "\n", "problem.set_initial_value(carries(r1, nothing), True)\n", "problem.set_initial_value(carries(r2, nothing), True)\n", "problem.set_initial_value(parcel_at(p1, office1), True)\n", "problem.set_initial_value(parcel_at(p2, office6), True)\n", "problem.set_initial_value(robot_at(r1, park1), True)\n", "\n", "problem.add_goal(robot_at(r1, park1))\n", "problem.add_goal(parcel_at(p1, office2))\n", "problem.add_goal(parcel_at(p2, office3))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "gYQm4A8RZ-n6" }, "source": [ "## Solve the Problem and Show the Result\n", "\n", "Now we can solve the problem and print the result. If a path exists, we plot it.\n", "\n", "Note that the following will not run in a cloud environment due to the requirements of `up_spiderplan`" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 248 }, "id": "wlbFfzLBIowP", "outputId": "aef40eb7-dd89-432f-8172-6f58f0a7d84e", "tags": [ "remove_from_CI" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " Container up-spiderplan-server-web Created\n", " Container up-spiderplan-server-web Starting\n", " Container up-spiderplan-server-web Started\n", " Container up-spiderplan-server-web Stopping\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "move(r1, parking-1, office-6)\n", "{waypoints(r1, parking-1, [office-6]): [((46.0, 26.0, -1.570796326794897), 0.0), ((45.93725792336355, 25.50297712490758, -1.821939505650915), 0.0), ((45.75296826163486, 25.03713849713428, -2.073082684506933), 0.0), ((45.45869373089342, 24.631711799564062, -2.3242258633629502), 0.0), ((45.07331233257161, 24.311507688712815, -2.5479571445910896), 0.0), ((44.65696087359254, 24.030539634034664, -2.5479571445910896), 0.0), ((44.24060941461347, 23.74957157935651, -2.5479571445910896), 0.0), ((43.82425795563441, 23.468603524678358, -2.5479571445910896), 0.0), ((43.40790649665534, 23.187635470000203, -2.5479571445910896), 0.0), ((42.99155503767628, 22.90666741532205, -2.5479571445910896), 0.0), ((42.57520357869721, 22.625699360643896, -2.5479571445910896), 0.0), ((42.15885211971814, 22.344731305965745, -2.5479571445910896), 0.0), ((41.742500660739076, 22.06376325128759, -2.5479571445910896), 0.0), ((41.32614920176001, 21.782795196609435, -2.5479571445910896), 0.0), ((40.909797742780945, 21.501827141931283, -2.5479571445910896), 0.0), ((40.49344628380188, 21.22085908725313, -2.5479571445910896), 0.0), ((40.07709482482281, 20.939891032574977, -2.5479571445910896), 0.0), ((39.66074336584374, 20.658922977896825, -2.5479571445910896), 0.0), ((39.24439190686468, 20.37795492321867, -2.5479571445910896), 0.0), ((38.82804044788561, 20.09698686854052, -2.5479571445910896), 0.0), ((38.41065410146332, 19.817601354114696, -2.5914425321141192), 0.0), ((37.99140911579281, 19.620593007155787, -2.774524112120613), 0.0), ((37.558262319545285, 19.45405043704998, -2.774524112120613), 0.0), ((37.125115523297765, 19.287507866944175, -2.774524112120613), 0.0), ((36.69274204396115, 19.119041717542192, -2.7289903469211083), 0.0), ((36.26188037999589, 18.861707456408183, -2.4773976886837996), 0.0), ((35.90864600210454, 18.505213179169388, -2.225805030446491), 0.0), ((35.655280550920516, 18.072005788218338, -1.9742123722091822), 0.0), ((35.51773735280972, 17.589362478846134, -1.7226197139718735), 0.0), ((35.48622515725194, 17.378783492268347, -1.4710270557345648), 0.0), ((35.37398048919628, 17.867929513330946, -1.2194343974972564), 0.0), ((35.14349826936187, 18.313732880039304, -0.9678417392599474), 0.0), ((34.80929096603267, 18.688123283000866, -0.7162490810226387), 0.0), ((34.39240216727075, 18.967526978207548, -0.46465642278533004), 0.0), ((33.91908155721363, 19.134351123712495, -0.21306376454802134), 0.0), ((33.419127881596005, 19.178228335769884, 0.02682948635701843), 0.0), ((32.916123656022165, 19.16472975175062, 0.02682948635701843), 0.0), ((32.413119430448326, 19.151231167731357, 0.02682948635701843), 0.0), ((31.91011520487449, 19.137732583712094, 0.02682948635701843), 0.0), ((31.407110979300654, 19.12423399969283, 0.02682948635701843), 0.0), ((30.904106753726815, 19.110735415673567, 0.02682948635701843), 0.0), ((30.40110252815298, 19.097236831654303, 0.02682948635701843), 0.0), ((29.898098302579143, 19.083738247635036, 0.02682948635701843), 0.0), ((29.395094077005304, 19.070239663615773, 0.02682948635701843), 0.0), ((28.892089851431468, 19.05674107959651, 0.02682948635701843), 0.0), ((28.38908562585763, 19.043242495577246, 0.02682948635701843), 0.0), ((27.886081400283793, 19.029743911557983, 0.02682948635701843), 0.0), ((27.383077174709953, 19.01624532753872, 0.02682948635701843), 0.0), ((26.88007294913612, 19.002746743519456, 0.02682948635701843), 0.0), ((26.37706872356228, 18.989248159500193, 0.02682948635701843), 0.0), ((25.874064497988442, 18.975749575480926, 0.02682948635701843), 0.0), ((25.371060272414606, 18.962250991461662, 0.02682948635701843), 0.0), ((24.86805604684077, 18.9487524074424, 0.02682948635701843), 0.0), ((24.36505182126693, 18.935253823423135, 0.02682948635701843), 0.0), ((23.86204759569309, 18.921755239403872, 0.02682948635701843), 0.0), ((23.35904337011926, 18.90825665538461, 0.02682948635701843), 0.0), ((22.85603914454542, 18.894758071365345, 0.02682948635701843), 0.0), ((22.35303491897158, 18.88125948734608, 0.02682948635701843), 0.0), ((21.850030693397745, 18.867760903326815, 0.02682948635701843), 0.0), ((21.34702646782391, 18.85426231930755, 0.02682948635701843), 0.0), ((20.84402224225007, 18.840763735288288, 0.02682948635701843), 0.0), ((20.341018016676234, 18.827265151269025, 0.02682948635701843), 0.0), ((19.838013791102398, 18.81376656724976, 0.02682948635701843), 0.0), ((19.33500956552856, 18.800267983230498, 0.02682948635701843), 0.0), ((18.832005339954723, 18.786769399211234, 0.02682948635701843), 0.0), ((18.329001114380887, 18.77327081519197, 0.02682948635701843), 0.0), ((17.825996888807047, 18.759772231172708, 0.02682948635701843), 0.0), ((17.322992663233208, 18.74627364715344, 0.02682948635701843), 0.0), ((16.819988437659376, 18.732775063134177, 0.02682948635701843), 0.0), ((16.316984212085536, 18.719276479114914, 0.02682948635701843), 0.0), ((15.813979986511697, 18.70577789509565, 0.02682948635701843), 0.0), ((15.314632395106008, 18.653074132098716, 0.2253703587058815), 0.0), ((14.81311557172982, 18.46445783892078, 0.49408443302643207), 0.0), ((15.062210064359029, 18.673743714278746, 0.7627985073469826), 0.0), ((15.396469084474557, 19.092511117084808, 1.031512581667533), 0.0), ((15.607553238769189, 19.58499330964333, 1.3002266559880837), 0.0), ((15.680312213776695, 20.11584296984609, 1.5689407303086342), 0.0), ((15.609523820827693, 20.64695899634616, 1.8376548046291847), 0.0), ((15.400268812414149, 21.14022116967326, 2.106368878949735), 0.0), ((15.120754101503913, 21.59924185982504, 2.1180136049713516), 0.0), ((14.841123319239742, 22.058192446012843, 2.1180136049713516), 0.0), ((14.561492536975571, 22.517143032200647, 2.1180136049713516), 0.0), ((14.281943750731966, 22.976143211014815, 2.108224475435998), 0.0), ((14.07177380754538, 23.469016242497034, 1.8395104011154473), 0.0), ((14.0, 24.0, 1.5707963267948966), 0.0)]}\n", "pick(r1, office-6, parcel-2)\n", "None\n", "move(r1, office-6, office-3)\n", "{waypoints(r1, office-6, [office-3]): [((14.0, 24.0, 1.5707963267948966), 0.0), ((14.06332623771857, 23.500705759605932, 1.8231121463816684), 0.0), ((14.237285348638517, 23.027550925924544, 1.9605147989741347), 0.0), ((14.42900904431806, 22.560758556910272, 1.9605147989741347), 0.0), ((14.620732739997601, 22.093966187896, 1.9605147989741347), 0.0), ((14.812456435677143, 21.627173818881726, 1.9605147989741347), 0.0), ((15.004180131356685, 21.160381449867455, 1.9605147989741347), 0.0), ((15.195903827036227, 20.693589080853183, 1.9605147989741347), 0.0), ((15.387627522715768, 20.22679671183891, 1.9605147989741347), 0.0), ((15.57935121839531, 19.76000434282464, 1.9605147989741347), 0.0), ((15.771074914074852, 19.29321197381037, 1.9605147989741347), 0.0), ((15.962798609754394, 18.826419604796097, 1.9605147989741347), 0.0), ((16.154522305433936, 18.359627235781822, 1.9605147989741347), 0.0), ((16.346246001113478, 17.89283486676755, 1.9605147989741347), 0.0), ((16.534904654921718, 17.42485155309309, 1.9031685931840001), 0.0), ((16.637957110754652, 16.932220715425494, 1.650852773597228), 0.0), ((16.612923915917563, 16.419055310055132, 1.3932533155616582), 0.0), ((16.457982713311715, 15.929199598801569, 1.1356538575260884), 0.0), ((16.183358281839652, 15.494979820634654, 0.8780543994905188), 0.0), ((16.492319618577717, 15.766015215031077, 0.620454941454949), 0.0), ((16.94523989082278, 16.008561336628887, 0.36285548341937934), 0.0), ((17.445006792005042, 16.127718537818563, 0.10525602538380952), 0.0), ((17.95864003036575, 16.115623474206753, -0.15234343265175998), 0.0), ((18.452244255856584, 15.973074315351733, -0.40994289068733025), 0.0), ((18.893245859998203, 15.709478072477904, -0.6675423487228996), 0.0), ((19.282718044700076, 15.372280345748909, -0.7186550207613479), 0.0), ((19.67050409961618, 15.033087334716132, -0.7186550207613479), 0.0), ((20.058290154532287, 14.693894323683356, -0.7186550207613479), 0.0), ((20.446076209448393, 14.354701312650583, -0.7186550207613479), 0.0), ((20.833862264364498, 14.015508301617807, -0.7186550207613479), 0.0), ((21.221648319280604, 13.67631529058503, -0.7186550207613479), 0.0), ((21.60943437419671, 13.337122279552254, -0.7186550207613479), 0.0), ((21.992942214525602, 12.993291880164987, -0.7980936960112046), 0.0), ((22.30621314913975, 12.573795008916608, -1.0606275880349878), 0.0), ((22.53307725049504, 12.100383300807707, -1.134233819554011), 0.0), ((22.755090022034633, 11.624561372857837, -1.134233819554011), 0.0), ((22.977102793574225, 11.148739444907967, -1.134233819554011), 0.0), ((23.199115565113818, 10.672917516958098, -1.134233819554011), 0.0), ((23.41376801213085, 10.193925227432729, -1.2237652128118113), 0.0), ((23.52585928681664, 9.682503826237477, -1.4862991048355947), 0.0), ((23.569610900874807, 9.16594910633662, -1.4862991048355951), 0.0), ((23.613362514932977, 8.649394386435764, -1.4862991048355951), 0.0), ((23.657114128991143, 8.132839666534908, -1.4862991048355951), 0.0), ((23.70086574304931, 7.616284946634051, -1.4862991048355951), 0.0), ((23.74461735710748, 7.099730226733195, -1.4862991048355951), 0.0), ((23.788368971165646, 6.583175506832339, -1.4862991048355951), 0.0), ((23.832120585223812, 6.066620786931483, -1.4862991048355951), 0.0), ((23.875872199281982, 5.550066067030626, -1.4862991048355951), 0.0), ((23.91962381334015, 5.033511347129769, -1.4862991048355951), 0.0), ((23.963375427398315, 4.516956627228914, -1.4862991048355951), 0.0), ((24.0, 4.0, -1.570796326794897), 0.0)]}\n", "place(r1, office-3, parcel-2)\n", "None\n", "move(r1, office-3, office-1)\n", "{waypoints(r1, office-3, [office-1]): [((24.0, 4.0, -1.570796326794897), 0.0), ((23.94993098152358, 4.505304905655232, -1.4366259118949467), 0.0), ((23.881941197129063, 5.009002511016412, -1.4366259118949467), 0.0), ((23.813951412734546, 5.512700116377593, -1.4366259118949467), 0.0), ((23.74596162834003, 6.016397721738773, -1.4366259118949467), 0.0), ((23.677971843945514, 6.520095327099952, -1.4366259118949467), 0.0), ((23.609982059550997, 7.023792932461133, -1.4366259118949467), 0.0), ((23.54199227515648, 7.527490537822313, -1.4366259118949467), 0.0), ((23.474002490761965, 8.031188143183494, -1.4366259118949467), 0.0), ((23.40601270636745, 8.534885748544674, -1.4366259118949467), 0.0), ((23.338022921972932, 9.038583353905853, -1.4366259118949467), 0.0), ((23.27003313757842, 9.542280959267035, -1.4366259118949467), 0.0), ((23.202043353183903, 10.045978564628214, -1.4366259118949467), 0.0), ((23.133887843556845, 10.549653072144665, -1.4236903836144805), 0.0), ((22.999842515613555, 11.030038583494393, -1.173671304628905), 0.0), ((22.75110680724659, 11.462321982251911, -0.9236522256433292), 0.0), ((22.40314824833094, 11.819621899318104, -0.6736331466577534), 0.0), ((21.977604501752314, 12.079719783211829, -0.4236140676721778), 0.0), ((21.500937834052706, 12.226441551747781, -0.17359498868660195), 0.0), ((21.002769101540654, 12.25098003388849, 0.058610424376439596), 0.0), ((20.50358955873686, 12.221689361766195, 0.058610424376439596), 0.0), ((20.004410015933065, 12.1923986896439, 0.058610424376439596), 0.0), ((19.505230473129266, 12.163108017521605, 0.058610424376439596), 0.0), ((19.006050930325472, 12.13381734539931, 0.058610424376439596), 0.0), ((18.506871387521677, 12.104526673277014, 0.058610424376439596), 0.0), ((18.007691844717883, 12.075236001154721, 0.058610424376439596), 0.0), ((17.508512301914088, 12.045945329032426, 0.058610424376439596), 0.0), ((17.00933275911029, 12.01665465691013, 0.058610424376439596), 0.0), ((16.510153216306495, 11.987363984787835, 0.058610424376439596), 0.0), ((16.010973673502697, 11.95807331266554, 0.058610424376439596), 0.0), ((15.511794130698902, 11.928782640543245, 0.058610424376439596), 0.0), ((15.012614587895108, 11.89949196842095, 0.058610424376439596), 0.0), ((14.513435045091313, 11.870201296298655, 0.058610424376439596), 0.0), ((14.014255502287517, 11.84091062417636, 0.058610424376439596), 0.0), ((13.515075959483722, 11.811619952054064, 0.058610424376439596), 0.0), ((13.015896416679926, 11.78232927993177, 0.058610424376439596), 0.0), ((12.516716873876131, 11.753038607809476, 0.058610424376439596), 0.0), ((12.017537331072335, 11.72374793568718, 0.058610424376439596), 0.0), ((11.51835778826854, 11.694457263564885, 0.058610424376439596), 0.0), ((11.019178245464742, 11.66516659144259, 0.058610424376439596), 0.0), ((10.519998702660947, 11.635875919320295, 0.058610424376439596), 0.0), ((10.020819159857151, 11.606585247198, 0.058610424376439596), 0.0), ((9.521639617053358, 11.577294575075705, 0.058610424376439596), 0.0), ((9.022460074249562, 11.54800390295341, 0.058610424376439596), 0.0), ((8.523280531445765, 11.518713230831114, 0.058610424376439596), 0.0), ((8.02410098864197, 11.489422558708819, 0.058610424376439596), 0.0), ((7.524921445838176, 11.460131886586524, 0.058610424376439596), 0.0), ((7.025636081159256, 11.433368653275501, 0.008312999446406621), 0.0), ((6.5302913547055645, 11.491437504070792, -0.24170607953916878), 0.0), ((6.064715571483966, 11.670260264187503, -0.4917251585247442), 0.0), ((5.657860374116771, 11.958716912288157, -0.7417442375103191), 0.0), ((5.349231023316989, 12.317444342140742, -0.9789098253203039), 0.0), ((5.410965535215843, 12.144379856799516, -1.2160754131302887), 0.0), ((5.521675267520461, 11.684292038794325, -1.4532410009402734), 0.0), ((5.521189048874822, 11.211071996218818, -1.6904065887502582), 0.0), ((5.46119954431436, 10.741043791384316, -1.6026949766710832), 0.0), ((5.369380681559214, 10.174364590689018, -1.7971127029889453), 0.0), ((5.240294699884539, 9.613757655676844, -1.7971127029889453), 0.0), ((5.111208718209864, 9.05315072066467, -1.7971127029889453), 0.0), ((4.98212273653519, 8.492543785652497, -1.7971127029889453), 0.0), ((4.853036754860515, 7.931936850640322, -1.7971127029889453), 0.0), ((4.723950773185841, 7.371329915628149, -1.7971127029889453), 0.0), ((4.594864791511166, 6.810722980615974, -1.7971127029889453), 0.0), ((4.4657788098364914, 6.250116045603801, -1.7971127029889453), 0.0), ((4.336692828161817, 5.689509110591628, -1.7971127029889453), 0.0), ((4.207606846487142, 5.128902175579453, -1.7971127029889453), 0.0), ((4.078520864812467, 4.56829524056728, -1.7971127029889453), 0.0), ((4.0, 4.0, -1.570796326794897), 0.0)]}\n", "pick(r1, office-1, parcel-1)\n", "None\n", "move(r1, office-1, office-2)\n", "{waypoints(r1, office-1, [office-2]): [((4.0, 4.0, -1.570796326794897), 0.0), ((4.0490951493745015, 4.488240861573623, -1.7110435491217957), 0.0), ((4.117762967580191, 4.974646296298211, -1.7110435491217957), 0.0), ((4.18643078578588, 5.461051731022798, -1.7110435491217957), 0.0), ((4.255098603991568, 5.947457165747386, -1.7110435491217957), 0.0), ((4.323766422197258, 6.433862600471973, -1.7110435491217957), 0.0), ((4.392434240402946, 6.92026803519656, -1.7110435491217957), 0.0), ((4.461102058608635, 7.406673469921148, -1.7110435491217957), 0.0), ((4.529769876814324, 7.893078904645735, -1.7110435491217957), 0.0), ((4.598437695020013, 8.379484339370322, -1.7110435491217957), 0.0), ((4.667105513225701, 8.86588977409491, -1.7110435491217957), 0.0), ((4.735773331431391, 9.352295208819495, -1.7110435491217957), 0.0), ((4.781757343890984, 9.840746115043585, -1.5600790949781227), 0.0), ((4.708515737343361, 10.356010009500348, -1.299117594011677), 0.0), ((4.504810879120678, 10.83493123955484, -1.0381560930452314), 0.0), ((4.184436705514802, 11.245079508778032, -0.7771945920787857), 0.0), ((4.208515578396222, 11.269501608437592, -0.5162330911123401), 0.0), ((4.690714413172965, 11.073681544091828, -0.2552715901458944), 0.0), ((5.207110587698058, 11.008903424357786, 0.005689910820551258), 0.0), ((5.722736178305315, 11.079553719271159, 0.2666514117869969), 0.0), ((6.2112929405854755, 11.26182721752568, 0.32316079782152474), 0.0), ((6.698837651397482, 11.360545689183704, 0.09917749112464125), 0.0), ((7.195046957358909, 11.40992047582049, 0.09917749112464125), 0.0), ((7.691256263320337, 11.459295262457275, 0.09917749112464125), 0.0), ((8.187465569281764, 11.50867004909406, 0.09917749112464125), 0.0), ((8.683674875243192, 11.558044835730847, 0.09917749112464125), 0.0), ((9.17988418120462, 11.607419622367631, 0.09917749112464125), 0.0), ((9.676093487166048, 11.656794409004418, 0.09917749112464125), 0.0), ((10.172302793127475, 11.706169195641204, 0.09917749112464125), 0.0), ((10.668512099088904, 11.755543982277988, 0.09917749112464125), 0.0), ((11.164721405050331, 11.804918768914774, 0.09917749112464125), 0.0), ((11.660930711011758, 11.85429355555156, 0.09917749112464125), 0.0), ((12.157140016973187, 11.903668342188345, 0.09917749112464125), 0.0), ((12.653349322934613, 11.953043128825131, 0.09917749112464125), 0.0), ((13.149362603994515, 12.004144157198173, 0.14085985940303236), 0.0), ((13.62930137442114, 12.134661625303796, 0.3901897337052056), 0.0), ((14.062193689194437, 12.379570336152428, 0.6395196080073788), 0.0), ((14.421267752445598, 12.723724153419687, 0.8888494823095522), 0.0), ((14.136626239647612, 12.253174632806784, 1.164694857421645), 0.0), ((13.990904594594236, 11.722889007582136, 1.4405402325337378), 0.0), ((13.974966564042772, 11.171936049618903, 1.5742884841701321), 0.0), ((13.97689315104917, 10.62024866337065, 1.5742884841701321), 0.0), ((13.97881973805557, 10.068561277122393, 1.5742884841701321), 0.0), ((13.980746325061968, 9.516873890874137, 1.5742884841701321), 0.0), ((13.982672912068367, 8.965186504625883, 1.5742884841701321), 0.0), ((13.984599499074765, 8.413499118377628, 1.5742884841701321), 0.0), ((13.986526086081163, 7.861811732129373, 1.5742884841701321), 0.0), ((13.988452673087561, 7.310124345881117, 1.5742884841701321), 0.0), ((13.990379260093961, 6.758436959632862, 1.5742884841701321), 0.0), ((13.99230584710036, 6.206749573384607, 1.5742884841701321), 0.0), ((13.994232434106758, 5.655062187136352, 1.5742884841701321), 0.0), ((13.996159021113156, 5.103374800888097, 1.5742884841701321), 0.0), ((13.998085608119554, 4.551687414639842, 1.5742884841701321), 0.0), ((14.0, 4.0, 1.5707963267948966), 0.0)]}\n", "place(r1, office-2, parcel-1)\n", "None\n", "move(r1, office-2, parking-1)\n", "{waypoints(r1, office-2, [parking-1]): [((14.0, 4.0, 1.5707963267948966), 0.0), ((14.063131803390862, 4.4985394557746305, 1.3188702200951394), 0.0), ((14.20752620263333, 4.981235117162517, 1.2765775252117173), 0.0), ((14.353639469475372, 5.46343628493416, 1.2765775252117173), 0.0), ((14.499752736317415, 5.945637452705803, 1.2765775252117173), 0.0), ((14.645866003159458, 6.427838620477445, 1.2765775252117173), 0.0), ((14.7919792700015, 6.9100397882490885, 1.2765775252117173), 0.0), ((14.938092536843543, 7.39224095602073, 1.2765775252117173), 0.0), ((15.084205803685585, 7.874442123792373, 1.2765775252117173), 0.0), ((15.230319070527628, 8.356643291564016, 1.2765775252117173), 0.0), ((15.376432337369671, 8.83884445933566, 1.2765775252117173), 0.0), ((15.522545604211713, 9.321045627107303, 1.2765775252117173), 0.0), ((15.668658871053756, 9.803246794878945, 1.2765775252117173), 0.0), ((15.814772137895797, 10.285447962650586, 1.2765775252117173), 0.0), ((16.011119729770027, 10.748069072333942, 1.044206484167902), 0.0), ((16.318359899421967, 11.276567687212985, 1.0442064841679004), 0.0), ((16.625600069073908, 11.805066302092026, 1.0442064841678997), 0.0), ((16.819972838148477, 12.262121010307744, 1.293183408590884), 0.0), ((16.89572810784342, 12.752978340673012, 1.5421603330138682), 0.0), ((16.848194054849632, 13.247367148663095, 1.7911372574368523), 0.0), ((16.838738198731672, 13.360794791249052, 2.0401141818598365), 0.0), ((17.11663416473473, 12.949147355038042, 2.289091106282821), 0.0), ((17.487396314572543, 12.618670112391115, 2.538068030705805), 0.0), ((17.92815976688805, 12.389743576657956, 2.7870449551287897), 0.0), ((18.411742663856433, 12.276485634686807, 3.0360218795517735), 0.0), ((18.908322474859823, 12.28588089752021, -2.9981865032048285), 0.0), ((19.387424089125023, 12.41697598808689, -2.7692730649116415), 0.0), ((19.851261147445026, 12.598120181782296, -2.7692730649116415), 0.0), ((20.315098205765032, 12.7792643754777, -2.7692730649116415), 0.0), ((20.778935264085035, 12.960408569173106, -2.7692730649116415), 0.0), ((21.242772322405038, 13.141552762868512, -2.7692730649116415), 0.0), ((21.70660938072504, 13.322696956563918, -2.7692730649116415), 0.0), ((22.170446439045048, 13.503841150259325, -2.7692730649116415), 0.0), ((22.634283497365054, 13.68498534395473, -2.7692730649116415), 0.0), ((23.098120555685057, 13.866129537650135, -2.7692730649116415), 0.0), ((23.56195761400506, 14.047273731345541, -2.7692730649116415), 0.0), ((24.025794672325063, 14.228417925040947, -2.7692730649116415), 0.0), ((24.489631730645065, 14.409562118736353, -2.7692730649116415), 0.0), ((24.953468788965072, 14.59070631243176, -2.7692730649116415), 0.0), ((25.417305847285075, 14.771850506127166, -2.7692730649116415), 0.0), ((25.88114290560508, 14.952994699822572, -2.7692730649116415), 0.0), ((26.344979963925084, 15.134138893517978, -2.7692730649116415), 0.0), ((26.808817022245087, 15.315283087213382, -2.7692730649116415), 0.0), ((27.27265408056509, 15.496427280908788, -2.7692730649116415), 0.0), ((27.7364911388851, 15.677571474604195, -2.7692730649116415), 0.0), ((28.2003281972051, 15.858715668299599, -2.7692730649116415), 0.0), ((28.664165255525102, 16.039859861995005, -2.7692730649116415), 0.0), ((29.12800231384511, 16.22100405569041, -2.7692730649116415), 0.0), ((29.59183937216511, 16.402148249385817, -2.7692730649116415), 0.0), ((30.055676430485118, 16.583292443081223, -2.7692730649116415), 0.0), ((30.519513488805124, 16.76443663677663, -2.7692730649116415), 0.0), ((30.98335054712512, 16.945580830472032, -2.7692730649116415), 0.0), ((31.44718760544513, 17.126725024167442, -2.7692730649116415), 0.0), ((31.911024663765133, 17.307869217862848, -2.7692730649116415), 0.0), ((32.374861722085136, 17.489013411558254, -2.7692730649116415), 0.0), ((32.83869878040514, 17.67015760525366, -2.7692730649116415), 0.0), ((33.30253583872515, 17.851301798949066, -2.7692730649116415), 0.0), ((33.766372897045144, 18.03244599264447, -2.7692730649116415), 0.0), ((34.230209955365154, 18.21359018633988, -2.7692730649116415), 0.0), ((34.694047013685164, 18.39473438003528, -2.7692730649116415), 0.0), ((35.15788407200516, 18.575878573730687, -2.7692730649116415), 0.0), ((35.62172113032517, 18.757022767426093, -2.7692730649116415), 0.0), ((36.085558188645166, 18.9381669611215, -2.7692730649116415), 0.0), ((36.549395246965176, 19.119311154816906, -2.7692730649116415), 0.0), ((37.01323230528518, 19.300455348512312, -2.7692730649116415), 0.0), ((37.47706936360518, 19.481599542207718, -2.7692730649116415), 0.0), ((37.93088021379691, 19.68493547229953, -2.613170404594171), 0.0), ((38.373379146934134, 19.96917888814043, -2.5664593721967073), 0.0), ((38.81471995203804, 20.255271341480984, -2.5664593721967073), 0.0), ((39.25606075714194, 20.541363794821535, -2.5664593721967073), 0.0), ((39.69740156224584, 20.82745624816209, -2.5664593721967073), 0.0), ((40.138742367349735, 21.11354870150264, -2.5664593721967073), 0.0), ((40.580083172453634, 21.399641154843195, -2.5664593721967073), 0.0), ((41.02142397755753, 21.685733608183746, -2.5664593721967073), 0.0), ((41.46276478266144, 21.9718260615243, -2.5664593721967073), 0.0), ((41.904105587765336, 22.25791851486485, -2.5664593721967073), 0.0), ((42.345446392869235, 22.544010968205406, -2.5664593721967073), 0.0), ((42.78678719797313, 22.830103421545957, -2.5664593721967073), 0.0), ((43.22812800307703, 23.11619587488651, -2.5664593721967073), 0.0), ((43.66946880818093, 23.402288328227062, -2.5664593721967073), 0.0), ((44.11080961328483, 23.688380781567616, -2.5664593721967073), 0.0), ((44.552150418388734, 23.974473234908167, -2.5664593721967073), 0.0), ((44.99349122349263, 24.26056568824872, -2.5664593721967073), 0.0), ((45.409202515031865, 24.580793083575244, -2.359731587601127), 0.0), ((45.729687929308746, 24.995918495736717, -2.096753167332383), 0.0), ((45.93123999785338, 25.480084554286705, -1.8337747470636412), 0.0), ((46.0, 26.0, -1.570796326794897), 0.0)]}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " Container up-spiderplan-server-web Stopped\n" ] } ], "source": [ "from up_spiderplan.solver import EngineImpl\n", "from up_spiderplan.util import plot_path\n", "\n", "solver = EngineImpl(run_docker=True)\n", "result = solver.solve(problem)\n", "\n", "if result.status in results.POSITIVE_OUTCOMES:\n", " for a in result.plan.actions:\n", " print(a)\n", " print(a.motion_paths)\n", "\n", " \n", "else:\n", " print(\"NO-PLAN-FOUND\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting the Solution\n", "\n", "Assuming there is a solution, we can use the `plot_path` function to inspect it:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "tags": [ "remove_from_CI" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAFaCAYAAAA0D6bSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNE0lEQVR4nO3dd1gU1/4/8PcuVURAuijYK7YrAiGWWFBQo1FJ1KjREBOjQVM03htbrAlGc+015hq9MUajsYVrw4aNWLBhw4aKSFGQosACu+f3h1/nl40NdHdny/v1PPs87pmzM+/dAffDzJkzCiGEABEREZERUcodgIiIiOjvWKAQERGR0WGBQkREREaHBQoREREZHRYoREREZHRYoBAREZHRYYFCRERERocFChERERkdFihERERkdFigEBERkdGRtUBZtGgRatSoAXt7ewQHB+PYsWNyxiEiIiIjIVuBsm7dOowaNQqTJk3CyZMn0axZM4SFhSEzM1OuSERERGQkFHLdLDA4OBiBgYFYuHAhAECj0cDX1xcjR47EV199JUckIiIiMhLWcmy0uLgYCQkJGDt2rNSmVCoRGhqK+Pj4J/qrVCqoVCrpuUajQXZ2Ntzc3KBQKAySmYiIiF6NEAL5+fnw8fGBUvn8kziyFCj37t2DWq2Gl5eXVruXlxcuXbr0RP/o6GhMmTLFUPGIiIhIj1JSUlCtWrXn9pGlQCmvsWPHYtSoUdLz3Nxc+Pn5ISUlBU5OTjImM2+vv/46zp8//9Rl586dg6+vr4ETWaYpU6Zg9uzZT102f/58DB482MCJzENqaioaNWr01GUNGjTA0aNHDZzI/Dk7Oz9zWW5urgGTkFzy8vLg6+uLSpUqvbCvLAWKu7s7rKyskJGRodWekZEBb2/vJ/rb2dnBzs7uiXYnJycWKHpkZWX1zGWVKlXiZ28gT/vZf6xChQrcDy8pLy/vmcusrKz4ueqBQqHAs4Y98vO2LGUZniHLVTy2trYICAjAnj17pDaNRoM9e/YgJCREjkhERERkRGQ7xTNq1CgMHjwYLVu2RFBQEObOnYuHDx8iMjJSrkhERERkJGQrUPr27Yu7d+/i66+/Rnp6Opo3b44dO3Y8MXCWiIiILI+sg2RHjBiBESNGyBmBiIiIjBDvxUNERERGhwUKERERGR0WKERERGR0WKAQERGR0WGBQkREREaHBQoREREZHRYoREREZHRYoBAREZHRYYFCRERERocFChERERkdFihERERkdFigEBERkdFhgUJERERGhwUKERERGR0WKERERGR0WKAQERGR0WGBQkREREaHBQoREREZHRYoREREZHRYoBAREZHRYYFCRERERocFChERERkdFihERERkdFigEBERkdFhgUJERERGhwUKERERGR0WKERERGR0WKAQERGR0WGBQkREREaHBQoREREZHRYoREREZHRYoBAREZmRMWPGYNasWXLHeGXWcgcgIiIi3fn+++9hY2ODMWPGyB3llbBAISIiMiOrV69GvXr15I7xyligEBERmZEBAwbIHUEnOAaFiIiIjA4LFCIiIjOxfv16jB49Wu4YOsEChYiIyEwMGjQIs2fPljuGTnAMChERkZk4cuQINm/eLHcMndD5EZTJkydDoVBoPRo0aCAtLyoqQlRUFNzc3ODo6IiIiAhkZGToOgYREZHF+cc//oEpU6bIHUMn9HKKx9/fH2lpadLj0KFD0rIvvvgCf/zxB9avX4+4uDjcuXMHvXv31kcMIiIii6DRaOSOoHN6KVCsra3h7e0tPdzd3QEAubm5+M9//oPZs2ejQ4cOCAgIwE8//YQjR47gzz//1EcUIiIis/f5559DoVBACCF3FJ3RS4Fy5coV+Pj4oFatWhgwYABu3boFAEhISEBJSQlCQ0Olvg0aNICfnx/i4+OfuT6VSoW8vDytBxERET2yYMECKJVKqNVquaPojM4LlODgYKxcuRI7duzAkiVLkJycjDZt2iA/Px/p6emwtbWFi4uL1mu8vLyQnp7+zHVGR0fD2dlZevj6+uo6NhERkclKTU3FwYMHYW1tPte+6PyddOnSRfp306ZNERwcjOrVq+O3335DhQoVXmqdY8eOxahRo6TneXl5LFKIiIj+j4+PD3x8fOSOoVN6nwfFxcUF9erVw9WrV+Ht7Y3i4mLk5ORo9cnIyIC3t/cz12FnZwcnJyetBxERkaXSaDSYMGECatasaZYDZAEDFCgPHjzAtWvXUKVKFQQEBMDGxgZ79uyRliclJeHWrVsICQnRdxQiIiKzcP36dXzzzTe4ffs2iouL5Y6jFzo/xfPll1+ie/fuqF69Ou7cuYNJkybBysoK7777LpydnTFkyBCMGjUKrq6ucHJywsiRIxESEoLXXntN11GIiIjM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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_path(result)" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.12" } }, "nbformat": 4, "nbformat_minor": 1 }