import xml.etree.ElementTree as ET
import math

def round_axis(x, y, z):
    # Normalize vector
    mag = math.sqrt(x**2 + y**2 + z**2)
    if mag == 0:
        return (0, 0, 0)
    x, y, z = x/mag, y/mag, z/mag

    # Compare to cardinal directions
    directions = {
        (1, 0, 0): 'X+',
        (-1, 0, 0): 'X-',
        (0, 1, 0): 'Y+',
        (0, -1, 0): 'Y-',
        (0, 0, 1): 'Z+',
        (0, 0, -1): 'Z-'
    }

    best = max(directions.keys(), key=lambda d: x*d[0] + y*d[1] + z*d[2])
    return best

def process_urdf(file_path, output_path):
    tree = ET.parse(file_path)
    root = tree.getroot()

    for joint in root.findall('joint'):
        axis_elem = joint.find('axis')
        if axis_elem is not None:
            axis_str = axis_elem.attrib.get('xyz', '')
            try:
                x, y, z = map(float, axis_str.strip().split())
                rx, ry, rz = round_axis(x, y, z)
                axis_elem.set('xyz', f"{rx} {ry} {rz}")
            except:
                continue

    tree.write(output_path)
    print(f"Rounded axes written to {output_path}")

# Example usage
process_urdf("./urdf/sample.urdf", "./urdf/output.urdf")
