You are a helpful assistant to plan a definite task into Directed Acyclic Graph (DAG) for a dual-arm robot.
I will give you the initial environment description:task: ...obj_names: [...]obj_description: ...
You must follow the following criteria:1) Create a DAG based on the task name, considering the task complete when all nodes are executed. The task can be complex but should be broken into simple, reasonable nodes. 2) The node name must select in *List of commands of the API* and follow the description.3) Synthesize the 'edge' of a node, a list of node's indices the precondition of this node. When generating edges, please match the current node with all other nodes to determine if there are any dependencies. When task constrain the order, carefully think which node affected by the order, "grasp" and "put_back" node always has not as the order dependencies of the other nodes.4) Your generated edges are not only the preconditions for the node to be executed, but also preconditions to complete the task objectives. For example, in task: fill cup with coffee, node: switch on coffee machine is a executed precondition for node: switch off coffee machine to execute, and additionally, node: put cup into coffee machine is also a task precondition for node: switch off coffee machine. If this condition is missing, switch off coffee machine may executed before put cup into coffee machine, the container will not filled with coffee, and the task cannot be completed.5) Each node has a node type. "occupy" means the hand remains occupied after the node, and "release" means the object is released after this node, and "operate" means robot manipulate the articulation joint, and "tool use" means robot utilize obj which handling in hand to change the state of target obj whichi is not in hand.6) Each "occupy" node must have a corresponding "release" node, to end the holding state of the object. The node between "occupy" node and "release" node must be "tool use" node. Means the node type should follow this: "occupy" -> "tool use" (optional) -> "release". 7) When two hands are needed to grasp or put an object, use a two-handed node directly instead of two one-handed nodes. For example, use node:grasp pot instead node: grasp pot_handle_left and node: grasp pot_handle_right.8) Ensure the number of arms used matches the "arm_num" term. The "occupy" type nodes in the edge list should not exceed two.9) Enclose all object references in quotes "". These must be in obj_names. Do not introduce new objects or remove any.10) You need to generate as few nodes as possible in order to complete the task as quickly as possible while still being able to reach the end goal. Any node that is not relevant to the completion of the task should not be present.11) After the graph generated, create a task complete node.
List of commands of the API:If node type is occupy:* The following command allows Robot to take an <target-object>: command syntax: grasp <target-object> If node type is release:* The following command allows Robot to put an <object> in or on a <target-object>, the <object> must holding in hand, the <target-object> should not holding in hand: command syntax: - put <object> into <target-object> - put <object> onto <target-object>
* The following command allows Robot to put an <object> back to it original position before grasped if it isn't blocked , the <object> must holding in hand: command syntax: put_back <object>
If node type is operate:* The following command allows Robot to open an <target-object> with a door, a drawer floor, a faucet: command syntax: open <target-object> command syntax: close <target-object> node type: operate
If node type is tool use:* The following command allows Robot to pour a liquid from an <object> into an <target-object>: command syntax: pour <object> into <target_object>
* The following command allows Robot to stir liquid in <target-object> with an <object>. The <target-object> should not holding in hand: command syntax: stir <target-object> with <object>
* The following command allows Robot to wipe <target-object> with an <object>: command syntax: wipe <target-object> with <object>
You should only respond in the format as described below and do not respond anything else:RESPONSE FORMAT: nodes: node_{index=1,2,3...}: type: The type of the node. name: The name of the node. arm_num: The number of arm of the node. edge: The edge list of the node.
Here's an example input and response:INPUT:task: Put the all fruits onto the plate.obj_names: ["apple", "banana", "lemon", "orange", "plate", "table"]obj_description: "apple": type: actor spatial_relationship: "apple" is on "table". "banana": type: actor spatial_relationship: "banana" is on "table". "lemon": type: actor spatial_relationship: "lemon" is on "table". "orange": type: actor spatial_relationship: "orange" is on "table". "plate": type: actor spatial_relationship: "plate" is on "table". "table": type: actor spatial_relationship: "table" is on the ground.
RESPONSE:nodes: node_1: type: occupy name: grasp "apple" arm_num: 1 edge: [] node_2: type: release name: put "apple" onto "plate" arm_num: 1 edge: [1] node_3: type: occupy name: grasp "banana" arm_num: 1 edge: [] node_4: type: release name: put "banana" onto "plate" arm_num: 1 edge: [3] node_5: type: occupy name: grasp "lemon" arm_num: 1 edge: [] node_6: type: release name: put "lemon" onto "plate" arm_num: 1 edge: [5] node_7: type: occupy name: grasp "orange" arm_num: 1 edge: [] node_8: type: release name: put "orange" onto "plate" arm_num: 1 edge: [7] node_9: type: complete name: task complete arm_num: 0 edge: [2,4,6,8]
Now, let's begin:
task: Clean the table. The fruits should into the plate. The table should be wiped by sponge. The cup and sponge should in drawer.obj_names: ["sponge", "mug", "lemon", "apple", "plate", "drawer"]sar_types: [None, None, None, None, None, None, None]obj_description: "sponge": type: actor spatial_relationship: "sponge" is on the "table". "mug": type: actor spatial_relationship: "mug" is on the "table". "lemon": type: actor spatial_relationship: "lemon" is on the "table". "apple": type: actor spatial_relationship: "apple" is on the "table". "plate": type: actor spatial_relationship: "plate" is on the "table". It can't be grasped. "drawer": type: articulation spatial_relationship: "drawer" is on the "table". "drawer" has a "drawer", "drawer" is closed now. link: ["drawer"]