bool parseJointLimits(JointLimits &jl, TiXmlElement* config) { jl.clear(); // Get lower joint limit const char* lower_str = config->Attribute("lower"); if (lower_str == NULL){ CONSOLE_BRIDGE_logDebug("urdfdom.joint_limit: no lower, defaults to 0"); jl.lower = 0; } else { try { jl.lower = boost::lexical_cast<double>(lower_str); } catch (boost::bad_lexical_cast &e) { CONSOLE_BRIDGE_logError("lower value (%s) is not a float: %s", lower_str, e.what()); return false; } } // Get upper joint limit const char* upper_str = config->Attribute("upper"); if (upper_str == NULL){ CONSOLE_BRIDGE_logDebug("urdfdom.joint_limit: no upper, , defaults to 0"); jl.upper = 0; } else { try { jl.upper = boost::lexical_cast<double>(upper_str); } catch (boost::bad_lexical_cast &e) { CONSOLE_BRIDGE_logError("upper value (%s) is not a float: %s",upper_str, e.what()); return false; } } // Get joint effort limit const char* effort_str = config->Attribute("effort"); if (effort_str == NULL){ CONSOLE_BRIDGE_logError("joint limit: no effort"); return false; } else { try { jl.effort = boost::lexical_cast<double>(effort_str); } catch (boost::bad_lexical_cast &e) { CONSOLE_BRIDGE_logError("effort value (%s) is not a float: %s",effort_str, e.what()); return false; } } // Get joint velocity limit const char* velocity_str = config->Attribute("velocity"); if (velocity_str == NULL){ CONSOLE_BRIDGE_logError("joint limit: no velocity"); return false; } else { try { jl.velocity = boost::lexical_cast<double>(velocity_str); } catch (boost::bad_lexical_cast &e) { CONSOLE_BRIDGE_logError("velocity value (%s) is not a float: %s",velocity_str, e.what()); return false; } } return true; }