18 #include <boost/filesystem.hpp> 22 Eigen::Vector3d transformPoint(
const Eigen::Vector3d &pt,
const double &scale,
const Eigen::Vector3d &ref_transf)
24 return (pt * scale + ref_transf);
27 void scalePoseMsg(
const double& scale, geometry_msgs::Pose& p)
29 p.position.x *= scale;
30 p.position.y *= scale;
31 p.position.z *= scale;
34 void scalePoseFramefabMsg(
const double& scale, choreo_msgs::Grasp& g)
36 scalePoseMsg(scale, g.pick_grasp_pose);
37 scalePoseMsg(scale, g.pick_grasp_approach_pose);
38 scalePoseMsg(scale, g.pick_grasp_retreat_pose);
40 scalePoseMsg(scale, g.place_grasp_pose);
41 scalePoseMsg(scale, g.place_grasp_approach_pose);
42 scalePoseMsg(scale, g.place_grasp_retreat_pose);
49 ref_pt_ = Eigen::Vector3d(0, 0, 0);
55 choreo_msgs::ModelInputParameters model_params,
56 choreo_msgs::TaskSequenceInputParameters task_sequence_params,
57 std::string world_frame)
66 case choreo_msgs::ModelInputParameters::MILLIMETER:
71 case choreo_msgs::ModelInputParameters::CENTIMETER:
76 case choreo_msgs::ModelInputParameters::INCH:
81 case choreo_msgs::ModelInputParameters::FOOT:
88 ROS_ERROR(
"Unrecognized Unit type in Model Input Parameters!");
106 const choreo_msgs::ModelInputParameters& model_params,
107 const choreo_msgs::TaskSequenceInputParameters& task_sequence_params,
108 const std::string& world_frame,
109 choreo_msgs::AssemblySequencePickNPlace& as_pnp)
111 this->
setParams(model_params, task_sequence_params, world_frame);
117 const std::string json_whole_path = task_sequence_params.file_path;
118 boost::filesystem::path boost_json_path(json_whole_path);
120 FILE* fp = fopen(json_whole_path.c_str(),
"r");
124 char readBuffer[65536];
131 ROS_ERROR_STREAM(
"TaskSequenceProcessor has ERROR parsing the input json file!");
137 assert(document.HasMember(
"assembly_type"));
138 std::string at = document[
"assembly_type"].GetString();
141 as_pnp.assembly_type = at;
143 assert(document.HasMember(
"element_number"));
144 int e_num = document[
"element_number"].GetInt();
147 as_pnp.element_number = e_num;
149 assert(document.HasMember(
"pick_base_center_point"));
150 assert(document.HasMember(
"place_base_center_point"));
151 const Value& pick_bcp = document[
"pick_base_center_point"];
152 const Value& place_bcp = document[
"place_base_center_point"];
153 Eigen::Vector3d pick_base_center_pt(pick_bcp[
"X"].GetDouble(), pick_bcp[
"Y"].GetDouble(), pick_bcp[
"Z"].GetDouble());
155 Eigen::Vector3d place_base_center_pt(place_bcp[
"X"].GetDouble(), place_bcp[
"Y"].GetDouble(), place_bcp[
"Z"].GetDouble());
163 as_pnp.file_path = boost_json_path.parent_path().string() + boost::filesystem::path::preferred_separator;
166 assert(document.HasMember(
"pick_support_surface_file_names"));
167 assert(document[
"pick_support_surface_file_names"].IsArray());
168 as_pnp.pick_support_surface_file_names.clear();
169 for(
int i=0; i<document[
"pick_support_surface_file_names"].Size();i++)
171 as_pnp.pick_support_surface_file_names.push_back(document[
"pick_support_surface_file_names"][i].GetString());
174 assert(document.HasMember(
"place_support_surface_file_names"));
175 assert(document[
"place_support_surface_file_names"].IsArray());
176 as_pnp.place_support_surface_file_names.clear();
177 for(
int i=0; i<document[
"place_support_surface_file_names"].Size();i++)
179 as_pnp.place_support_surface_file_names.push_back(document[
"place_support_surface_file_names"][i].GetString());
182 if(0 == document[
"place_support_surface_file_names"].Size()
183 || 0 == document[
"pick_support_surface_file_names"].Size())
185 ROS_WARN_STREAM(
"task sequence processing: no pick and place support surfaces are found!");
188 assert(document.HasMember(
"sequenced_elements"));
189 const Value& se_array = document[
"sequenced_elements"];
190 assert(se_array.Size() > 0);
192 as_pnp.sequenced_elements.clear();
194 for (
SizeType i = 0; i < se_array.Size(); i++)
196 choreo_msgs::SequencedElement se_msg;
198 const Value& se = se_array[i];
200 assert(se.HasMember(
"order_id"));
201 se_msg.order_id = se[
"order_id"].GetInt();
205 se_msg.file_path = boost_json_path.parent_path().string() + boost::filesystem::path::preferred_separator;
207 assert(se.HasMember(
"pick_element_geometry_file_name"));
208 se_msg.pick_element_geometry_file_name = se[
"pick_element_geometry_file_name"].GetString();
210 assert(boost::filesystem::exists(se_msg.file_path + se_msg.pick_element_geometry_file_name));
212 assert(se.HasMember(
"place_element_geometry_file_name"));
213 se_msg.place_element_geometry_file_name = se[
"place_element_geometry_file_name"].GetString();
214 assert(boost::filesystem::exists(se_msg.file_path + se_msg.place_element_geometry_file_name));
216 if(se.HasMember(
"pick_support_surface_file_names"))
218 const Value& pick_surf_names = se[
"pick_support_surface_file_names"];
219 assert(pick_surf_names.IsArray());
220 se_msg.pick_support_surface_file_names.clear();
222 for (
SizeType j=0; j<pick_surf_names.Size(); j++)
224 assert(pick_surf_names[j].IsString());
225 assert(boost::filesystem::exists(se_msg.file_path + std::string(pick_surf_names[j].GetString())));
226 se_msg.pick_support_surface_file_names.push_back(std::string(pick_surf_names[j].GetString()));
230 if(se.HasMember(
"place_support_surface_file_names"))
232 const Value &place_surf_names = se[
"place_support_surface_file_names"];
233 assert(place_surf_names.IsArray());
234 se_msg.place_support_surface_file_names.clear();
236 for (
SizeType j=0; j<place_surf_names.Size(); j++)
238 assert(place_surf_names[j].IsString());
239 assert(boost::filesystem::exists(se_msg.file_path + std::string(place_surf_names[j].GetString())));
240 se_msg.place_support_surface_file_names.push_back(std::string(place_surf_names[j].GetString()));
244 if(se.HasMember(
"pick_contact_ngh_ids"))
246 const Value &pick_ngh_ids = se[
"pick_contact_ngh_ids"];
247 assert(pick_ngh_ids.IsArray());
248 se_msg.pick_contact_ngh_ids.clear();
250 for (
SizeType j=0; j<pick_ngh_ids.Size(); j++)
252 assert(pick_ngh_ids[j].IsInt());
253 se_msg.pick_contact_ngh_ids.push_back(pick_ngh_ids[j].GetInt());
257 if(se.HasMember(
"place_contact_ngh_ids"))
259 const Value &place_ngh_ids = se[
"place_contact_ngh_ids"];
260 assert(place_ngh_ids.IsArray());
261 se_msg.place_contact_ngh_ids.clear();
263 for (
SizeType j=0; j<place_ngh_ids.Size(); j++)
265 assert(place_ngh_ids[j].IsInt());
266 se_msg.place_contact_ngh_ids.push_back(place_ngh_ids[j].GetInt());
271 assert(se.HasMember(
"grasps"));
272 assert(se[
"grasps"].IsArray() && se[
"grasps"].Size() > 0);
274 se_msg.grasps.clear();
276 for(
SizeType j=0; j<se[
"grasps"].Size(); j++)
278 choreo_msgs::Grasp g_msg;
283 se_msg.grasps.push_back(g_msg);
286 as_pnp.sequenced_elements.push_back(se_msg);
291 ROS_INFO_STREAM(
"[task sequence processor] assembly sequence [PICKNPLCAE] json parsing succeeded.");
302 FILE* fp = fopen(fpath.c_str(),
"r");
310 char readBuffer[65536];
317 ROS_ERROR_STREAM(
"TaskSequenceProcessor has ERROR parsing the input json file!");
323 assert(document.HasMember(
"element_number"));
324 int m = document[
"element_number"].GetInt();
326 assert(document.HasMember(
"base_center_pt"));
327 const Value& bcp = document[
"base_center_pt"];
328 Eigen::Vector3d base_center_pt(bcp[0].GetDouble(), bcp[1].GetDouble(), bcp[2].GetDouble());
338 assert(document.HasMember(
"sequenced_elements"));
339 const Value& process_path_array = document[
"sequenced_elements"];
340 assert(process_path_array.IsArray());
344 for (
SizeType i = 0; i < process_path_array.Size(); i++)
346 const Value& element_path = process_path_array[i];
348 assert(element_path.HasMember(
"start_pt"));
349 Eigen::Vector3d st_pt(element_path[
"start_pt"][0].GetDouble(),
350 element_path[
"start_pt"][1].GetDouble(),
351 element_path[
"start_pt"][2].GetDouble());
353 assert(element_path.HasMember(
"end_pt"));
354 Eigen::Vector3d end_pt(element_path[
"end_pt"][0].GetDouble(),
355 element_path[
"end_pt"][1].GetDouble(),
356 element_path[
"end_pt"][2].GetDouble());
358 assert(element_path.HasMember(
"type"));
359 std::string type_str = element_path[
"type"].GetString();
361 assert(element_path.HasMember(
"wireframe_id"));
362 int wireframe_id = element_path[
"wireframe_id"].GetInt();
373 std::vector<Eigen::Vector3d> feasible_orients;
375 assert(element_path.HasMember(
"feasible_orientation"));
376 const Value& f_orients = element_path[
"feasible_orientation"];
377 assert(f_orients.IsArray());
379 for(
SizeType j = 0; j < f_orients.Size(); j++)
381 Eigen::Vector3d f_vec(f_orients[j][0].GetDouble(),
382 f_orients[j][1].GetDouble(),
383 f_orients[j][2].GetDouble());
384 feasible_orients.push_back(f_vec);
397 ROS_INFO_STREAM(
"[task sequence processor] task sequence json [spatial extrusion] parsing succeeded.");
407 moveit_msgs::CollisionObject collision_env_obj;
408 std::string env_obj_id =
"env_obj_table";
418 ref_pt_[2] * unit_scale_ - dz/2)
419 * Eigen::AngleAxisd(0, Eigen::Vector3d::UnitX())
420 * Eigen::AngleAxisd(0, Eigen::Vector3d::UnitY())
421 * Eigen::AngleAxisd(0, Eigen::Vector3d::UnitZ());
422 geometry_msgs::Pose pose;
425 collision_env_obj.id = env_obj_id;
427 collision_env_obj.operation = moveit_msgs::CollisionObject::ADD;
429 shape_msgs::SolidPrimitive env_obj_solid;
430 env_obj_solid.type = shape_msgs::SolidPrimitive::BOX;
431 env_obj_solid.dimensions.resize(3);
432 env_obj_solid.dimensions[0] = dx;
433 env_obj_solid.dimensions[1] = dy;
434 env_obj_solid.dimensions[2] = dz;
435 collision_env_obj.primitives.push_back(env_obj_solid);
436 collision_env_obj.primitive_poses.push_back(pose);
444 int index,
int wireframe_id,
445 Eigen::Vector3d st_pt, Eigen::Vector3d end_pt,
446 std::vector<Eigen::Vector3d> feasible_orients,
447 std::string type_str,
448 double element_diameter,
449 double shrink_length)
455 feasible_orients, type_str, element_diameter, shrink_length,
world_frame_);
void setParams(choreo_msgs::ModelInputParameters model_params, choreo_msgs::TaskSequenceInputParameters task_sequence_params, std::string world_frame)
std::vector< choreo_task_sequence_processing_utils::UnitProcess > path_array_
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
void poseEigenToMsg(const Eigen::Affine3d &e, geometry_msgs::Pose &m)
void setTransfVec(const Eigen::Vector3d &ref_pt, const Eigen::Vector3d &base_center_pt, const double &scale)
bool createCandidatePoses()
void jsonToGraspFrameFabMsg(const rapidjson::Value &json, choreo_msgs::Grasp &g)
bool parseAssemblySequencePickNPlace(const choreo_msgs::ModelInputParameters &model_params, const choreo_msgs::TaskSequenceInputParameters &task_sequence_params, const std::string &world_frame_, choreo_msgs::AssemblySequencePickNPlace &as_pnp)
choreo_task_sequence_processing_utils::UnitProcess createScaledUnitProcess(int index, int wireframe_id, Eigen::Vector3d st_pt, Eigen::Vector3d end_pt, std::vector< Eigen::Vector3d > feasible_orients, std::string type_str, double element_diameter, double shrink_length)
#define ROS_WARN_STREAM(args)
choreo_msgs::TaskSequenceInputParameters path_input_params_
void pointEigenToMsg(const Eigen::Vector3d &e, geometry_msgs::Point &m)
#define ROS_INFO_STREAM(args)
#define ROS_ERROR_STREAM(args)
bool createEnvCollisionObjs()
choreo_msgs::ModelInputParameters model_input_params_
Eigen::Vector3d transf_vec_
bool HasParseError() const
std::vector< moveit_msgs::CollisionObject > env_collision_objs_
GenericDocument & ParseStream(InputStream &is)