Step 1 — Recording Setup

Configure the Recorder

Initialize the MultiSourceRecorder with your arm, sensor, and camera interfaces. The recorder handles HDF5 file creation, channel alignment, and episode indexing automatically:

import paxini from paxini.sync import MultiSourceRecorder sensor = paxini.Sensor() sensor.start() sensor.calibrate() # always calibrate before recording recorder = MultiSourceRecorder( arm=arm_interface, sensor=sensor, camera=camera_interface, # optional but recommended output_dir="./tactile_dataset/", episode_prefix="grasp_place", sample_rate_hz=100, # arm + tactile downsampled to 100 Hz for dataset ) print(f"Dataset will be saved to: {recorder.output_dir}") print(f"Resume from episode: {recorder.next_episode_index}")
Step 2 — Recording 50 Demonstrations

The Recording Loop

For each demonstration: start the episode, perform the task (grasp an object, move it, place it), then end the episode. The recorder saves the episode as an HDF5 file and prints a summary:

import keyboard # pip install keyboard for episode_num in range(50): input(f"\nEpisode {episode_num + 1}/50 — Press Enter to start, then perform grasp-place task...") recorder.start_episode() # Teleoperate the arm to perform the task here # The recorder captures all channels in the background input("Press Enter when task is complete...") summary = recorder.end_episode() print(f" Duration: {summary.duration_s:.1f}s") print(f" Contact events: {summary.contact_event_count}") print(f" Slip events detected: {summary.slip_event_count}") print(f" Max force: {summary.max_force_n:.2f} N") print(f" Sync quality: mean {summary.sync_mean_dt_ms:.1f}ms")
Task design tips for tactile data Choose a task that involves grasping objects of varying weight and compliance. Deformable objects (soft toys, foam blocks, flexible packaging) and items where visual grasp assessment is ambiguous (transparent bottles, shiny objects) produce the most training signal for tactile-aware policies.
Step 3 — Quality Checklist

Ensuring Dataset Quality

After recording, run the dataset quality check before moving to training:

# Run quality check on entire dataset from paxini.annotate import DatasetQualityReport report = DatasetQualityReport("./tactile_dataset/") report.run() report.print_summary() # Example output: # Episodes: 50 # Passed: 44 # Flagged (slip events): 4 # Flagged (sensor saturation): 1 # Flagged (sync quality): 1 # Ready for training: 44 episodes
Baseline calibration before each session Recalibrate with sensor.calibrate() at the start of each recording session and whenever you reposition the arm significantly.
Contact events align with video Review 5 episodes. The in_contact rising edge should coincide with visible fingertip-object contact in the camera feed within 20 ms.
Force range coverage Across 50 episodes, max force should range from 0.5 N (light grasp) to at least 8 N (firm grasp). Avoid recording all episodes at maximum gripper force.
No sensor saturation No episode should show pressure_map.max() >= 590 kPa. If saturation occurs, reduce gripper force or switch to the palm variant for that gripper size.
Target: 50 demos with clean contact events After flagging, aim for at least 44 high-quality episodes. Re-record any flagged episodes to reach the target count.

For the complete data collection methodology including advanced synchronization options, see the Paxini Gen3 data collection guide.

Unit 4 Complete When...

You have 50 recorded episodes in HDF5 format with tactile channels. The DatasetQualityReport shows at least 44 episodes passing all checks. The reported contact events align with video on the 5 episodes you reviewed manually. You have at least 3 different force levels represented across the dataset.