Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <boost/algorithm/string.hpp>
00038 #include <ros/ros.h>
00039 #include <vector>
00040 #include "urdf/model.h"
00041 #include <fstream>
00042 #include <iostream>
00043
00044 namespace urdf{
00045
00046 bool IsColladaData(const std::string& data)
00047 {
00048 return data.find("<COLLADA") != std::string::npos;
00049 }
00050
00051
00052 bool Model::initFile(const std::string& filename)
00053 {
00054
00055
00056 std::string xml_string;
00057 std::fstream xml_file(filename.c_str(), std::fstream::in);
00058 if (xml_file.is_open())
00059 {
00060 while ( xml_file.good() )
00061 {
00062 std::string line;
00063 std::getline( xml_file, line);
00064 xml_string += (line + "\n");
00065 }
00066 xml_file.close();
00067 return Model::initString(xml_string);
00068 }
00069 else
00070 {
00071 ROS_ERROR("Could not open file [%s] for parsing.",filename.c_str());
00072 return false;
00073 }
00074
00075 }
00076
00077
00078 bool Model::initParam(const std::string& param)
00079 {
00080 ros::NodeHandle nh;
00081 std::string xml_string;
00082
00083
00084 std::string full_param;
00085 if (!nh.searchParam(param, full_param)){
00086 ROS_ERROR("Could not find parameter %s on parameter server", param.c_str());
00087 return false;
00088 }
00089
00090
00091 if (!nh.getParam(full_param, xml_string)){
00092 ROS_ERROR("Could not read parameter %s on parameter server", full_param.c_str());
00093 return false;
00094 }
00095 return Model::initString(xml_string);
00096 }
00097
00098 bool Model::initXml(TiXmlDocument *xml_doc)
00099 {
00100 if (!xml_doc)
00101 {
00102 ROS_ERROR("Could not parse the xml document");
00103 return false;
00104 }
00105
00106 std::stringstream ss;
00107 ss << *xml_doc;
00108
00109 return Model::initString(ss.str());
00110 }
00111
00112 bool Model::initXml(TiXmlElement *robot_xml)
00113 {
00114 if (!robot_xml)
00115 {
00116 ROS_ERROR("Could not parse the xml element");
00117 return false;
00118 }
00119
00120 std::stringstream ss;
00121 ss << (*robot_xml);
00122
00123 return Model::initString(ss.str());
00124 }
00125
00126 bool Model::initString(const std::string& xml_string)
00127 {
00128 boost::shared_ptr<ModelInterface> model;
00129
00130
00131 if( IsColladaData(xml_string) ) {
00132 ROS_DEBUG("Parsing robot collada xml string");
00133 model = parseCollada(xml_string);
00134 }
00135 else {
00136 ROS_DEBUG("Parsing robot urdf xml string");
00137 model = parseURDF(xml_string);
00138 }
00139
00140
00141 if (model){
00142 this->links_ = model->links_;
00143 this->joints_ = model->joints_;
00144 this->materials_ = model->materials_;
00145 this->name_ = model->name_;
00146 this->root_link_ = model->root_link_;
00147 return true;
00148 }
00149 else
00150 return false;
00151 }
00152
00153
00154
00155 }