object_descriptor.cpp
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                                     //axis_1 invalid
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                                         //axis_2 invalid
00102                                         return;
00103                                     }
00104                                 }
00105                             } else {
00106                                 //no axes node
00107                                 return;
00108                             }
00109                         }
00110                         if ((int)(axes.size()) != rotation_model_type_) {
00111                             //axes creation error
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                             //invalid bounding box
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 }


asr_descriptor_surface_based_recognition
Author(s): Allgeyer Tobias, Hutmacher Robin, Meißner Pascal
autogenerated on Thu Jun 6 2019 17:57:29