$search
00001 /**************************************************************** 00002 * 00003 * Copyright (c) 2011, 2012 00004 * 00005 * School of Engineering, Cardiff University, UK 00006 * 00007 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00008 * 00009 * Project name: srs EU FP7 (www.srs-project.eu) 00010 * ROS stack name: srs 00011 * ROS package name: srs_knowledge 00012 * Description: 00013 * 00014 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00015 * 00016 * @author Ze Ji, email: jiz1@cf.ac.uk 00017 * 00018 * Date of creation: Oct 2011: 00019 * ToDo: 00020 * 00021 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00022 * 00023 * Redistribution and use in source and binary forms, with or without 00024 * modification, are permitted provided that the following conditions are met: 00025 * 00026 * * Redistributions of source code must retain the above copyright 00027 * notice, this list of conditions and the following disclaimer. 00028 * * Redistributions in binary form must reproduce the above copyright 00029 * notice, this list of conditions and the following disclaimer in the 00030 * documentation and/or other materials provided with the distribution. 00031 * * Neither the name of the school of Engineering, Cardiff University nor 00032 * the names of its contributors may be used to endorse or promote products 00033 * derived from this software without specific prior written permission. 00034 * 00035 * This program is free software: you can redistribute it and/or modify 00036 * it under the terms of the GNU Lesser General Public License LGPL as 00037 * published by the Free Software Foundation, either version 3 of the 00038 * License, or (at your option) any later version. 00039 * 00040 * This program is distributed in the hope that it will be useful, 00041 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00042 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00043 * GNU Lesser General Public License LGPL for more details. 00044 * 00045 * You should have received a copy of the GNU Lesser General Public 00046 * License LGPL along with this program. 00047 * If not, see <http://www.gnu.org/licenses/>. 00048 * 00049 ****************************************************************/ 00050 00051 package org.srs.srs_knowledge.knowledge_engine; 00052 00053 import java.io.*; 00054 import java.util.ArrayList; 00055 import java.util.NoSuchElementException; 00056 import java.util.HashSet; 00057 import java.util.Iterator; 00058 import java.util.Map; 00059 00060 import java.io.StringWriter; 00061 import java.math.BigInteger; 00062 00063 import ros.pkg.srs_knowledge.msg.*; 00064 import ros.pkg.srs_msgs.msg.SRSSpatialInfo; 00065 import ros.pkg.srs_knowledge.srv.PlanNextAction; 00066 import ros.pkg.srs_knowledge.srv.TaskRequest; 00067 import ros.pkg.srs_knowledge.srv.GetObjectsOnMap; 00068 import ros.pkg.srs_knowledge.srv.GetWorkspaceOnMap; 00069 import org.srs.srs_knowledge.task.*; 00070 import ros.pkg.geometry_msgs.msg.Pose2D; 00071 import ros.pkg.geometry_msgs.msg.Pose; 00072 00073 import org.srs.srs_knowledge.utils.*; 00074 00075 import org.json.simple.JSONArray; 00076 import org.json.simple.JSONObject; 00077 import org.json.simple.JSONValue; 00078 import org.json.simple.parser.ParseException; 00079 import org.json.simple.parser.JSONParser; 00080 00081 public class SRSJSONParser 00082 { 00083 00088 public static Task parseJSONToTask(String encodedTask) { 00089 Task t = null; 00090 // {"tasks":[{"time_schedule":1263798000000,"task":"move","destination":{"pose2d_string":"[0 1 3.14]"}}],"initializer":{"device_type":"ui_loc","device_id":"ui_loc_0001"}} 00091 System.out.println("=> decode json: " + encodedTask); 00092 00093 /* 00094 Object obj = JSONValue.parse(encodedTask); 00095 if (obj == null) { 00096 System.out.println("Parsing Json error"); 00097 return null; 00098 } 00099 */ 00100 JSONParser parser = new JSONParser(); 00101 JSONObject task = new JSONObject(); 00102 try { 00103 Object obj = parser.parse(encodedTask); 00104 task = (JSONObject)obj; 00105 } 00106 catch(ParseException pe) { 00107 System.out.println("Parsing Json error at position: " + pe.getPosition()); 00108 System.out.println(pe); 00109 return null; 00110 } 00111 00112 String taskName = (String)task.get("task"); 00113 if(taskName.equals("move")) { 00114 t = parseJSONToMoveTask(task); 00115 } 00116 else if(taskName.equals("get")) { 00117 t = parseJSONToGetTask(task); 00118 } 00119 else if(taskName.equals("fetch")) { 00120 t = parseJSONToFetchTask(task); 00121 } 00122 else if(taskName.equals("search")) { 00123 t = parseJSONToSearchTask(task); 00124 } 00125 else if(taskName.equals("deliver")) { 00126 t = parseJSONToGetTask(task); 00127 } 00128 else if(taskName.equals("stop")) { 00129 t = parseJSONToMoveTask(task); 00130 } 00131 else { 00132 System.out.println("Invalid task type -- error when decoding json task format"); 00133 return t; 00134 } 00135 00136 return t; 00137 } 00138 00139 public static MoveTask parseJSONToMoveTask(JSONObject task) { 00140 MoveTask mt = null; 00141 00142 java.lang.Number time = (java.lang.Number)task.get("time_schedule"); 00143 JSONObject destination = (JSONObject)task.get("destination"); 00144 String dest = ""; 00145 if(destination.containsKey("predefined_pose")) { 00146 dest = (String)destination.get("predefined_pose"); 00147 } 00148 else if(destination.containsKey("pose2d_string")) { 00149 dest = (String)destination.get("pose2d_string"); 00150 } 00151 else if(destination.containsKey("pose2d")) { 00152 JSONObject pose = (JSONObject)destination.get("pose2d"); 00153 double x = ((Number)(pose.get("x"))).doubleValue(); 00154 double y = ((Number)(pose.get("y"))).doubleValue(); 00155 double theta = ((Number)(pose.get("theta"))).doubleValue(); 00156 dest = "[" + x + " " + y + " " + theta + "]"; 00157 } 00158 else { 00159 return null; 00160 } 00161 00162 mt = new MoveTask(dest); 00163 return mt; 00164 } 00165 00166 public static GetObjectTask parseJSONToGetTask(JSONObject task) { 00167 GetObjectTask got = null; 00168 // {"task":"get","object":{"object_type":"Book"}} 00169 try { 00170 JSONObject obj = (JSONObject)task.get("object"); 00171 String objectType = (String)(obj.get("object_type")); 00172 00173 // This should be passed by dm, not read from param server... to minimize the dependence on other packages 00174 String graspType = (String)(task.get("grasping_type")); 00175 ConfigInfo.GraspType graspingType = ConfigInfo.GraspType.MOVE_AND_GRASP; 00176 if(graspType.equals("Simple")) { 00177 graspingType = ConfigInfo.GraspType.MOVE_AND_GRASP; 00178 } 00179 else if(graspType.equals("Planned")) { 00180 graspingType = ConfigInfo.GraspType.JUST_GRASP; 00181 } 00182 System.out.println("---->>> " + graspType); 00183 00184 got = new GetObjectTask(objectType, graspingType); 00185 } 00186 catch(Exception e) { 00187 System.out.println(e.toString()); 00188 } 00189 00190 return got; 00191 } 00192 00193 public static FetchObjectTask parseJSONToFetchTask(JSONObject task) { 00194 FetchObjectTask fot = null; 00195 // {"task":"get","object":{"object_type":"Book"}} 00196 try { 00197 JSONObject obj = (JSONObject)task.get("object"); 00198 String objectType = (String)(obj.get("object_type")); 00199 00200 //String graspType = (String)(obj.get("grasping_type")); 00201 JSONObject deliverDest = (JSONObject)task.get("deliver_destination"); 00202 00203 String dest = ""; 00204 if(deliverDest.containsKey("predefined_pose")) { 00205 dest = (String)deliverDest.get("predefined_pose"); 00206 } 00207 else if(deliverDest.containsKey("pose2d_string")) { 00208 dest = (String)deliverDest.get("pose2d_string"); 00209 } 00210 else if(deliverDest.containsKey("pose2d")) { 00211 JSONObject pose = (JSONObject)deliverDest.get("pose2d"); 00212 double x = ((Number)(pose.get("x"))).doubleValue(); 00213 double y = ((Number)(pose.get("y"))).doubleValue(); 00214 double theta = ((Number)(pose.get("theta"))).doubleValue(); 00215 dest = "[" + x + " " + y + " " + theta + "]"; 00216 } 00217 else { 00218 return null; 00219 } 00220 // This should be passed by dm, not read from param server... to minimize the dependence on other packages 00221 String graspType = (String)task.get("grasping_type"); 00222 System.out.println("graspType --> " + graspType); 00223 00224 ConfigInfo.GraspType graspingType = ConfigInfo.GraspType.MOVE_AND_GRASP; 00225 if(graspType.equals("Simple")) { 00226 graspingType = ConfigInfo.GraspType.MOVE_AND_GRASP; 00227 } 00228 else if(graspType.equals("Planned")) { 00229 graspingType = ConfigInfo.GraspType.JUST_GRASP; 00230 } 00231 00232 System.out.println("graspingType " + graspingType); 00233 fot = new FetchObjectTask(objectType, dest, graspingType); 00234 } 00235 catch(Exception e) { 00236 System.out.println(e.toString()); 00237 } 00238 00239 return fot; 00240 } 00241 00242 public static SearchObjectTask parseJSONToSearchTask(JSONObject task) { 00243 SearchObjectTask sot = null; 00244 00245 try { 00246 JSONObject obj = (JSONObject)task.get("object"); 00247 String objectType = (String)(obj.get("object_type")); 00248 00249 sot = new SearchObjectTask(objectType); 00250 } 00251 catch(Exception e) { 00252 System.out.println(e.toString()); 00253 } 00254 return sot; 00255 } 00256 00257 public static StopTask parseJSONToStopTask(JSONObject task) { 00258 StopTask st = new StopTask(); 00259 return st; 00260 } 00261 00262 public static String encodeMoveAction(String action, double x, double y, double theta) { 00263 JSONObject moveAct = new JSONObject(); 00264 moveAct.put("action", action); 00265 00266 JSONObject dest = new JSONObject(); 00267 dest.put("x", x); 00268 dest.put("y", y); 00269 dest.put("theta", theta); 00270 00271 JSONObject pos = new JSONObject(); 00272 pos.put("pose2d", dest); 00273 00274 moveAct.put("destination", pos); 00275 try { 00276 StringWriter out = new StringWriter(); 00277 moveAct.writeJSONString(out); 00278 String jsonText = out.toString(); 00279 return jsonText; 00280 } 00281 catch(IOException ie) { 00282 System.out.println("IO Exception when writing JSON STRING"); 00283 System.out.println(ie.getMessage()); 00284 return ""; 00285 } 00286 } 00287 00288 public static String encodeCustomAction(String action, Map<String, Object> content) { 00289 JSONObject act = new JSONObject(); 00290 act.put("action", action); 00291 try { 00292 StringWriter out = new StringWriter(); 00293 act.writeJSONString(out); 00294 String jsonText = out.toString(); 00295 return jsonText; 00296 } 00297 catch(IOException ie) { 00298 System.out.println("IO Exception when writing JSON STRING"); 00299 System.out.println(ie.getMessage()); 00300 return ""; 00301 } 00302 } 00303 00304 public static String encodePutOnTrayAction(String action, String moveConfig) { 00305 JSONObject act = new JSONObject(); 00306 act.put("action", action); 00307 act.put("move_config", moveConfig); 00308 try { 00309 StringWriter out = new StringWriter(); 00310 act.writeJSONString(out); 00311 String jsonText = out.toString(); 00312 return jsonText; 00313 } 00314 catch(IOException ie) { 00315 System.out.println("IO Exception when writing JSON STRING"); 00316 System.out.println(ie.getMessage()); 00317 return ""; 00318 } 00319 } 00320 00321 public static String encodeDetectAction(String action, int hhId, String objectType, String workspace) { 00322 JSONObject obj = new JSONObject(); 00323 obj.put("object_type", objectType); 00324 obj.put("object_id", hhId); 00325 obj.put("workspace", workspace); 00326 00327 JSONObject detAct = new JSONObject(); 00328 detAct.put("object", obj); 00329 detAct.put("action", action); 00330 00331 try { 00332 StringWriter out = new StringWriter(); 00333 detAct.writeJSONString(out); 00334 String jsonText = out.toString(); 00335 return jsonText; 00336 } 00337 catch(IOException ie) { 00338 System.out.println("IO Exception when writing JSON STRING"); 00339 System.out.println(ie.getMessage()); 00340 return ""; 00341 } 00342 } 00343 00344 public static String encodeGraspAction(String action, int hhId, String objectType, String workspace) { 00345 JSONObject obj = new JSONObject(); 00346 obj.put("object_type", objectType); 00347 obj.put("object_id", hhId); 00348 if(workspace != null) { 00349 obj.put("workspace", workspace); 00350 } 00351 else { 00352 obj.put("workspace", ""); 00353 } 00354 00355 JSONObject detAct = new JSONObject(); 00356 detAct.put("object", obj); 00357 detAct.put("action", action); 00358 00359 try { 00360 StringWriter out = new StringWriter(); 00361 detAct.writeJSONString(out); 00362 String jsonText = out.toString(); 00363 return jsonText; 00364 } 00365 catch(IOException ie) { 00366 System.out.println("IO Exception when writing JSON STRING"); 00367 System.out.println(ie.getMessage()); 00368 return ""; 00369 } 00370 } 00371 00372 public static String encodeCheckObjectAction(String action, String objectType, double x, double y, double z, double orix, double oriy, double oriz, double oriw, double l, double w, double h) { 00373 JSONObject obj = new JSONObject(); 00374 obj.put("object_type", objectType); 00375 00376 JSONObject pose = new JSONObject(); 00377 JSONObject position = new JSONObject(); 00378 position.put("x", x); 00379 position.put("y", y); 00380 position.put("x", z); 00381 pose.put("position", position); 00382 00383 JSONObject orientation = new JSONObject(); 00384 orientation.put("x", orix); 00385 orientation.put("y", oriy); 00386 orientation.put("z", oriz); 00387 orientation.put("w", oriw); 00388 pose.put("orientation", orientation); 00389 00390 JSONObject dim = new JSONObject(); 00391 dim.put("l", l); 00392 dim.put("w", w); 00393 dim.put("h", h); 00394 00395 obj.put("pose", pose); 00396 obj.put("dimension", dim); 00397 00398 JSONObject checkAct = new JSONObject(); 00399 checkAct.put("object", obj); 00400 checkAct.put("action", action); 00401 00402 try { 00403 StringWriter out = new StringWriter(); 00404 checkAct.writeJSONString(out); 00405 String jsonText = out.toString(); 00406 return jsonText; 00407 } 00408 catch(IOException ie) { 00409 System.out.println("IO Exception when writing JSON STRING"); 00410 System.out.println(ie.getMessage()); 00411 return ""; 00412 } 00413 } 00414 00415 public static JSONObject decodeJsonActionInfo(String jsonActionInfo) { 00416 JSONParser parser = new JSONParser(); 00417 JSONObject actionInfo = new JSONObject(); 00418 try { 00419 Object obj = parser.parse(jsonActionInfo); 00420 actionInfo = (JSONObject)obj; 00421 } 00422 catch(ParseException pe) { 00423 System.out.println("Parsing Json error at position: " + pe.getPosition()); 00424 System.out.println(pe); 00425 return null; 00426 } 00427 00428 return actionInfo; 00429 } 00430 00431 public static String encodeObjectProperties(Map<String, String> pro) 00432 { 00433 return JSONObject.toJSONString(pro); 00434 } 00435 00436 }