bool Model::initString(const std::string& xml_string) { boost::shared_ptr<ModelInterface> model; // necessary for COLLADA compatibility if( IsColladaData(xml_string) ) { ROS_DEBUG("Parsing robot collada xml string"); static boost::mutex PARSER_PLUGIN_LOCK; static boost::scoped_ptr<pluginlib::ClassLoader<urdf::URDFParser> > PARSER_PLUGIN_LOADER; boost::mutex::scoped_lock _(PARSER_PLUGIN_LOCK); try { if (!PARSER_PLUGIN_LOADER) PARSER_PLUGIN_LOADER.reset(new pluginlib::ClassLoader<urdf::URDFParser>("urdf_parser_plugin", "urdf::URDFParser")); const std::vector<std::string> &classes = PARSER_PLUGIN_LOADER->getDeclaredClasses(); bool found = false; for (std::size_t i = 0 ; i < classes.size() ; ++i) if (classes[i].find("urdf/ColladaURDFParser") != std::string::npos) { boost::shared_ptr<urdf::URDFParser> instance = PARSER_PLUGIN_LOADER->createInstance(classes[i]); if (instance) model = instance->parse(xml_string); found = true; break; } if (!found) ROS_ERROR_STREAM("No URDF parser plugin found for Collada files. Did you install the corresponding package?"); } catch(pluginlib::PluginlibException& ex) { ROS_ERROR_STREAM("Exception while creating planning plugin loader " << ex.what() << ". Will not parse Collada file."); } } else { ROS_DEBUG("Parsing robot urdf xml string"); model = parseURDF(xml_string); } // copy data from model into this object if (model){ this->links_ = model->links_; this->joints_ = model->joints_; this->materials_ = model->materials_; this->name_ = model->name_; this->root_link_ = model->root_link_; return true; } else return false; }
/** Initialize the model using an URDF string * @param xml_string The robot description in URDF format * @return true if the model was intialized successfully */ bool Model::initString(const std::string& xml_string) { ModelInterfaceSharedPtr model; if( IsColladaData(xml_string) ) { // currently, support for Collada is not implemented throw URDFColladaNotSupportedException(); } else { model = parseURDF(xml_string); } // copy data from model into this object if (model){ this->links_ = model->links_; this->joints_ = model->joints_; this->materials_ = model->materials_; this->name_ = model->name_; this->root_link_ = model->root_link_; return true; } else return false; }