Go to the documentation of this file.00001
00021 #include <rviz/mesh_loader.h>
00022
00023 #include <ros/console.h>
00024
00025 #include <boost/lexical_cast.hpp>
00026 #include <ros_uri/ros_uri.hpp>
00027
00028 #include "object_descriptor.h"
00029 #include <rapidxml.hpp>
00030 #include <rapidxml_utils.hpp>
00031 #include "util.h"
00032 #include "rotation_axis.h"
00033
00034
00035 namespace descriptor_surface_based_recognition {
00036
00037 ObjectDescriptor::ObjectDescriptor(std::string folder_path, std::string xml_path, int instance_count, bool use_pose_val) : valid_object_(false), instance_count_(instance_count), use_pose_val_(use_pose_val)
00038 {
00039 std::string package_path = folder_path;
00040 folder_path = ros_uri::absolute_path(folder_path);
00041 try {
00042 rapidxml::file<> xmlFile(xml_path.c_str());
00043 rapidxml::xml_document<> doc;
00044 doc.parse<0>(xmlFile.data());
00045
00046
00047 rapidxml::xml_node<> *first_node = doc.first_node();
00048 if (first_node) {
00049 rapidxml::xml_node<> *node_name = first_node->first_node("name");
00050 rapidxml::xml_node<> *node_surface_model = first_node->first_node("surface_model");
00051 rapidxml::xml_node<> *node_mesh = first_node->first_node("mesh");
00052 rapidxml::xml_node<> *node_rotation_type = first_node->first_node("rotation_model_type");
00053 rapidxml::xml_node<> *node_orientation = first_node->first_node("model_orientation");
00054 rapidxml::xml_node<> *node_diameter = first_node->first_node("diameter");
00055 rapidxml::xml_node<> *node_score3D = first_node->first_node("score3D");
00056 rapidxml::xml_node<> *node_desc_models = first_node->first_node("descriptor_models");
00057
00058
00059 if (node_name && node_surface_model && node_mesh && node_rotation_type && node_orientation && node_diameter && node_score3D && node_desc_models) {
00060
00061 name_ = node_name->value();
00062 surface_model_ = HalconCpp::HSurfaceModel((folder_path + node_surface_model->value()).c_str());
00063
00064 mesh_name_ = package_path + node_mesh->value();
00065 rotation_model_type_ = boost::lexical_cast<int>(node_rotation_type->value());
00066 orientation_ = parseStringVector(node_orientation->value(), " ,");
00067 diameter_ = boost::lexical_cast<double>(node_diameter->value());
00068 score_3D_ = boost::lexical_cast<double>(node_score3D->value());
00069 std::vector<ObjectViewDescriptor> object_descs;
00070 for (rapidxml::xml_node<> *node_desc_model = node_desc_models->first_node("descriptor_model"); node_desc_model; node_desc_model = node_desc_model->next_sibling("descriptor_model")) {
00071 rapidxml::xml_node<> *node_desc_model_name = node_desc_model->first_node("name");
00072 rapidxml::xml_node<> *node_desc_model_orientation = node_desc_model->first_node("view_orientation");
00073 rapidxml::xml_node<> *node_desc_model_score2D = node_desc_model->first_node("score2D");
00074 rapidxml::xml_node<> *node_desc_model_use_color = node_desc_model->first_node("use_color");
00075 rapidxml::xml_node<> *node_desc_model_vertical_offset = node_desc_model->first_node("vertical_texture_offset");
00076 rapidxml::xml_node<> *node_desc_model_horizontal_offset = node_desc_model->first_node("horizontal_texture_offset");
00077 rapidxml::xml_node<> *node_desc_model_invertible = node_desc_model->first_node("invertible");
00078 rapidxml::xml_node<> *node_desc_model_bounding_box = node_desc_model->first_node("bounding_box");
00079 if (node_desc_model_name && node_desc_model_orientation && node_desc_model_score2D && node_desc_model_use_color && node_desc_model_use_color && node_desc_model_vertical_offset && node_desc_model_horizontal_offset && node_desc_model_invertible && node_desc_model_bounding_box) {
00080 std::vector<RotationAxis> axes;
00081 std::vector<Eigen::Vector2i> box_corners;
00082 if (rotation_model_type_ != ROTATION_MODEL_NONE) {
00083 rapidxml::xml_node<> *node_desc_model_axes = node_desc_model->first_node("rotation_axes");
00084 if (node_desc_model_axes) {
00085 rapidxml::xml_node<> *axis_1 = node_desc_model_axes->first_node("axis_1");
00086 if (axis_1 && axis_1->first_attribute("angle")) {
00087 double angle_1 = boost::lexical_cast<double>(axis_1->first_attribute("angle")->value());
00088 RotationAxis rot_axis_1(angle_1, parseStringVector(axis_1->value(), " ,"));
00089 axes.push_back(rot_axis_1);
00090 } else {
00091
00092 return;
00093 }
00094 if (rotation_model_type_ == ROTATION_MODEL_SPHERE) {
00095 rapidxml::xml_node<> *axis_2 = node_desc_model_axes->first_node("axis_2");
00096 if (axis_2 && axis_2->first_attribute("angle")) {
00097 double angle_2 = boost::lexical_cast<double>(axis_2->first_attribute("angle")->value());
00098 RotationAxis rot_axis_2(angle_2, parseStringVector(axis_2->value(), " ,"));
00099 axes.push_back(rot_axis_2);
00100 } else {
00101
00102 return;
00103 }
00104 }
00105 } else {
00106
00107 return;
00108 }
00109 }
00110 if ((int)(axes.size()) != rotation_model_type_) {
00111
00112 return;
00113 }
00114
00115 for (rapidxml::xml_node<> *node_corner_point = node_desc_model_bounding_box->first_node("corner_point"); node_corner_point; node_corner_point = node_corner_point->next_sibling("corner_point")) {
00116 box_corners.push_back(parseStringVector2i(node_corner_point->value(), " ,"));
00117 }
00118 if (box_corners.size() != 4) {
00119
00120 return;
00121 }
00122
00123 HalconCpp::HDescriptorModel desc_mdl((folder_path + node_desc_model_name->value()).c_str());
00124 Eigen::Vector3d desc_orientation = parseStringVector(node_desc_model_orientation->value(), " ,");
00125 double desc_score2D = boost::lexical_cast<double>(node_desc_model_score2D->value());
00126 bool desc_use_color = boost::lexical_cast<bool>(node_desc_model_use_color->value());
00127 int desc_vertical_offset = boost::lexical_cast<int>(node_desc_model_vertical_offset->value());
00128 int desc_horizontal_offset = boost::lexical_cast<int>(node_desc_model_horizontal_offset->value());
00129 bool desc_invertible = boost::lexical_cast<bool>(node_desc_model_invertible->value());
00130 object_descs.push_back(ObjectViewDescriptor(desc_mdl, desc_orientation, desc_score2D, desc_use_color, desc_vertical_offset, desc_horizontal_offset, desc_invertible, axes, box_corners));
00131 }
00132 }
00133 model_view_descriptors_ = object_descs;
00134 valid_object_ = true;
00135 } else {
00136 ROS_ERROR_STREAM("Could not create object: " << folder_path << " (node missing)");
00137 }
00138 }
00139 } catch(std::runtime_error err) {
00140 ROS_ERROR_STREAM("Could not create object: " << folder_path << " (XML-parser error)");
00141 } catch(HalconCpp::HException exc) {
00142 ROS_ERROR_STREAM(exc.ErrorText());
00143 ROS_ERROR_STREAM("Could not create object: " << folder_path << " (Halcon error)");
00144 } catch(boost::bad_lexical_cast) {
00145 ROS_ERROR_STREAM("Could not create object: " << folder_path << " (Boost cast error)");
00146 } catch (rapidxml::parse_error err) {
00147 ROS_ERROR_STREAM("Could not create object: " << folder_path << " (XML-parser error)");
00148 }
00149 }
00150
00151 bool ObjectDescriptor::isValid() const { return valid_object_; }
00152
00153 std::string ObjectDescriptor::getName() const { return name_; }
00154
00155 HalconCpp::HSurfaceModel ObjectDescriptor::getSurfaceModel() const { return surface_model_; }
00156
00157 std::string ObjectDescriptor::getMesh() const { return mesh_name_; }
00158
00159 int ObjectDescriptor::getRotationModelType() const { return rotation_model_type_; }
00160
00161 Eigen::Vector3d ObjectDescriptor::getOrientation() const { return orientation_; }
00162
00163 double ObjectDescriptor::getDiameter() const { return diameter_; }
00164
00165 double ObjectDescriptor::getScore3D() const { return score_3D_; }
00166
00167 std::vector<ObjectViewDescriptor> ObjectDescriptor::getModelViewDescriptors() const { return model_view_descriptors_; }
00168
00169 int ObjectDescriptor::getInstanceCount() const { return instance_count_; }
00170
00171 bool ObjectDescriptor::getUsePoseVal() const { return use_pose_val_; }
00172
00173
00174 void ObjectDescriptor::setCount(int count) {
00175 if (count > 0) {
00176 this->instance_count_ = count;
00177 }
00178 }
00179
00180 void ObjectDescriptor::setUsePoseVal(bool usePoseVal) {this->use_pose_val_ = usePoseVal; }
00181
00182 }