D
DreamLake

Data

joint_angles

N-DoF joint-state time-series in radians. Works for any kinematic chain — 6-axis cobots, 7-DoF manipulators, 26-DoF humanoid hands. The dtype doesn't encode the robot model, only the joint-space samples.

Chunk format

  • Format: jsonl
  • Decoder: jsonlDecoder

JSONL shape

{
  ts: number
  data: number[]  // length = DoF; all samples in the track share the same DoF
}
FieldTypeRequiredNotes
tsnumberyesSeconds from episode start.
datanumber[]yesJoint angles in radians. Length = DoF.

Sample data

{"ts": 0.00, "data": [0.000,  1.106,  1.979,  2.475,  2.445,  1.969,  1.057]}
{"ts": 0.01, "data": [0.188,  1.280,  2.122,  2.484,  2.323,  1.663,  0.637]}
{"ts": 0.02, "data": [0.326,  1.418,  2.244,  2.488,  2.197,  1.347,  0.206]}

Sample m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXTINF:5.000,
chunk-001.jsonl
#EXT-X-ENDLIST

Compatible timeline lanes

LaneNotes
LineChartLaneDefault. One curve per joint.

Compatible standalone views

ViewNotes
JointAngleView2D stick-figure arm (SVG planar FK). Good for 6 / 7 DoF arms.
UrdfRobot3D URDF robot rendered via @vuer-ai/vuer; use useJointAnglesForUrdf to bind a track to joint names.

Default props

FieldValue
range[-Math.PI, Math.PI]
unit'rad'

Per-track you'll often set channelNames:

{
  "id": "arm_qpos",
  "path": "robot/arm/qpos",
  "dtype": "joint_angles",
  "src": "...",
  "props": {
    "channelNames": ["shoulder_pan", "shoulder_lift", "upper_arm_roll",
                     "elbow_flex", "forearm_roll", "wrist_flex", "wrist_roll"]
  }
}

Python generator

import numpy as np
from dreamlake import Episode
 
ep = Episode.create("ep1")
qpos = ep.track("robot/arm/qpos", dtype="joint_angles")
 
n_dof = 7
t, dt = 0.0, 0.01
while t < 10.0:
    q = np.sin(t * 0.5 + np.arange(n_dof) * 0.3) * 0.8
    qpos.append({"ts": t, "data": q.tolist()})
    t += dt

registerDtype override

// Override the default range if your joints are continuous (multi-turn)
registerDtype({
  id: 'joint_angles',
  name: 'Joint angles (multi-turn)',
  defaults: { unit: 'rad' },  // drop range to let autoscale kick in
})