File size: 1,608 Bytes
3aea7c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
export function xyzFromString(child: Element): [x: number, y: number, z: number] | undefined {
  const arr = numberStringToArray(child, 'xyz');
  if (!arr || arr.length != 3) {
    return
  }
  return arr as [x: number, y: number, z: number];
}

export function rpyFromString(child: Element): [roll: number, pitch: number, yaw: number] | undefined {
  const arr = numberStringToArray(child, 'rpy');
  if (!arr || arr.length != 3) {
    return
  }
  return arr as [roll: number, pitch: number, yaw: number];
}

export function rgbaFromString(child: Element): [r: number, g: number, b: number, a: number] | undefined {
  const arr = numberStringToArray(child, 'rgba');
  if (!arr || arr.length != 4) {
    return
  }
  return arr as [r: number, g: number, b: number, a: number];
}

export function numberStringToArray(
    child: Element, name: string = 'xyz'): number[] | undefined {
  // parse a list of values from a string 
  // (like "1.0 2.2 3.0" into an array like [1, 2.2, 3])
  // used in URDF for position, orientation an color values
  if (child.hasAttribute(name)) {
    const xyzStr = child.getAttribute(name)?.split(' ')
    if (xyzStr) {
      const arr = []
      for (const nr of xyzStr) {
        arr.push(parseFloat(nr));
      }
      return arr;
    }
  }
}

export function radToEuler(rad: number): number {
  return rad * 180 / Math.PI
}

export function numberArrayToColor([r, g, b]: [number, number, number]): string {
  const toHex = (n: number) => Math.round(n).toString(16).padStart(2, '0');
  // 0.06, 0.4, 0.1, 1
  return `#${toHex(r * 255)}${toHex(g * 255)}${toHex(b * 255)}`;
}