15 #include <trajectory_msgs/JointTrajectoryPoint.h> 22 std::string translateProcessType(
const int& process_type_id)
25 switch(process_type_id)
29 return std::string(
"Process");
33 return std::string(
"Retraction");
37 return std::string(
"Transition");
41 ROS_WARN(
"[output processor] Unknown process_type. Save default 'None' type.");
42 return std::string(
"Unknown");
47 std::string translateMainDataType(
const int& main_data_type_id)
50 switch(main_data_type_id)
54 return std::string(
"Joint");
58 return std::string(
"Cartesian");
62 ROS_ERROR(
"[output processor] Unknown process_type. Save default 'Joint' type.");
63 return std::string(
"Joint");
68 std::string translateElementProcessType(
const int& element_process_type_id)
71 switch(element_process_type_id)
75 return std::string(
"Support");
79 return std::string(
"Create");
83 return std::string(
"Connect");
87 return std::string(
"None");
91 return std::string(
"Approach");
95 return std::string(
"Depart");
100 return std::string(
"None");
105 std::string translateAxisName(
const int& axis_id)
111 return std::string(
"x");
115 return std::string(
"y");
119 return std::string(
"z");
131 rapidjson::Document document;
134 document.SetObject();
139 document.AddMember(
"process_num", plans.size(), allocator);
142 Value process_plans_container(rapidjson::kArrayType);
144 for(
const auto& unit_process_plan : plans)
146 rapidjson::Value unit_process_plan_container(rapidjson::kArrayType);
148 for (
const auto &sub_process : unit_process_plan.sub_process_array)
150 rapidjson::Value sub_process_object_container(rapidjson::kObjectType);
153 sub_process_object_container.AddMember(
"parent_unit_process_plan_id", sub_process.unit_process_id, allocator);
156 sub_process_object_container.AddMember(
"sub_process_id", sub_process.sub_process_id, allocator);
159 sub_process_object_container.AddMember(
"process_type",
160 Value().SetString(translateProcessType(sub_process.process_type).c_str(), allocator),
164 sub_process_object_container.AddMember(
"element_process_type",
165 Value().SetString(translateElementProcessType(sub_process.element_process_type).c_str(), allocator),
169 sub_process_object_container.AddMember(
"main_data_type",
170 Value().SetString(translateMainDataType(sub_process.main_data_type).c_str(), allocator),
176 rapidjson::Value joint_array_container(rapidjson::kArrayType);
178 for(
const auto& joint_pt : sub_process.joint_array.points)
180 rapidjson::Value joint_pt_container(rapidjson::kArrayType);
183 for (
const auto& joint_value : joint_pt.positions)
185 joint_pt_container.PushBack(
Value().SetDouble(joint_value), allocator);
188 joint_array_container.PushBack(joint_pt_container, allocator);
191 sub_process_object_container.AddMember(
"joint_array", joint_array_container, allocator);
194 rapidjson::Value TCP_pose_array_container(rapidjson::kArrayType);
196 for(
const auto& TCP_pose_pt : sub_process.TCP_pose_array)
199 rapidjson::Value TCP_pose_pt_container(rapidjson::kObjectType);
204 Eigen::Matrix3d orientation = m.matrix().block<3,3>(0,0);
205 Eigen::Vector3d position = m.matrix().col(3).head<3>();
208 for(
int i=0; i < 3; i++)
210 rapidjson::Value axis_vector3d_container(rapidjson::kArrayType);
212 for (
int j = 0; j < 3; j++)
215 axis_vector3d_container.PushBack(
Value().SetDouble(orientation.col(i)[j]), allocator);
218 std::string axis_name =
"axis_" + translateAxisName(i);
219 TCP_pose_pt_container.AddMember(
Value().SetString(axis_name.c_str(), allocator), axis_vector3d_container, allocator);
223 rapidjson::Value TCP_origin_container(rapidjson::kArrayType);
224 for (
int j = 0; j < 3; j++)
226 TCP_origin_container.PushBack(
Value().SetDouble(position[j]), allocator);
228 TCP_pose_pt_container.AddMember(
"origin", TCP_origin_container, allocator);
231 TCP_pose_array_container.PushBack(TCP_pose_pt_container, allocator);
234 sub_process_object_container.AddMember(
"TCP_pose_array", TCP_pose_array_container, allocator);
237 unit_process_plan_container.PushBack(sub_process_object_container, allocator);
240 process_plans_container.PushBack(unit_process_plan_container, allocator);
243 document.AddMember(
"process_plans", process_plans_container, allocator);
249 ROS_ERROR(
"[output_processor]: invalid output file path!!!");
252 char writeBuffer[65536];
256 document.Accept(p_writer);
258 std::fclose(js_file);
259 ROS_INFO(
"[output_processor] json output file saved successfully!");
void poseMsgToEigen(const geometry_msgs::Pose &m, Eigen::Affine3d &e)
bool outputJson(std::vector< choreo_msgs::UnitProcessPlan > &plans)
std::string save_file_path_