TDLiDAR — OSC Wire Reference

The canonical list of every OSC address the TDLiDAR iOS app emits, grouped by sensor. This is the source of truth the operator family is built against. All messages are sent over UDP, default port 9000.

How the wire works

  • Every address is prefixed /tdlidar/….
  • In TouchDesigner an OSC In CHOP turns each numeric address into a channel named by the address without the leading slash (/tdlidar/motion/accel/x → channel tdlidar/motion/accel/x).
  • String payloads (labels, OCR text, NFC payloads, speech) must be read with an OSC In DAT, not a CHOP.
  • A sensor only streams when it is enabled in the app. Several sensors share one address bucket (Body/Hands/Pinch/Gesture all live under /tdlidar/body/…); enabling more than one just adds channels.
  • Rates below are typical on an iPhone 15 Pro; thermal throttling lowers them.

Motion

Sensor Address Args Units / range Rate
Acceleration /tdlidar/motion/accel/{x,y,z} float G, gravity removed (userAcceleration) ≤50 Hz
Gravity /tdlidar/motion/gravity/{x,y,z} float unit vector, points to ground ≤50 Hz
Gyro /tdlidar/motion/rotation/{x,y,z} float rad/s (rotationRate) ≤50 Hz
Quaternion / Euler /tdlidar/motion/{pitch,roll,yaw} float radians ≤50 Hz
Magnetometer /tdlidar/motion/magnetic/{x,y,z} float µT (raw field, not heading) ≤50 Hz
Barometer /tdlidar/motion/altitude/{relative,pressure} float metres (relative), kPa ~1 Hz
Motion Activity /tdlidar/activity/{walking,running,cycling,automotive,stationary} float 0/1 each ~1 Hz
Motion Activity /tdlidar/activity/confidence float 0=low,1=med,2=high ~1 Hz

Calibration note: pitch/roll/yaw and rotation are zeroed against a snapshot when the app’s “calibrate” is pressed; gravity/magnetic stay raw.

Device

Sensor Address Args Units / range Rate
Battery /tdlidar/motion/battery/level float 0–1 on change + ~2 Hz
Battery /tdlidar/motion/battery/state float 0 unknown,1 unplugged,2 charging,3 full on change
Thermal State /tdlidar/device/thermal float 0 nominal,1 fair,2 serious,3 critical on change + 2 Hz
Low Power Mode /tdlidar/device/lowpower float 0/1 on change + 2 Hz
Screen Brightness /tdlidar/device/brightness float 0–1 2 Hz

Camera & Vision — pose

Body (Vision 3D, back camera)

| Address | Args | Meaning | |—|—|—| | /tdlidar/body/detected | float | 1 when a body is in frame, else 0 (skeleton channels go stale at 0) | | /tdlidar/body/skeleton | 51 float | 17 joints × (x,y,z), camera-relative metres | | /tdlidar/body/skeleton/img | 34 float | 17 joints × (x,y), normalized image coords, top-left origin | | /tdlidar/body/<joint> | x,y,z,conf | per-joint, metres + confidence | | /tdlidar/body/<joint>/img | x,y | per-joint normalized image | | /tdlidar/body/distance | float | subject distance, metres |

Joint order (index → name): 0 root, 1 spine, 2 neck, 3 head, 4 head_top, 5 l_shoulder, 6 l_elbow, 7 l_wrist, 8 l_hip, 9 l_knee, 10 l_ankle, 11 r_shoulder, 12 r_elbow, 13 r_wrist, 14 r_hip, 15 r_knee, 16 r_ankle. Bones: (0,1)(1,2)(2,3)(3,4)(2,5)(5,6)(6,7)(2,11)(11,12)(12,13)(0,8)(8,9)(9,10)(0,14)(14,15)(15,16)(5,11 shoulder-bar)(8,14 hip-bar).

X/Y are accurate; Z (depth) is noisy on monocular Vision — the Body tox drives shape from …/skeleton/img and clamps Z per-bone.

Hands (Vision, back camera — shares the Body pass)

| Address | Args | Meaning | |—|—|—| | /tdlidar/body/hands/count | int | number of hands (0–2) | | /tdlidar/body/hands/distance | float | hand distance, metres | | /tdlidar/body/hands/frame | int | per-frame heartbeat (increments every frame so TD knows data is live) | | /tdlidar/body/hands/<side>/<landmark> | x,y,z + rx,ry,rz | 21 landmarks × (x,y normalized image, z metres) + unit bone direction |

21 landmark order: wrist, thumb_cmc, thumb_mcp, thumb_ip, thumb_tip, index_mcp, index_pip, index_dip, index_tip, middle_mcp, middle_pip, middle_dip, middle_tip, ring_mcp, ring_pip, ring_dip, ring_tip, pinky_mcp, pinky_pip, pinky_dip, pinky_tip.

Pinch / Gesture (hand-derived, first hand, no side)

| Address | Args | Meaning | |—|—|—| | /tdlidar/pinch | float | thumbTip↔indexTip distance, palm-normalized (~0 closed) | | /tdlidar/gesture/{open,fist,peace,point} | float | 0/1 each, one-hot-ish static gesture |

Face (ARKit, front TrueDepth)

| Address | Args | Meaning | |—|—|—| | /tdlidar/face/* | float | 52 ARKit blendshapes (0–1), head transform, gaze/look-at |

6DoF Device Pose (ARKit world)

| Address | Args | Meaning | |—|—|—| | /tdlidar/arpose/{tx,ty,tz} | float | world position, metres | | /tdlidar/arpose/quat | 4 float | orientation quaternion (x,y,z,w) | | /tdlidar/arpose/euler/{pitch,roll,yaw} | float | radians | | /tdlidar/arpose/tracking | int | ARKit tracking state (0 not available,1 limited,2 normal) |

ARKit Body (back, exclusive)

| Address | Args | Meaning | |—|—|—| | /tdlidar/arbody/skeleton… | float | true 91-joint, world-space, metric skeleton, 60 Hz | | /tdlidar/arbody/orientation | 4 float | body orientation quaternion | | /tdlidar/arbody/hierarchy | — | joint parent indices for the rig |

Camera & Vision — scene / detect

Sensor Address Args Meaning
Camera Exposure /tdlidar/cam/{iso,shutter_sec,ev_offset,focus,wb_kelvin,wb_tint} float light proxy: ISO, shutter seconds, EV, focus 0–1, white-balance K + tint
Ambient Light /tdlidar/light/{ambient_lumens,kelvin} float room brightness (lumens) + colour temperature (K)
AR Planes /tdlidar/scene/{plane_count,plane_area_m2} float detected plane count + total area
AR Mesh /tdlidar/scene/{mesh_anchors,mesh_faces} float LiDAR mesh totals (scan completeness)
QR / Barcode /tdlidar/detect/qr/payload (string) + /tdlidar/detect/qr/* corners str/float decoded payload + corner coords
Rectangle (detect) /tdlidar/detect/rect/{count,cx,cy} float detected quad count + centre
Text (OCR) /tdlidar/detect/text/count (float) + /tdlidar/detect/text/string (string) float/str recognized strings
Saliency /tdlidar/saliency/{x,y,w,h,conf} float attention box (normalized, TD flips Y)
Front Distance /tdlidar/frontdist/norm float 0–1 normalized nearest distance (front TrueDepth)
Back Distance /tdlidar/backdist/{meters,norm} float LiDAR distance at the movable cross
Animal /tdlidar/animal/{nose,neck,frontpaw/left,frontpaw/right,backpaw/left,backpaw/right,tail/…} x,y 2D keypoints (no Z)
Animal /tdlidar/animal/distance float distance when a depth camera is active

Scene Classification (/tdlidar/scene/label + /confidence) exists in the app but its tox is deferred (the prototype TOP chain crashed TD on load; rebuild with a Text TOP, no Movie File I/O).

Audio

Sensor Address Args Meaning
Mic Level /tdlidar/audio/rms float mic RMS volume
Audio /tdlidar/audio/{low,mid,high} float band levels
Audio /tdlidar/audio/fft… float 20-band FFT spectrum
Audio /tdlidar/audio/{beat,onset} float transient triggers
Audio /tdlidar/audio/{pitch,note,midi,centroid,flux,rolloff,loudness} float pitch/timbre channels
Speech /tdlidar/speech/{partial,final,paragraph} string live STT (read with OSC In DAT)
Sound ID /tdlidar/sound/label (string) + /tdlidar/sound/confidence (float) str/float 300+ class sound classification

The legacy /tdlidar/audio/drums/{low,mid,high} channels were removed (they never changed).

Touch & Input

Sensor Address Args Meaning
Touch /tdlidar/touch/{x,y,radius,force} float on-screen touch
Apple Pencil /tdlidar/pencil/{x,y,pressure,tilt,azimuth,barreltap} float iPad + Pencil only
Proximity /tdlidar/proximity float 0 far / 1 near (blanks the screen when near)
NFC /tdlidar/nfc/trigger (float) + /tdlidar/nfc/payload (string) float/str tag read
Remote Control /tdlidar/remote/{playpause,next,previous,volup,voldown} float momentary 1→0
Remote Control /tdlidar/remote/volume float 0–1 (re-centres so buttons keep firing)

External

Sensor Address Args Meaning
AirPods /tdlidar/airpods/{pitch,roll,yaw} + …_deg float head pose (rad + degrees)
AirPods /tdlidar/airpods/{quat,accel,gravity,tilt} float quaternion + motion
Apple Watch /tdlidar/motion/watch/* float heart rate, accel, rotation, Digital Crown (needs the Watch app)

Output / utility toxes (not OSC sensors)

Tox Transport Meaning
NDI NDI video receive the phone’s NDI depth/RGB stream → TOP (source-name dropdown)
Point Cloud TCP 50k bit-exact XYZ+RGB points → POP
Scene Build RoomPlan scan review
Rectangle OSC-driven a TOP + POP whose size follows any chosen channel (demo / meter)