1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
|
/*
* Copyright 2012 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef SDF_PARSER_HH_
#define SDF_PARSER_HH_
#include <string>
#include "sdf/SDFImpl.hh"
#include "sdf/sdf_config.h"
#include "sdf/system_util.hh"
/// \ingroup sdf_parser
/// \brief namespace for Simulation Description Format parser
///
/// The parsing functions read XML elements contained in either a file or
/// string and translates the XML elements into SDF data structures. This
/// translation finds errors in the provided XML, fills in default values,
/// and performs any necessary version related conversions.
///
/// XML elements that are not part of the SDF specification are copied in
/// place. This preserves the given XML structure and data.
namespace sdf
{
// Inline bracket to help doxygen filtering.
inline namespace SDF_VERSION_NAMESPACE {
//
class Root;
/// \brief Init based on the installed sdf_format.xml file
SDFORMAT_VISIBLE
bool init(SDFPtr _sdf);
/// \brief Initialize the SDF interface using a file
SDFORMAT_VISIBLE
bool initFile(const std::string &_filename, SDFPtr _sdf);
/// \brief Initialize an SDFElement interface using a file
SDFORMAT_VISIBLE
bool initFile(const std::string &_filename, ElementPtr _sdf);
/// \brief Initialize the SDF interface using a string
SDFORMAT_VISIBLE
bool initString(const std::string &_xmlString, SDFPtr _sdf);
/// \brief Populate the SDF values from a file
///
/// This populates the given sdf pointer from a file. If the file is a URDF
/// file it is converted to SDF first. All files are converted to the latest
/// SDF version
/// \param[in] _filename Name of the SDF file
/// \return Populated SDF pointer.
SDFORMAT_VISIBLE
sdf::SDFPtr readFile(const std::string &_filename);
/// \brief Populate the SDF values from a file
///
/// This populates the given sdf pointer from a file. If the file is a URDF
/// file it is converted to SDF first. All files are converted to the latest
/// SDF version
/// \param[in] _filename Name of the SDF file
/// \param[out] _errors Parsing errors will be appended to this variable.
/// \return Populated SDF pointer.
SDFORMAT_VISIBLE
sdf::SDFPtr readFile(const std::string &_filename, Errors &_errors);
/// \brief Populate the SDF values from a file
///
/// This populates the given sdf pointer from a file. If the file is a URDF
/// file it is converted to SDF first. All files are converted to the latest
/// SDF version
/// \param[in] _filename Name of the SDF file
/// \param[in] _sdf Pointer to an SDF object.
/// \param[out] _errors Parsing errors will be appended to this variable.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readFile(const std::string &_filename, SDFPtr _sdf, Errors &_errors);
/// \brief Populate the SDF values from a file without converting to the
/// latest SDF version
///
/// This populates the given sdf pointer from a file. If the file is a URDF
/// file it is converted to SDF first. This function does not convert the
/// loaded SDF to the latest version. Use this function with care, as it may
/// prevent loading of DOM objects from this SDF object.
/// \param[in] _filename Name of the SDF file
/// \param[in] _sdf Pointer to an SDF object.
/// \param[out] _errors Parsing errors will be appended to this variable.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readFileWithoutConversion(
const std::string &_filename, SDFPtr _sdf, Errors &_errors);
/// \brief Populate the SDF values from a file
///
/// This populates the given sdf pointer from a file. If the file is a URDF
/// file it is converted to SDF first. All files are converted to the latest
/// SDF version
/// \param[in] _filename Name of the SDF file
/// \param[in] _sdf Pointer to an SDF object.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readFile(const std::string &_filename, SDFPtr _sdf);
/// \brief Populate the SDF values from a string
///
/// This populates the sdf pointer from a string. If the string is a URDF
/// string it is converted to SDF first. All string are converted to the
/// latest SDF version
/// \param[in] _xmlString XML string to be parsed.
/// \param[in] _sdf Pointer to an SDF object.
/// \param[out] _errors Parsing errors will be appended to this variable.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readString(const std::string &_xmlString, SDFPtr _sdf, Errors &_errors);
/// \brief Populate the SDF values from a string
///
/// This populates the sdf pointer from a string. If the string is a URDF
/// string it is converted to SDF first. All string are converted to the
/// latest SDF version
/// \param[in] _xmlString XML string to be parsed.
/// \param[in] _sdf Pointer to an SDF object.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readString(const std::string &_xmlString, SDFPtr _sdf);
/// \brief Populate the SDF values from a string
///
/// This populates the sdf pointer from a string. If the string is a URDF
/// string it is converted to SDF first. All strings are converted to the
/// latest SDF version
/// \param[in] _xmlString XML string to be parsed.
/// \param[in] _sdf Pointer to an SDF object.
/// \param[out] _errors Parsing errors will be appended to this variable.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readString(const std::string &_xmlString, ElementPtr _sdf,
Errors &_errors);
/// \brief Populate the SDF values from a string without converting to the
/// latest SDF version
///
/// This populates the sdf pointer from a string. If the string is a URDF
/// file it is converted to SDF first. This function does not convert the
/// loaded SDF to the latest version. Use this function with care, as it may
/// prevent loading of DOM objects from this SDF object.
/// \param[in] _xmlString XML string to be parsed.
/// \param[in] _sdf Pointer to an SDF object.
/// \param[out] _errors Parsing errors will be appended to this variable.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readStringWithoutConversion(
const std::string &_xmlString, SDFPtr _sdf, Errors &_errors);
/// \brief Populate the SDF values from a string
///
/// This populates the sdf pointer from a string. If the string is a URDF
/// string it is converted to SDF first. All strings are converted to the
/// latest SDF version
/// \param[in] _xmlString XML string to be parsed.
/// \param[in] _sdf Pointer to an sdf Element object.
/// \return True if successful.
SDFORMAT_VISIBLE
bool readString(const std::string &_xmlString, ElementPtr _sdf);
/// \brief Get the file path to the model file
/// \param[in] _modelDirPath directory system path of the model
/// \return string with the full filesystem path to the best version (greater
/// SDF protocol supported by this sdformat version) of the .sdf
/// model files hosted by _modelDirPath.
SDFORMAT_VISIBLE
std::string getModelFilePath(const std::string &_modelDirPath);
/// \brief Copy the contents of the first model element from one ElementPtr
/// to another ElementPtr, prepending the copied model name with `::` to
/// link and joint names, and apply the model pose to the copied link poses.
/// If //xyz/@expressed_in == "__model__" for the axes of any copied joints,
/// then apply the model pose rotation to those joint axes.
/// \param[in] _sdf ElementPtr for model into which the elements will be
/// copied.
/// \param[in] _includeSDF The first model element from this ElementPtr will
/// be copied to _sdf with the mentioned name and pose transformations.
SDFORMAT_VISIBLE
void addNestedModel(ElementPtr _sdf, ElementPtr _includeSDF);
/// \brief Copy the contents of the first model element from one ElementPtr
/// to another ElementPtr, prepending the copied model name with `::` to
/// link and joint names, and apply the model pose to the copied link poses.
/// If //xyz/@expressed_in == "__model__" for the axes of any copied joints,
/// then apply the model pose rotation to those joint axes.
/// \param[in] _sdf ElementPtr for model into which the elements will be
/// copied.
/// \param[in] _includeSDF The first model element from this ElementPtr will
/// be copied to _sdf with the mentioned name and pose transformations.
/// \param[out] _errors Any errors will be appended to this variable.
SDFORMAT_VISIBLE
void addNestedModel(ElementPtr _sdf, ElementPtr _includeSDF, Errors &_errors);
/// \brief Convert an SDF file to a specific SDF version.
/// \param[in] _filename Name of the SDF file to convert.
/// \param[in] _version Version to convert _filename to.
/// \param[out] _sdf Pointer to the converted SDF document.
/// \return True on success.
SDFORMAT_VISIBLE
bool convertFile(const std::string &_filename, const std::string &_version,
SDFPtr _sdf);
/// \brief Convert an SDF string to a specific SDF version.
/// \param[in] _sdfString The SDF string to convert.
/// \param[in] _version Version to convert _filename to.
/// \param[out] _sdf Pointer to the converted SDF document.
/// \return True on success.
SDFORMAT_VISIBLE
bool convertString(const std::string &_sdfString,
const std::string &_version, SDFPtr _sdf);
/// \brief Check that for each model, the canonical_link attribute value
/// matches the name of a link in the model if the attribute is set and
/// not empty.
/// This checks recursively and should check the files exhaustively
/// rather than terminating early when the first error is found.
/// \param[in] _root sdf Root object to check recursively.
/// \return True if all models have valid canonical_link attributes.
SDFORMAT_VISIBLE
bool checkCanonicalLinkNames(const sdf::Root *_root);
/// \brief For the world and each model, check that the attached_to graphs
/// build without errors and have no cycles.
/// Confirm that following directed edges from each vertex in the graph
/// leads to a model, link, or world frame.
/// This checks recursively and should check the files exhaustively
/// rather than terminating early when the first error is found.
/// \param[in] _root sdf Root object to check recursively.
/// \return True if all attached_to graphs are valid.
SDFORMAT_VISIBLE
bool checkFrameAttachedToGraph(const sdf::Root *_root);
/// \brief Check that for each frame, the attached_to attribute value
/// does not match its own frame name but does match the name of a
/// link, joint, or other frame in the model if the attribute is set and
/// not empty.
/// This checks recursively and should check the files exhaustively
/// rather than terminating early when the first error is found.
/// \param[in] _root sdf Root object to check recursively.
/// \return True if all frames have valid attached_to attributes.
SDFORMAT_VISIBLE
bool checkFrameAttachedToNames(const sdf::Root *_root);
/// \brief Check that all joints in contained models specify parent
/// and child link names that match the names of sibling links.
/// This checks recursively and should check the files exhaustively
/// rather than terminating early when the first error is found.
/// \param[in] _root sdf Root object to check recursively.
/// \return True if all models have joints with valid parent and child
/// link names.
SDFORMAT_VISIBLE
bool checkJointParentChildLinkNames(const sdf::Root *_root);
/// \brief For the world and each model, check that the attached_to graphs
/// build without errors and have no cycles.
/// Confirm that following directed edges from each vertex in the graph
/// leads to a model, link, or world frame.
/// This checks recursively and should check the files exhaustively
/// rather than terminating early when the first error is found.
/// \param[in] _root sdf Root object to check recursively.
/// \return True if all attached_to graphs are valid.
SDFORMAT_VISIBLE
bool checkPoseRelativeToGraph(const sdf::Root *_root);
/// \brief Check that all sibling elements of the same type have unique names.
/// This checks recursively and should check the files exhaustively
/// rather than terminating early when the first duplicate name is found.
/// \param[in] _elem sdf Element to check recursively.
/// \return True if all contained elements have do not share a name with
/// sibling elements of the same type.
SDFORMAT_VISIBLE
bool recursiveSameTypeUniqueNames(sdf::ElementPtr _elem);
/// \brief Check that all sibling elements of the any type have unique names.
/// This checks recursively and should check the files exhaustively
/// rather than terminating early when the first duplicate name is found.
/// \param[in] _elem sdf Element to check recursively.
/// \return True if all contained elements have do not share a name with
/// sibling elements of any type.
SDFORMAT_VISIBLE
bool recursiveSiblingUniqueNames(sdf::ElementPtr _elem);
/// \brief Check whether the element should be validated. If this returns
/// false, validators such as the unique name and reserve name checkers should
/// skip this element and its descendants.
/// \param[in] _elem sdf Element to check.
/// \return True if the element should be validated
SDFORMAT_VISIBLE
bool shouldValidateElement(sdf::ElementPtr _elem);
}
}
#endif
|