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).
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)