From f2ed658b63bbf4066e7b85f5d45be1b838045b12 Mon Sep 17 00:00:00 2001 From: Jakob Schwendner Date: Sat, 21 Feb 2015 23:13:02 +0100 Subject: [PATCH 1/4] Allow UrdfLink to have multiple visual elements add a visuals property to UrdfLink, which contains all the visual elements found in the link element. This breaks api compatibility, since the visual property is not available anymore. --- src/urdf/UrdfLink.js | 10 ++++++---- src/urdf/UrdfModel.js | 14 +++++++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/urdf/UrdfLink.js b/src/urdf/UrdfLink.js index bb99f9dd5..849acfb0b 100644 --- a/src/urdf/UrdfLink.js +++ b/src/urdf/UrdfLink.js @@ -14,11 +14,13 @@ var UrdfVisual = require('./UrdfVisual'); */ function UrdfLink(options) { this.name = options.xml.getAttribute('name'); + this.visuals = []; var visuals = options.xml.getElementsByTagName('visual'); - if (visuals.length > 0) { - this.visual = new UrdfVisual({ - xml : visuals[0] - }); + + for( var i=0; i Date: Sat, 21 Feb 2015 23:15:53 +0100 Subject: [PATCH 2/4] Add Urdf material links Urdf has the feature to link to a material, instead of specifying it in full. this is done by providing just a name for a material. This commit will fill the material object with content that is specified in an material element of the same name in the body. --- src/urdf/UrdfMaterial.js | 12 +++++++++++- src/urdf/UrdfModel.js | 6 +++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/urdf/UrdfMaterial.js b/src/urdf/UrdfMaterial.js index 4dede42cb..3e9b56005 100644 --- a/src/urdf/UrdfMaterial.js +++ b/src/urdf/UrdfMaterial.js @@ -34,4 +34,14 @@ function UrdfMaterial(options) { } } -module.exports = UrdfMaterial; \ No newline at end of file +UrdfMaterial.prototype.isLink = function() { + return this.color === null && this.textureFilename === null; +}; + +UrdfMaterial.prototype.assign = function(obj) { + for( var key in obj ) { + this[key] = obj[key]; + } +}; + +module.exports = UrdfMaterial; diff --git a/src/urdf/UrdfModel.js b/src/urdf/UrdfModel.js index 9f2abd142..5b5814759 100644 --- a/src/urdf/UrdfModel.js +++ b/src/urdf/UrdfModel.js @@ -50,7 +50,11 @@ function UrdfModel(options) { }); // Make sure this is unique if (this.materials[material.name] !== void 0) { - console.warn('Material ' + material.name + 'is not unique.'); + if( this.materials[material.name].isLink() ) { + this.materials[material.name].assign( material ); + } else { + console.warn('Material ' + material.name + 'is not unique.'); + } } else { this.materials[material.name] = material; } From 18f7f1e9c2e81d1054a6363c598280ce92f167a7 Mon Sep 17 00:00:00 2001 From: Jakob Schwendner Date: Sat, 21 Feb 2015 23:16:28 +0100 Subject: [PATCH 3/4] Unit test for Urdf multiple visuals and material link features --- test/urdf.test.js | 48 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/test/urdf.test.js b/test/urdf.test.js index 12d2d1364..565846281 100644 --- a/test/urdf.test.js +++ b/test/urdf.test.js @@ -38,6 +38,20 @@ var sample_urdf = function (){ ' '+ ' '+ ' '+ + ' '+ // link with referenced material and multiple visuals + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ ' '+ ' '+ ' '+ @@ -50,6 +64,9 @@ var sample_urdf = function (){ ' '+ ' '+ ' '+ + ' '+ + ' '+ + ' '+ ''; } @@ -71,18 +88,27 @@ describe('URDF', function() { }); // Check all the visual elements - expect(urdfModel.links['link1'].visual.geometry.radius).to.equal(1.0); - expect(urdfModel.links['link2'].visual.geometry.dimension.x).to.equal(0.5); - expect(urdfModel.links['link2'].visual.geometry.dimension.y).to.equal(0.5); - expect(urdfModel.links['link2'].visual.geometry.dimension.z).to.equal(0.5); - expect(urdfModel.links['link3'].visual.geometry.length).to.equal(2.0); - expect(urdfModel.links['link3'].visual.geometry.radius).to.equal(0.2); + expect(urdfModel.links['link1'].visuals.length).to.equal(1); + expect(urdfModel.links['link1'].visuals[0].geometry.radius).to.equal(1.0); + expect(urdfModel.links['link2'].visuals[0].geometry.dimension.x).to.equal(0.5); + expect(urdfModel.links['link2'].visuals[0].geometry.dimension.y).to.equal(0.5); + expect(urdfModel.links['link2'].visuals[0].geometry.dimension.z).to.equal(0.5); + expect(urdfModel.links['link3'].visuals[0].geometry.length).to.equal(2.0); + expect(urdfModel.links['link3'].visuals[0].geometry.radius).to.equal(0.2); + + expect(urdfModel.links['link4'].visuals.length).to.equal(1); + expect(urdfModel.links['link4'].visuals[0].material.name).to.equal('red'); + expect(urdfModel.links['link4'].visuals[0].material.color.r).to.equal(1.0); + expect(urdfModel.links['link4'].visuals[0].material.color.g).to.equal(0); + expect(urdfModel.links['link4'].visuals[0].material.color.b).to.equal(0); + expect(urdfModel.links['link4'].visuals[0].material.color.a).to.equal(1.0); - expect(urdfModel.links['link4'].visual.material.name).to.equal('red'); - expect(urdfModel.links['link4'].visual.material.color.r).to.equal(1.0); - expect(urdfModel.links['link4'].visual.material.color.g).to.equal(0); - expect(urdfModel.links['link4'].visual.material.color.b).to.equal(0); - expect(urdfModel.links['link4'].visual.material.color.a).to.equal(1.0); + expect(urdfModel.links['link5'].visuals.length).to.equal(2); + expect(urdfModel.links['link5'].visuals[0].material.name).to.equal('blue'); + expect(urdfModel.links['link5'].visuals[0].material.color.r).to.equal(0.0); + expect(urdfModel.links['link5'].visuals[0].material.color.g).to.equal(0.0); + expect(urdfModel.links['link5'].visuals[0].material.color.b).to.equal(1.0); + expect(urdfModel.links['link5'].visuals[0].material.color.a).to.equal(1.0); }); it('is ignorant to the xml node', function(){ From c189af5dcbbc80fc99a9e86dd2e1faeadc07d085 Mon Sep 17 00:00:00 2001 From: Jakob Schwendner Date: Sat, 21 Feb 2015 23:43:24 +0100 Subject: [PATCH 4/4] Use object assign method --- src/urdf/UrdfMaterial.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/urdf/UrdfMaterial.js b/src/urdf/UrdfMaterial.js index 3e9b56005..2480576a7 100644 --- a/src/urdf/UrdfMaterial.js +++ b/src/urdf/UrdfMaterial.js @@ -38,10 +38,10 @@ UrdfMaterial.prototype.isLink = function() { return this.color === null && this.textureFilename === null; }; +var assign = require('object-assign'); + UrdfMaterial.prototype.assign = function(obj) { - for( var key in obj ) { - this[key] = obj[key]; - } + return assign(this, obj); }; module.exports = UrdfMaterial;