{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# PDDL\n", "\n", "Here is a simple example where a rover must navigate through waypoints to collect rock samples from the ground and deliver them at the dropping dock for the scientists to analyze the composition. The scientists want to see a picture of different landscapes, believing it will provide more insights to the analysis; therefore, the rover must go to other waypoints where the objectives can be seen and take pictures of them.\n", "\n", "There is a path between the waypoints indicated by the predicate \"can-move\" pictures of determined objectives that can only be taken by waypoints with the predicate \"is-visible\".\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![problem](./problem.png)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "code_folding": [] }, "outputs": [], "source": [ "# Defines the domain\n", "domain = \"\"\"\n", "(define (domain rover-domain)\n", " \n", " (:predicates\n", " (can-move ?from-waypoint ?to-waypoint)\n", " (is-visible ?objective ?waypoint) \n", " (is-in ?sample ?waypoint)\n", " (been-at ?rover ?waypoint)\n", " (carry ?rover ?sample) \n", " (at ?rover ?waypoint)\n", " (is-dropping-dock ?waypoint)\n", " (taken-image ?objective)\n", " (stored-sample ?sample)\n", " (objective ?objective)\n", " (waypoint ?waypoint) \n", " (sample ?sample) \n", " (rover ?rover)\n", " (empty ?rover) \n", " )\n", " \n", " (:action move\n", " :parameters \n", " (?rover\n", " ?from-waypoint \n", " ?to-waypoint)\n", "\n", " :precondition \n", " (and \n", " (rover ?rover)\n", " (waypoint ?from-waypoint)\n", " (waypoint ?to-waypoint) \n", " (at ?rover ?from-waypoint)\n", " (can-move ?from-waypoint ?to-waypoint))\n", "\n", " :effect \n", " (and \n", " (at ?rover ?to-waypoint)\n", " (been-at ?rover ?to-waypoint)\n", " (not (at ?rover ?from-waypoint)))\n", " )\n", "\n", " (:action take-sample\n", " :parameters \n", " (?rover \n", " ?sample \n", " ?waypoint)\n", "\n", " :precondition \n", " (and \n", " (rover ?rover)\n", " (sample ?sample)\n", " (waypoint ?waypoint) \n", " (is-in ?sample ?waypoint)\n", " (at ?rover ?waypoint)\n", " (empty ?rover))\n", "\n", " :effect \n", " (and \n", " (not (is-in ?sample ?waypoint))\n", " (carry ?rover ?sample)\n", " (not (empty ?rover)))\n", " )\n", " \n", " (:action drop-sample\n", " :parameters \n", " (?rover\n", " ?sample \n", " ?waypoint)\n", "\n", " :precondition \n", " (and \n", " (rover ?rover)\n", " (sample ?sample)\n", " (waypoint ?waypoint)\n", " (is-dropping-dock ?waypoint)\n", " (at ?rover ?waypoint)\n", " (carry ?rover ?sample)) \n", " \n", " :effect \n", " (and \n", " (is-in ?sample ?waypoint) \n", " (not (carry ?rover ?sample))\n", " (stored-sample ?sample)\n", " (empty ?rover))\n", " )\n", "\n", " (:action take-image\n", " :parameters \n", " (?rover\n", " ?objective \n", " ?waypoint)\n", "\n", " :precondition \n", " (and \n", " (rover ?rover)\n", " (objective ?objective)\n", " (waypoint ?waypoint)\n", " (at ?rover ?waypoint)\n", " (is-visible ?objective ?waypoint))\n", " \n", " :effect \n", " (taken-image ?objective)\n", " )\n", ")\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "code_folding": [] }, "outputs": [], "source": [ "# Defines the problem\n", "problem = \"\"\"\n", "(define (problem rover-1)\n", "\n", " (:domain \n", " rover-domain \n", " )\n", " \n", " (:objects\n", " waypoint1 waypoint2 waypoint3 waypoint4 waypoint5 waypoint6 \n", " waypoint7 waypoint8 waypoint9 waypoint10 waypoint11 waypoint12\n", " \n", " sample1 sample2 sample3 sample4 sample5 sample6 sample7 sample8 \n", " sample9 \n", " \n", " objective1 objective2 objective3 objective4\n", " \n", " rover1\n", " )\n", " \n", " (:init\n", " \n", " (waypoint waypoint1) (waypoint waypoint2) (waypoint waypoint3) \n", " (waypoint waypoint4) (waypoint waypoint5) (waypoint waypoint6) \n", " (waypoint waypoint7) (waypoint waypoint8) (waypoint waypoint9)\n", " \n", " (sample sample1) (sample sample2) (sample sample3) (sample sample4)\n", " (sample sample5) (sample sample6)\n", " \n", " (objective objective1) (objective objective2) (objective objective3)\n", " (objective objective4)\n", " \n", " (can-move waypoint1 waypoint5) (can-move waypoint1 waypoint9)\n", " (can-move waypoint2 waypoint5) (can-move waypoint3 waypoint4) \n", " (can-move waypoint3 waypoint6) (can-move waypoint4 waypoint3) \n", " (can-move waypoint4 waypoint8) (can-move waypoint4 waypoint9)\n", " (can-move waypoint5 waypoint1) (can-move waypoint5 waypoint2)\n", " (can-move waypoint6 waypoint3) (can-move waypoint6 waypoint7)\n", " (can-move waypoint6 waypoint8) (can-move waypoint7 waypoint6)\n", " (can-move waypoint8 waypoint4) (can-move waypoint8 waypoint6)\n", " (can-move waypoint9 waypoint1) (can-move waypoint9 waypoint4)\n", " \n", " (is-visible objective1 waypoint2) (is-visible objective1 waypoint3)\n", " (is-visible objective1 waypoint4) (is-visible objective2 waypoint5)\n", " (is-visible objective2 waypoint7) (is-visible objective3 waypoint8)\n", " (is-visible objective4 waypoint5) (is-visible objective4 waypoint1)\n", " \n", " \n", " (is-in sample1 waypoint2) (is-in sample2 waypoint3) \n", " (is-in sample3 waypoint9) (is-in sample4 waypoint8)\n", " (is-in sample5 waypoint3) (is-in sample6 waypoint3) \n", " \n", " (is-dropping-dock waypoint7)\n", " \n", " (rover rover1)\n", " (empty rover1)\n", " (at rover1 waypoint6)\n", " )\n", " \n", " (:goal\n", " (and \n", " (stored-sample sample1)\n", " (stored-sample sample2)\n", " (stored-sample sample3)\n", " (stored-sample sample4)\n", " (stored-sample sample5)\n", " (stored-sample sample6)\n", " \n", " (taken-image objective1)\n", " (taken-image objective2)\n", " (taken-image objective3)\n", " (taken-image objective4) \n", " \n", " (at rover1 waypoint1))\n", " )\n", ")\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(move rover1 waypoint6 waypoint3)\n", "(take-image rover1 objective1 waypoint3)\n", "(move rover1 waypoint3 waypoint4)\n", "(move rover1 waypoint4 waypoint8)\n", "(take-image rover1 objective3 waypoint8)\n", "(move rover1 waypoint8 waypoint6)\n", "(move rover1 waypoint6 waypoint7)\n", "(take-image rover1 objective2 waypoint7)\n", "(move rover1 waypoint7 waypoint6)\n", "(move rover1 waypoint6 waypoint3)\n", "(take-sample rover1 sample6 waypoint3)\n", "(move rover1 waypoint3 waypoint6)\n", "(move rover1 waypoint6 waypoint7)\n", "(drop-sample rover1 sample6 waypoint7)\n", "(move rover1 waypoint7 waypoint6)\n", "(move rover1 waypoint6 waypoint3)\n", "(take-sample rover1 sample5 waypoint3)\n", "(move rover1 waypoint3 waypoint6)\n", "(move rover1 waypoint6 waypoint7)\n", "(drop-sample rover1 sample5 waypoint7)\n", "(move rover1 waypoint7 waypoint6)\n", "(move rover1 waypoint6 waypoint3)\n", "(take-sample rover1 sample2 waypoint3)\n", "(move rover1 waypoint3 waypoint6)\n", "(move rover1 waypoint6 waypoint7)\n", "(drop-sample rover1 sample2 waypoint7)\n", "(move rover1 waypoint7 waypoint6)\n", "(move rover1 waypoint6 waypoint3)\n", "(move rover1 waypoint3 waypoint4)\n", "(move rover1 waypoint4 waypoint9)\n", "(move rover1 waypoint9 waypoint1)\n", "(take-image rover1 objective4 waypoint1)\n", "(move rover1 waypoint1 waypoint9)\n", "(take-sample rover1 sample3 waypoint9)\n", "(move rover1 waypoint9 waypoint4)\n", "(move rover1 waypoint4 waypoint3)\n", "(move rover1 waypoint3 waypoint6)\n", "(move rover1 waypoint6 waypoint7)\n", "(drop-sample rover1 sample3 waypoint7)\n", "(move rover1 waypoint7 waypoint6)\n", "(move rover1 waypoint6 waypoint8)\n", "(take-sample rover1 sample4 waypoint8)\n", "(move rover1 waypoint8 waypoint6)\n", "(move rover1 waypoint6 waypoint7)\n", "(drop-sample rover1 sample4 waypoint7)\n", "(move rover1 waypoint7 waypoint6)\n", "(move rover1 waypoint6 waypoint3)\n", "(move rover1 waypoint3 waypoint4)\n", "(move rover1 waypoint4 waypoint9)\n", "(move rover1 waypoint9 waypoint1)\n", "(move rover1 waypoint1 waypoint5)\n", "(move rover1 waypoint5 waypoint2)\n", "(take-sample rover1 sample1 waypoint2)\n", "(move rover1 waypoint2 waypoint5)\n", "(move rover1 waypoint5 waypoint1)\n", "(move rover1 waypoint1 waypoint9)\n", "(move rover1 waypoint9 waypoint4)\n", "(move rover1 waypoint4 waypoint3)\n", "(move rover1 waypoint3 waypoint6)\n", "(move rover1 waypoint6 waypoint7)\n", "(drop-sample rover1 sample1 waypoint7)\n", "(move rover1 waypoint7 waypoint6)\n", "(move rover1 waypoint6 waypoint3)\n", "(move rover1 waypoint3 waypoint4)\n", "(move rover1 waypoint4 waypoint9)\n", "(move rover1 waypoint9 waypoint1)\n" ] } ], "source": [ "import requests, sys\n", "\n", "# Defines domain and problem\n", "data = {'domain': domain,\n", " 'problem': problem}\n", "\n", "# Send data to an online solver, which will return the plan\n", "resp = requests.post('http://solver.planning.domains/solve',\n", " verify=False, json=data).json()\n", "\n", "# Prints the returned plan\n", "print('\\n'.join([act['name'] for act in resp['result']['plan']]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.7.4" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }