in Luminous4Alfred/TaskSolver/Algorithms/AlfredAgent.cs [276:612]
public void ParseTaskJson(bool deleteUnsucceeful = true) {
//initialize traj json
actionList.Clear();
trajJson = new TrajJson();
//scene object record
RecordObjLocationsAndPDDL();
//load json
JObject jsonRule = JObject.Parse(File.ReadAllText(taskJsonPath));
//set folder
string taskDesc = (string)jsonRule["task_desc"];
string taskFolder = taskDesc.Split('/')[0] + taskSuffix;
string trialFolder = taskDesc.Split('/')[1];
if (!System.IO.Directory.Exists(System.IO.Path.Combine(saveRoot, taskFolder))) {
System.IO.Directory.CreateDirectory(System.IO.Path.Combine(saveRoot, taskFolder));
}
string trajFolder = System.IO.Path.Combine(saveRoot, taskFolder, trialFolder);
if (!Directory.Exists(trajFolder)) {
System.IO.Directory.CreateDirectory(trajFolder);
}
string rawImageFolder = System.IO.Path.Combine(trajFolder, "raw_images");
if (!Directory.Exists(rawImageFolder)) {
System.IO.Directory.CreateDirectory(rawImageFolder);
}
try {
//resolve initial image
LookDown();
LookDown();
RecordFrame(0, rawImageFolder);
ImageJson imageJsonInit = new ImageJson();
imageJsonInit.low_idx = 0;
imageJsonInit.high_idx = 0;
imageJsonInit.image_name = 0.ToString("D9") + ".png";
trajJson.images.Add(imageJsonInit);
//Get agent init poses
AgentInitInfo agentMeta = trajJson.scene.init_action;
agentMeta.rotation = (int)PhysicsController.transform.eulerAngles.y;
float cameraX = PhysicsController.m_Camera.transform.rotation.eulerAngles.x;
agentMeta.horizon = (int)(cameraX > 180 ? cameraX - 360 : cameraX);
agentMeta.x = PhysicsController.transform.position.x;
agentMeta.y = PhysicsController.transform.position.y;
agentMeta.z = PhysicsController.transform.position.z;
//initial look down event
LookDown();
RecordFrame(1, rawImageFolder);
ImageJson imageJsonLookDown = new ImageJson();
imageJsonLookDown.low_idx = 1;
imageJsonLookDown.high_idx = 0;
imageJsonLookDown.image_name = 1.ToString("D9") + ".png";
trajJson.images.Add(imageJsonLookDown);
LowAction low_action_look_down = new LowAction();
low_action_look_down.api_action.action = LowLevelActionType.LookDown.ToString();
low_action_look_down.discrete_action.action = "LookDown_15";
low_action_look_down.high_idx = 0;
trajJson.plan.low_actions.Add(low_action_look_down);
int high_idx = 0;
int low_idx = 2;
foreach (var s in jsonRule["script"]) {
//resolve high level plan
HighPddl high_pddl = new HighPddl();
string actionH = (string)s["action"];
//modify toggle object high description
string MactionH = actionH == "ToggleObjectOn" ? "ToggleObject" : actionH;
high_pddl.discrete_action.action = MactionH;
high_pddl.planner_action.action = MactionH;
high_pddl.high_idx = high_idx;
//this arg for navigation
string args1 = (string)s["name"];
Debug.Log("actionH: " + actionH + "; object: " + args1);
string objectId = GameObject.Find((string)s["name"]).GetComponent<SimObjPhysics>().objectID;
//this arg for high pddl language description
string args2 = (string)jsonRule["high_pddl"][high_idx]["name"];
args2 = args2.Split('_')[0].ToLower();
//args1 = args1.Split('_')[0].ToLower();
high_pddl.discrete_action.args.Add(args2);
trajJson.plan.high_pddl.Add(high_pddl);
actionList.Clear();
List<string> actioInteractionIds = new List<string>();
//resolve low level plan
if (actionH == "GotoLocation") {
Vector3 targetLoc = GameObject.Find((string)s["name"]).transform.position;
if (objectId.Contains("Fridge")) {
//Debug.Log("?????????????Fridge" + targetLoc);
targetLoc = ModifyLastLocation(targetLoc);
//Debug.Log("?????????????Fridge after" + targetLoc);
}
bool final_look_up = false;
if (args2.Contains("floorlamp")) {
final_look_up = true;
}
GoToLocation(targetLoc, low_idx, rawImageFolder, final_look_up);
} else if (actionH == "PickupObject") {
PickUpObject(objectId);
RecordFrame(low_idx, rawImageFolder);
objInHand = args2;
actionList.Add(LowLevelActionType.PickupObject);
actioInteractionIds.Add(objectId);
} else if (actionH == "PutObject") {
if (AlfredDefinitions.NeedOpenObjs.Contains(args2)) {
OpenObject(objectId);
RecordFrame(low_idx, rawImageFolder);
actionList.Add(LowLevelActionType.OpenObject);
actioInteractionIds.Add(objectId);
PutObject(objectId);
RecordFrame(low_idx + 1, rawImageFolder);
high_pddl.discrete_action.args.Insert(0, objInHand);
actionList.Add(LowLevelActionType.PutObject);
actioInteractionIds.Add(objectId);
} else {
PutObject(objectId);
RecordFrame(low_idx, rawImageFolder);
high_pddl.discrete_action.args.Insert(0, objInHand);
actionList.Add(LowLevelActionType.PutObject);
actioInteractionIds.Add(objectId);
}
} else if (actionH == "ToggleObjectOff") {
ToggleObjectOff(objectId);
RecordFrame(low_idx, rawImageFolder);
actioInteractionIds.Add(objectId);
actionList.Add(LowLevelActionType.ToggleObjectOff);
} else if (actionH == "ToggleObjectOn") {
ToggleObjectOn(objectId);
RecordFrame(low_idx, rawImageFolder);
actioInteractionIds.Add(objectId);
actionList.Add(LowLevelActionType.ToggleObjectOn);
} else if (actionH == "CleanObject") {
string sinkId = GameObject.Find("SinkBasin_1").GetComponent<SimObjPhysics>().objectID;
PutObject(sinkId);
RecordFrame(low_idx, rawImageFolder);
actionList.Add(LowLevelActionType.PutObject);
actioInteractionIds.Add(sinkId);
string faucetId = GameObject.Find("Faucet_1").GetComponent<SimObjPhysics>().objectID;
ToggleObjectOn(faucetId);
RecordFrame(low_idx + 1, rawImageFolder);
actionList.Add(LowLevelActionType.ToggleObjectOn);
actioInteractionIds.Add(faucetId);
//set clean
SimObjPhysics objSop = getSimObjectFromId(objectId);
Dirty objDirty = objSop.gameObject.GetComponent<Dirty>();
if (objDirty != null) {
objDirty.ToggleCleanOrDirty();
}
ToggleObjectOff(faucetId);
RecordFrame(low_idx + 2, rawImageFolder);
actionList.Add(LowLevelActionType.ToggleObjectOff);
actioInteractionIds.Add(faucetId);
PickUpObject(objectId);
RecordFrame(low_idx + 3, rawImageFolder);
objInHand = args2;
actionList.Add(LowLevelActionType.PickupObject);
actioInteractionIds.Add(objectId);
} else if (actionH == "CoolObject") {
string fridgeId = GameObject.Find("Fridge_1").GetComponent<SimObjPhysics>().objectID;
OpenObject(fridgeId);
RecordFrame(low_idx, rawImageFolder);
actionList.Add(LowLevelActionType.OpenObject);
actioInteractionIds.Add(fridgeId);
PutObject(fridgeId);
RecordFrame(low_idx + 1, rawImageFolder);
actionList.Add(LowLevelActionType.PutObject);
actioInteractionIds.Add(fridgeId);
CloseObject(fridgeId);
RecordFrame(low_idx + 2, rawImageFolder);
actionList.Add(LowLevelActionType.CloseObject);
actioInteractionIds.Add(fridgeId);
OpenObject(fridgeId);
RecordFrame(low_idx + 3, rawImageFolder);
actionList.Add(LowLevelActionType.OpenObject);
actioInteractionIds.Add(fridgeId);
PickUpObject(objectId);
RecordFrame(low_idx + 4, rawImageFolder);
objInHand = args2;
actionList.Add(LowLevelActionType.PickupObject);
actioInteractionIds.Add(objectId);
CloseObject(fridgeId);
RecordFrame(low_idx + 5, rawImageFolder);
actionList.Add(LowLevelActionType.CloseObject);
actioInteractionIds.Add(fridgeId);
} else if (actionH == "HeatObject") {
string microwaveId = GameObject.Find("Microwave_1").GetComponent<SimObjPhysics>().objectID;
OpenObject(microwaveId);
RecordFrame(low_idx, rawImageFolder);
actionList.Add(LowLevelActionType.OpenObject);
actioInteractionIds.Add(microwaveId);
PutObject(microwaveId);
RecordFrame(low_idx + 1, rawImageFolder);
actionList.Add(LowLevelActionType.PutObject);
actioInteractionIds.Add(microwaveId);
CloseObject(microwaveId);
RecordFrame(low_idx + 2, rawImageFolder);
actionList.Add(LowLevelActionType.CloseObject);
actioInteractionIds.Add(microwaveId);
ToggleObjectOn(microwaveId);
RecordFrame(low_idx + 3, rawImageFolder);
actionList.Add(LowLevelActionType.ToggleObjectOn);
actioInteractionIds.Add(microwaveId);
ToggleObjectOff(microwaveId);
RecordFrame(low_idx + 4, rawImageFolder);
actionList.Add(LowLevelActionType.ToggleObjectOff);
actioInteractionIds.Add(microwaveId);
OpenObject(microwaveId);
RecordFrame(low_idx + 5, rawImageFolder);
actionList.Add(LowLevelActionType.OpenObject);
actioInteractionIds.Add(microwaveId);
PickUpObject(objectId);
RecordFrame(low_idx + 6, rawImageFolder);
objInHand = args2;
actionList.Add(LowLevelActionType.PickupObject);
actioInteractionIds.Add(objectId);
CloseObject(microwaveId);
RecordFrame(low_idx + 7, rawImageFolder);
actionList.Add(LowLevelActionType.CloseObject);
actioInteractionIds.Add(microwaveId);
} else if (actionH == "SliceObject") {
//sliceobj
string changeToObjId = getSimObjectFromId(objectId).gameObject.GetComponent<SliceObject>().ObjectToChangeTo.name;
SliceObject(objectId);
RecordFrame(low_idx, rawImageFolder);
actionList.Add(LowLevelActionType.SliceObject);
actioInteractionIds.Add(objectId);
//after slice rename
} else {
throw new ArgumentException("No such action: " + actionH);
}
for (int j = 0; j < actionList.Count; ++j) {
LowLevelActionType actionL = actionList[j];
LowAction low_action = new LowAction();
low_action.api_action.action = actionL.ToString();
if (AlfredDefinitions.ApiActionName2DiscreteActionName.ContainsKey(actionL.ToString())) {
low_action.discrete_action.action = AlfredDefinitions.ApiActionName2DiscreteActionName[actionL.ToString()];
} else {
low_action.discrete_action.action = low_action.api_action.action;
}
if (AlfredDefinitions.InteractiveActionType.Contains(actionL)) {
low_action.api_action.objectId = actioInteractionIds[j];
}
low_action.high_idx = high_idx;
trajJson.plan.low_actions.Add(low_action);
//resolve image
ImageJson imageJson = new ImageJson();
imageJson.low_idx = low_idx;
imageJson.high_idx = j == actionList.Count - 1 ? high_idx + 1 : high_idx;
imageJson.image_name = low_idx.ToString("D9") + ".png";
trajJson.images.Add(imageJson);
low_idx++;
if (taskSuccess == false) {
break;
}
}
//update high idx
high_idx++;
}
//save json
using (StreamWriter saveTrajJsonFile = File.CreateText(trajFolder + "/traj_data.json")) {
//remove that last image in traj_json: this is because of the ET format
trajJson.images.RemoveAt(trajJson.images.Count - 1);
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(saveTrajJsonFile, trajJson);
}
} catch (Exception e) {
Debug.LogException(e, this);
taskSuccess = false;
}
//task file: delete data
if (taskSuccess == false && deleteUnsucceeful) {
ClearFolder(trajFolder);
Directory.Delete(trajFolder);
}
taskFinish = true;
}