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()
recorder = MultiSourceRecorder(
arm=arm_interface,
sensor=sensor,
camera=camera_interface,
output_dir="./tactile_dataset/",
episode_prefix="grasp_place",
sample_rate_hz=100,
)
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
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()
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:
from paxini.annotate import DatasetQualityReport
report = DatasetQualityReport("./tactile_dataset/")
report.run()
report.print_summary()
✓
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.