UNPKG

roslib

Version:

The standard ROS Javascript Library

92 lines (82 loc) 2.56 kB
/** * @fileOverview * @author David V. Lu!! davidvlu@gmail.com */ var Pose = require('../math/Pose'); var Vector3 = require('../math/Vector3'); var Quaternion = require('../math/Quaternion'); /** * A Joint element in a URDF. * * @constructor * @param options - object with following keys: * * xml - the XML element to parse */ function UrdfJoint(options) { this.name = options.xml.getAttribute('name'); this.type = options.xml.getAttribute('type'); var parents = options.xml.getElementsByTagName('parent'); if(parents.length > 0) { this.parent = parents[0].getAttribute('link'); } var children = options.xml.getElementsByTagName('child'); if(children.length > 0) { this.child = children[0].getAttribute('link'); } var limits = options.xml.getElementsByTagName('limit'); if (limits.length > 0) { this.minval = parseFloat( limits[0].getAttribute('lower') ); this.maxval = parseFloat( limits[0].getAttribute('upper') ); } // Origin var origins = options.xml.getElementsByTagName('origin'); if (origins.length === 0) { // use the identity as the default this.origin = new Pose(); } else { // Check the XYZ var xyz = origins[0].getAttribute('xyz'); var position = new Vector3(); if (xyz) { xyz = xyz.split(' '); position = new Vector3({ x : parseFloat(xyz[0]), y : parseFloat(xyz[1]), z : parseFloat(xyz[2]) }); } // Check the RPY var rpy = origins[0].getAttribute('rpy'); var orientation = new Quaternion(); if (rpy) { rpy = rpy.split(' '); // Convert from RPY var roll = parseFloat(rpy[0]); var pitch = parseFloat(rpy[1]); var yaw = parseFloat(rpy[2]); var phi = roll / 2.0; var the = pitch / 2.0; var psi = yaw / 2.0; var x = Math.sin(phi) * Math.cos(the) * Math.cos(psi) - Math.cos(phi) * Math.sin(the) * Math.sin(psi); var y = Math.cos(phi) * Math.sin(the) * Math.cos(psi) + Math.sin(phi) * Math.cos(the) * Math.sin(psi); var z = Math.cos(phi) * Math.cos(the) * Math.sin(psi) - Math.sin(phi) * Math.sin(the) * Math.cos(psi); var w = Math.cos(phi) * Math.cos(the) * Math.cos(psi) + Math.sin(phi) * Math.sin(the) * Math.sin(psi); orientation = new Quaternion({ x : x, y : y, z : z, w : w }); orientation.normalize(); } this.origin = new Pose({ position : position, orientation : orientation }); } } module.exports = UrdfJoint;