Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions gripper-ex/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

Gripper with multi-robot, multi-gripper, multi-rooms configuration.

usage: gripper.py [-h] [--seed SEED] balls robots grippers rooms
33 changes: 33 additions & 0 deletions gripper-ex/domain.pddl
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
;; variable number of robots, variable number of grippers per robot
(define (domain gripper-ex-typed)
(:requirements :strips :typing)
(:types room ball gripper robot)
(:predicates (at-robot ?r - robot ?a - room)
(at-ball ?b - ball ?r - room)
(has ?r - robot ?g - gripper)
(free ?g - gripper)
(carry ?b - ball ?g - gripper))

(:action move
:parameters (?from - room ?to - room ?robot - robot)
:precondition (at-robot ?robot ?from)
:effect (and (at-robot ?robot ?to)
(not (at-robot ?robot ?from))))



(:action pick
:parameters (?ball - ball ?room - room ?robot - robot ?gripper - gripper)
:precondition (and (at-ball ?ball ?room) (at-robot ?robot ?room) (has ?robot ?gripper) (free ?gripper))
:effect (and (carry ?ball ?gripper)
(not (at-ball ?ball ?room))
(not (free ?gripper))))


(:action drop
:parameters (?ball - ball ?room - room ?robot - robot ?gripper - gripper)
:precondition (and (at-robot ?robot ?room) (has ?robot ?gripper) (carry ?ball ?gripper))
:effect (and (at-ball ?ball ?room)
(free ?gripper)
(not (carry ?ball ?gripper)))))

60 changes: 60 additions & 0 deletions gripper-ex/gripper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/env python

import argparse
import random
import itertools

parser = argparse.ArgumentParser()

parser.add_argument("balls", type=int, help="the number of balls")
parser.add_argument("robots", type=int, help="the number of robots")
parser.add_argument("grippers", type=int, help="the number of grippers per robot")
parser.add_argument("rooms", type=int, help="the number of rooms")
parser.add_argument("--seed", "-s", type=int, help="random seed")

args = parser.parse_args()

random.seed(args.seed)

robots = [f"robot{i}" for i in range(args.robots)]
rooms = [f"room{i}" for i in range(args.rooms)]
grippers = [f"gripper-{i}-{j}" for i,j in itertools.product(range(args.robots),range(args.grippers))]
balls = [f"ball{i}" for i in range(args.balls)]



def init():
facts = [f"(has robot{i} gripper-{i}-{j}) (free gripper-{i}-{j})"
for i,j in itertools.product(range(args.robots),range(args.grippers))]

for ball in balls:
room = random.choice(rooms)
facts.append(f"(at-ball {ball} {room})")
for robot in robots:
room = random.choice(rooms)
facts.append(f"(at-robot {robot} {room})")

return " ".join(facts)


def goal():
facts = []

for ball in balls:
room = random.choice(rooms)
facts.append(f"(at-ball {ball} {room})")

return " ".join(facts)


print("(define (problem gripper)")
print(" (:domain gripper-ex-typed)")
print(" (:objects "
+ " ".join(
robots + ["-", "robot"] +
rooms + ["-", "room"] +
grippers + ["-", "gripper"] +
balls + ["-", "ball"])
+ ")")
print(" (:init " + init() + ")")
print(" (:goal " + goal() + "))")