00001 package edu.tum.cs.ias.knowrob;
00002
00003 import java.io.BufferedInputStream;
00004 import java.io.File;
00005 import java.io.FileInputStream;
00006 import java.io.IOException;
00007 import java.util.ArrayList;
00008 import java.util.Arrays;
00009 import java.util.HashMap;
00010 import java.util.Vector;
00011
00012 import com.google.common.base.CaseFormat;
00013 import com.google.common.base.Joiner;
00014
00015 import net.sf.json.*;
00016 import edu.tum.cs.ias.knowrob.prolog.PrologInterface;
00017 import edu.tum.cs.ias.knowrob.utils.ros.RosUtilities;
00018
00019 public class PlanExporter {
00020
00021
00022 public static final String MAPPING_CONFIG_FILE = "etc/knowrob2cpl.json";
00023
00028 private ArrayList<String> plan;
00029
00033 private JSONObject knowrobToCPL;
00034 private HashMap<String, String> designators;
00035 private Vector<String> designator_order;
00036 private int inst_counter = 100;
00037
00038 public PlanExporter() throws IOException {
00039
00040 designators = new HashMap<String, String>();
00041 designator_order = new Vector<String>();
00042 knowrobToCPL = readCplMapping(RosUtilities.rospackFind("knowrob_actions") + "/" +MAPPING_CONFIG_FILE);
00043 plan = new ArrayList<String>();
00044 }
00045
00046 public String exportPlanToCPL(String plan_name) {
00047
00048 plan_name = PrologInterface.addSingleQuotes(plan_name);
00049 String res = "";
00050
00051 HashMap<String, Vector<String>> plan_steps =
00052 PrologInterface.executeQuery("plan_subevents("+ plan_name +", Steps)");
00053
00054
00055 for(String dottedpairs : (plan_steps.get("Steps"))) {
00056
00057
00058 for(String[] actions: PrologInterface.dottedPairsToArrayList(dottedpairs)) {
00059
00060 for(String action : new ArrayList<String>(Arrays.asList(actions))) {
00061
00062 HashMap<String, Vector<String>> params =
00063 PrologInterface.executeQuery("class_properties("+action+", Prop, Val)");
00064
00065 String obj_desig="", loc_desig="", act_desig="", device="", bodypart="";
00066 String cplAction = knowrobToCpl(action);
00067
00068 for(int i=0;i<params.get("Prop").size();i++) {
00069
00070 String prop = PrologInterface.removeSingleQuotes(params.get("Prop").get(i));
00071 String val = PrologInterface.removeSingleQuotes(params.get("Val").get(i));
00072
00073
00074 if(prop.endsWith("objectActedOn")) {
00075
00076 obj_desig = objectDesignatorFromOWLclass(val);
00077
00078
00079 } else if(prop.endsWith("toLocation") || prop.endsWith("fromLocation")) {
00080
00081
00082 loc_desig = locationDesignatorFromOWLclass(val);
00083
00084
00085 act_desig = actionDesignatorFromOWLclass(action, prop, loc_desig);
00086
00087 } else if(prop.endsWith("deviceUsed")) {
00088 device = val;
00089
00090 } else if(prop.endsWith("bodyPartsUsed")) {
00091 bodypart = val;
00092 }
00093
00094 }
00095
00096
00097 String action_spec = "";
00098 if(cplAction.endsWith("object-in-hand")) {
00099
00100 if(bodypart!=null && bodypart.contains("left")) {
00101 action_spec = "(achieve `(object-in-hand ,"+ obj_desig +" :left))";
00102 } else {
00103 action_spec = "(achieve `(object-in-hand ,"+ obj_desig +" :right))";
00104 }
00105
00106
00107 } else if(cplAction.endsWith("object-placed-at")) {
00108
00109 if(bodypart!=null && bodypart.contains("left")) {
00110 action_spec = "(achieve `(object-placed-at ,"+ obj_desig +" ,"+ loc_desig +" :left))";
00111 } else {
00112 action_spec = "(achieve `(object-placed-at ,"+ obj_desig +" ,"+ loc_desig +" :right))";
00113 }
00114
00115
00116 } else if(cplAction.endsWith("arm-parked")) {
00117 action_spec = "(achieve `(arm-parked ,"+device+"))";
00118
00119
00120 } else if(cplAction.endsWith("open-gripper")) {
00121
00122 String act_desig2 = "unhand-action"+(inst_counter++);
00123 String act_desig2_content = "";
00124 if(bodypart!=null && bodypart.contains("left")) {
00125 act_desig2_content = "("+act_desig2+" (action `((to open-gripper) (side :left))))\n";
00126 } else {
00127 act_desig2_content = "("+act_desig2+" (action `((to open-gripper) (side :right))))\n";
00128 }
00129
00130 action_spec = "(achieve `(arms-at ," + act_desig2 + "))";
00131
00132 if(!designator_order.contains(act_desig2))
00133 designator_order.add(act_desig2);
00134 designators.put(act_desig2, act_desig2_content);
00135
00136 } else if(cplAction.endsWith("close-gripper")) {
00137
00138 String act_desig2 = "unhand-action"+(inst_counter++);
00139 String act_desig2_content = "";
00140 if(bodypart!=null && bodypart.contains("left")) {
00141 act_desig2_content = "("+act_desig2+" (action `((to close-gripper) (side :left))))\n";
00142 } else {
00143 act_desig2_content = "("+act_desig2+" (action `((to close-gripper) (side :right))))\n";
00144 }
00145
00146 action_spec = "(achieve `(arms-at ," + act_desig2 + "))";
00147
00148 if(!designator_order.contains(act_desig2))
00149 designator_order.add(act_desig2);
00150 designators.put(act_desig2, act_desig2_content);
00151
00152
00153 } else if(cplAction.endsWith("arms-at")) {
00154 action_spec = "(achieve `(arms-at ,"+ act_desig +"))";
00155
00156
00157 } else if(cplAction.endsWith("looking-at")) {
00158 action_spec = "(achieve `(looking-at ,"+ loc_desig +"))";
00159
00160
00161 } else if(cplAction.endsWith("perceive-all")) {
00162 action_spec = "(perceive-all ,"+ obj_desig +")";
00163
00164
00165 } else if(cplAction.endsWith("perceive")) {
00166 action_spec = "(perceive ,"+ obj_desig +")";
00167
00168
00169 } else if(cplAction.endsWith("loc")) {
00170 action_spec = "(at-location ("+ loc_desig +"))";
00171 }
00172
00173 plan.add(action_spec);
00174
00175 }
00176
00177 }
00178 }
00179
00180
00181 ArrayList<String> orderedDesigValues = new ArrayList<String>();
00182
00183 for(String key : designator_order)
00184 orderedDesigValues.add(designators.get(key));
00185
00186
00187
00188 res += "(def-top-level-plan " + lispify(plan_name) + " () \n";
00189 res += "(with-designators (\n ";
00190 res += Joiner.on("\n ").join(orderedDesigValues);
00191
00192 res += ")\n\n";
00193
00194 res += Joiner.on("\n").join(plan);
00195
00196 res += "))";
00197
00198 return res;
00199 }
00200
00201
00202
00203
00210 private String objectDesignatorFromOWLclass(String objdef) {
00211
00212
00213 HashMap<String, Vector<String>> types = PrologInterface
00214 .executeQuery("rdf_has(" + PrologInterface.addSingleQuotes(objdef) + ", rdf:type, T)");
00215
00216 String obj_type = "";
00217 String obj_inst = "";
00218 String obj_desig = "";
00219
00220
00221 if (types.get("T") != null && types.get("T").size() > 0) {
00222
00223 obj_type = knowrobToCpl(types.get("T").firstElement());
00224 obj_inst = knowrobToCpl(objdef);
00225 obj_desig = "(" + lispify(obj_inst) + " (object `((name " + knowrobToCpl(obj_inst) + ") (type "+lispify(obj_type)+"))))";
00226
00227 } else {
00228
00229 obj_type = knowrobToCpl(objdef);
00230 obj_inst = knowrobToCpl(instanceFromClass(obj_type));
00231 obj_desig = "(" + lispify(obj_inst) + " (object `((type " + knowrobToCpl(obj_type) + "))))";
00232 }
00233
00234 if(!designator_order.contains(obj_inst))
00235 designator_order.add(obj_inst);
00236
00237 designators.put(obj_inst, obj_desig);
00238
00239 return obj_inst;
00240 }
00241
00242
00243
00244
00245
00246 private String locationDesignatorForObject(String objClass) {
00247
00248
00249 String obj_desig = objectDesignatorFromOWLclass(objClass);
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 return obj_desig;
00260 }
00261
00262
00263
00264
00265
00273 private String locationDesignatorFromOWLclass(String loc) {
00274
00275 HashMap<String, Vector<String>> params = PrologInterface
00276 .executeQuery("class_properties(" + PrologInterface.addSingleQuotes(loc) + ", Prop, Val); " +
00277 "owl_has("+PrologInterface.addSingleQuotes(loc)+", Prop, Val)");
00278
00279
00280 loc = knowrobToCpl(loc);
00281
00282
00283 String loc_desig = "(" + loc + " ";
00284 loc_desig += "(location `(";
00285
00286
00287 if(params!=null && params.get("Prop")!=null) {
00288
00289 for (int i = 0; i < params.get("Prop").size(); i++) {
00290
00291 String prop = PrologInterface.removeSingleQuotes(params.get("Prop").get(i));
00292 String val = params.get("Val").get(i);
00293
00294
00295 HashMap<String, Vector<String>> objtype = PrologInterface
00296 .executeQuery("rdf_has("+PrologInterface.addSingleQuotes(val)+", rdf:type, Type)");
00297
00298 boolean isObject = true;
00299 if(objtype!=null && objtype.get("Type")!=null) {
00300 for (int k = 0; k < objtype.get("Type").size(); k++) {
00301
00302 String type = PrologInterface.removeSingleQuotes(objtype.get("Type").get(k));
00303 if( (type.endsWith("Point3D")) || (type.endsWith("Point2D"))) {
00304 isObject = false;
00305 }
00306 }
00307 }
00308
00309 String desig = "";
00310 if ((prop.endsWith("in-ContGeneric")
00311 || prop.endsWith("in-UnderspecifiedContainer")
00312 || prop.endsWith("into-UnderspecifiedContainer")
00313 || prop.endsWith("from-UnderspecifiedLocation"))) {
00314
00315 if(isObject) {
00316 desig = knowrobToCpl(locationDesignatorForObject(val));
00317 } else {
00318 desig = knowrobToCpl(locationDesignatorFromOWLclass(val));
00319 }
00320
00321 loc_desig += "(in ," + desig + ")";
00322
00323 } else if (prop.endsWith("to-UnderspecifiedLocation")
00324 || prop.endsWith("on-Physical")
00325 || prop.endsWith("aboveOf")
00326 || prop.endsWith("inCenterOf")) {
00327 if(isObject) {
00328 desig = knowrobToCpl(locationDesignatorForObject(val));
00329 } else {
00330 desig = knowrobToCpl(locationDesignatorFromOWLclass(val));
00331 }
00332
00333 loc_desig += "(on ," + desig + ")";
00334
00335 } else if (prop.endsWith("inReachOf") ||
00336 prop.endsWith("inFrontOf-Generally")) {
00337 if(isObject) {
00338 desig = knowrobToCpl(locationDesignatorForObject(val));
00339 } else {
00340 desig = knowrobToCpl(locationDesignatorFromOWLclass(val));
00341 }
00342
00343 loc_desig += "(to reach) (side :right) (loc ," + desig + ")";
00344
00345 } else if (prop.endsWith("visibleFrom")) {
00346 if(isObject) {
00347 desig = knowrobToCpl(locationDesignatorForObject(val));
00348 } else {
00349 desig = knowrobToCpl(locationDesignatorFromOWLclass(val));
00350 }
00351
00352 loc_desig += "(to see ," + desig + ")";
00353
00354 } else if (prop.endsWith("orientation")) {
00355 if(isObject) {
00356 desig = knowrobToCpl(locationDesignatorForObject(val));
00357 } else {
00358 desig = knowrobToCpl(locationDesignatorFromOWLclass(val));
00359 }
00360
00361 loc_desig += "(pose ," + desig + ")";
00362 }
00363
00364 }
00365 }
00366 loc_desig += ")))";
00367
00368 if(!designator_order.contains(loc))
00369 designator_order.add(loc);
00370 designators.put(loc, loc_desig);
00371 return loc;
00372 }
00373
00374
00375
00376 private String actionDesignatorFromOWLclass(String action, String prop, String loc_desig) {
00377
00378 String cplAction = knowrobToCpl(action);
00379 String act_desig = cplAction+(inst_counter++);
00380 String act_descr="";
00381 act_descr += "("+act_desig+" (action `(";
00382
00383
00384
00385 if(cplAction.endsWith("arms-at")) {
00386
00387 act_descr += "(to trajectory) (pose ," + loc_desig + ")";
00388
00389
00390 HashMap<String, Vector<String>> params =
00391 PrologInterface.executeQuery("class_properties("+action+", Prop, Val)");
00392
00393 int idx = params.get("Prop").lastIndexOf(PrologInterface.
00394 addSingleQuotes("http://ias.cs.tum.edu/kb/knowrob.owl#bodyPartsUsed"));
00395
00396 if(idx>-1) {
00397 if(params.get("Val").get(idx).contains("right") ||
00398 params.get("Val").get(idx).contains("Right")) {
00399 act_descr+=" (side :right)";
00400 } else if(params.get("Val").get(idx).contains("left") ||
00401 params.get("Val").get(idx).contains("Left")) {
00402 act_descr+=" (side :left)";
00403 }
00404 }
00405 act_descr+=")))";
00406
00407 if(!designator_order.contains(act_desig))
00408 designator_order.add(act_desig);
00409 designators.put(act_desig, act_descr);
00410
00411 }
00412 return act_desig;
00413
00414 }
00415
00427 private String knowrobToCpl(String val) {
00428
00429 if(knowrobToCPL.containsKey(PrologInterface.valueFromIRI(val))) {
00430 return knowrobToCPL.getString(PrologInterface.valueFromIRI(val));
00431
00432 } else {
00433
00434
00435 HashMap<String, Vector<String>> supercl = PrologInterface.
00436 executeQuery("owl_subclass_of(" + PrologInterface.addSingleQuotes(val) + ", Super)");
00437
00438 for(String sup : supercl.get("Super")) {
00439 if(knowrobToCPL.containsKey(PrologInterface.valueFromIRI(sup))) {
00440 return knowrobToCPL.getString(PrologInterface.valueFromIRI(sup));
00441 }
00442 }
00443 return lispify(val);
00444 }
00445 }
00446
00454 private String lispify(String pl) {
00455
00456
00457 String val = PrologInterface.valueFromIRI(PrologInterface.removeSingleQuotes(pl));
00458 val = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, val);
00459 val = val.replaceAll("--", "_");
00460
00461 return val;
00462 }
00463
00464
00465
00474 public JSONObject readCplMapping(String configFile)
00475 throws java.io.IOException {
00476
00477 byte[] buffer = new byte[(int) new File(configFile).length()];
00478 BufferedInputStream f = null;
00479 try {
00480 f = new BufferedInputStream(new FileInputStream(configFile));
00481 f.read(buffer);
00482 } finally {
00483 if (f != null)
00484 try {
00485 f.close();
00486 } catch (IOException ignored) {
00487 }
00488 }
00489
00490 return (JSONObject) JSONSerializer.toJSON(new String(buffer));
00491 }
00492
00493
00501 private String instanceFromClass(String cl) {
00502 return (cl + (inst_counter++)).toLowerCase();
00503 }
00504
00505
00511 public static void main(String[] args) {
00512
00513 try {
00514
00515 PrologInterface.initJPLProlog("knowrob_actions");
00516 PlanExporter pl = new PlanExporter();
00517 String plan = pl.exportPlanToCPL("http://www.roboearth.org/kb/roboearth.owl#ServeADrink");
00518 System.out.println(plan);
00519
00520 } catch (IOException e) {
00521 e.printStackTrace();
00522 }
00523
00524 }
00525
00526 }