import URDFLoader from './URDFLoader.js'; export default class ExtendedURDFLoader extends URDFLoader { constructor(manager) { super(manager); this.transmissionMap = {}; } parseTransmissions(xml) { const transmissions = xml.querySelectorAll('transmission'); this.transmissionMap = {}; transmissions.forEach(trans => { const jointName = trans.querySelector('joint')?.getAttribute('name'); const actuator = trans.querySelector('actuator'); const reduction = parseFloat(actuator?.querySelector('mechanicalReduction')?.textContent ?? '1'); const actuatorName = actuator?.getAttribute('name') ?? null; const encoderTicks = parseInt(actuator?.querySelector('encoderTicks')?.textContent ?? '4096'); const encoderValidMin = parseInt(actuator?.querySelector('encoderValidMin')?.textContent ?? '0'); const encoderValidMax = parseInt(actuator?.querySelector('encoderValidMax')?.textContent ?? '4095'); const encoderRange = parseInt(actuator?.querySelector('encoderRange')?.textContent ?? '180'); const motorID = parseInt(actuator?.querySelector('motorID')?.textContent ?? '47'); if (jointName) { this.transmissionMap[jointName] = { mechanicalReduction: reduction, actuatorName, encoderTicks, encoderValidMin, encoderValidMax, encoderRange, motorID }; } }); } parseMimics(xml) { const joints = xml.querySelectorAll('joint'); joints.forEach(jointEl => { const jointName = jointEl.getAttribute('name'); const mimicEl = jointEl.querySelector('mimic'); if (mimicEl && jointName) { const target = mimicEl.getAttribute('joint'); const multiplier = parseFloat(mimicEl.getAttribute('multiplier') ?? '1.0'); const offset = parseFloat(mimicEl.getAttribute('offset') ?? '0.0'); // Attach mimic info directly to the joint object if (this.robot?.joints[jointName]) { this.robot.joints[jointName].mimic = { target, multiplier, offset }; } } }); } async loadFromString(urdfText, options = {}) { const xml = new DOMParser().parseFromString(urdfText, 'application/xml'); const parserError = xml.querySelector('parsererror'); if (parserError) { console.error('❌ XML parser error:', parserError.textContent); throw new Error('Invalid URDF XML: ' + parserError.textContent); } this.parseTransmissions(xml); //this.parseMimics(xml); const robot = this.parse(xml); // ✅ Use inherited parse() directly //console.log(robot.joints); for (const jointName in robot.joints) { if (this.transmissionMap[jointName]) { robot.joints[jointName].transmission = this.transmissionMap[jointName]; } } return robot; } }