Trained an SO-101 robot arm to perform a bayonet lock — pick up a peg, insert it into a fixed socket, and twist to lock. ~50 teleoperated episodes, 3 cameras, trained with ACT from scratch.
Success rate: ~50% under training conditions. Fails mostly in the twist phase.
The Task
Bayonet parts, circular version
Bayonet lock: insert peg into socket, rotate 70° to lock
Two versions designed and printed, circular first, then rectangular
Rectangular profile doesn't slip during the twist — made the task tractable
Socket glued to a taped reference frame on the table
Peg always starts from the same fixed position
Camera Setup
Three cameras, three different jobs:
Camera
Position
What it covers
gripper
Mounted on wrist
Looks into socket during insertion, most critical view
front_local
Frontal, close
Vertical descent and seating depth
front_global
Elevated, oblique
Full workspace context
First tries of finding the most stable position for cameras
Tried OAK-D Pro and Raspberry Pi Camera Module 3 first, integration issues and brutal latency
Ended up with two Innomaker HD USB cameras and DJI Osmo Action 6 in webcam mode
Resolution: 640×480 @ 30fps & 1280x720 @ 30fps, dropped from higher resolution to keep the pipeline lag-free
Camera placement turned out to matter more than camera hardware
Many cameras view
What I Learned
Camera placement is the most important design decision — not model size, not episode count
Data consistency during recording matters more than volume for contact tasks
Rectangular geometry > circular for pick-and-twist — a small design change with a big effect on success
The dataset format is model-agnostic — same 51 episodes trained both ACT and SmolVLA
Knowing the exact failure mode is useful — it tells you exactly what to improve next
Model Card for act
Action Chunking with Transformers (ACT) is an imitation-learning method that predicts short action chunks instead of single steps. It learns from teleoperated data and often achieves high success rates.
This policy has been trained and pushed to the Hub using LeRobot.
CLI cheat-sheet — quick reference for the lerobot-* commands.
The short version to run and train this policy:
Run the policy on your robot
bash
1lerobot-rollout \2 --strategy.type=base \3 --robot.type=so_follower \4 --robot.port=<your_robot_port>\5 --robot.cameras="{ <camera_1>: {type: opencv, index_or_path: <index_or_path>, width: 640, height: 480, fps: 30}, <camera_2>: {type: opencv, index_or_path: <index_or_path>, width: 640, height: 480, fps: 30}}"\6 --policy.path=andrii4k/act_bayonett_policy \7 --task="Insert the peg into the socket and twist to lock"\8 --duration=60
Replace the remaining <...> placeholders with your own values: --robot.port and the camera names/indices are specific to your machine, and the camera names must match the observation keys this policy was trained on.
When --strategy.type=base is used the script doesn't record the episodes. Skipping duration will make the policy run indefinitely. For more information look at rollout documentation.
Writes checkpoints to outputs/train/<policy_repo_id>/checkpoints/.
Evaluation
No evaluation results have been provided for this policy yet.
Citation
If you use this policy, please cite the method linked in the description above, along with LeRobot:
bibtex
1@misc{cadene2024lerobot,
2 author = {Cadene, Remi and Alibert, Simon and Soare, Alexander and Gallouedec, Quentin and Zouitine, Adil and Palma, Steven and Kooijmans, Pepijn and Aractingi, Michel and Shukor, Mustafa and Aubakirova, Dana and Russi, Martino and Capuano, Francesco and Pascal, Caroline and Choghari, Jade and Moss, Jess and Wolf, Thomas},
3 title = {LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch},
4 howpublished = "\url{https://github.com/huggingface/lerobot}",
5 year = {2024}
6}