একটি SO-100 আর্ম দিয়ে আপনার প্রথম LeRobot ডেটাসেট রেকর্ড করার জন্য AY-Robots টিউটোরিয়াল পৃষ্ঠা
LeRobotSO-100ডেটাসেট রেকর্ডিংটেলিপেরেশনইমিটেশন লার্নিং

একটি SO-100 দিয়ে আপনার প্রথম LeRobot ডেটাসেট রেকর্ড করুন

AY-Robots ResearchAugust 23, 202616 মিনিট পড়া

একটি SO-100 দিয়ে একটি ব্যবহারযোগ্য LeRobot ডেটাসেট রেকর্ড করুন: ক্যালিব্রেশন, লিডার-ফলোয়ার টেলিপেরেশন, আসল lerobot-record ফ্ল্যাগ এবং ডিফল্ট, ক্যামেরা সেটআপ, এপিসোড গণনা, এবং যে ত্রুটিগুলি একটি রান নষ্ট করে।

একটি SO-100 ফলোয়ার, একই ডিজাইনের একটি লিডার আর্ম এবং দুটি USB ক্যামেরা এক বিকেলে একটি পলিসি ফাইন-টিউন করতে পারে। একই বেঞ্চ সহজেই ষাটটি এপিসোড তৈরি করতে পারে যা ফাইল ব্রাউজারে স্বাস্থ্যকর দেখায় এবং ছয় ঘণ্টার GPU রান নষ্ট করে। পার্থক্যটি কদাচিৎ মডেলের হয়; এটি সার্ভো এবং পারকেট ফাইলের মধ্যে যা ঘটেছে তা।

এখানে ম্যানুয়াল রুট, তারপর সংক্ষিপ্তটি। প্রতিটি কমান্ড lerobot 0.6.1 থেকে নেওয়া হয়েছে, যা 3 আগস্ট 2026 এ প্রকাশিত এবং PyPI-তে বর্তমান। এটি কনসোল এন্ট্রি পয়েন্টে স্থানান্তরিত হয়েছে, তাই যে টিউটোরিয়ালগুলি রান করে python lerobot/scripts/control_robot.py এমন একটি ফাইল বর্ণনা করে যা আর বিদ্যমান নেই।

সংক্ষিপ্ত সংস্করণ

  • lerobot 0.6.1 v3.0 রেকর্ড করে; GR00T N1.7 এবং N1.5 v2.1 চায়। রেকর্ড চাপার আগে ফরম্যাট ঠিক করুন।
  • চারটি কমান্ড: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record। ক্যালিব্রেশন থেকে একই --robot.id এবং --teleop.id রেকর্ডিং সেশনে নিয়ে যান।
  • প্রকৃত ডিফল্ট: 30 fps, প্রতি এপিসোডে 60 s, 60 s রিসেট, 50 এপিসোড, প্রায় 100 মিনিটের ওয়াল ক্লক।
  • এখানে ন্যূনতম এপিসোড: SmolVLA এর জন্য 30, বাকিদের জন্য 50।
  • বৈচিত্র্য পরিমাণের চেয়ে ভালো। ডেটাসেট চারটি কারণে নষ্ট হয়: ক্যামেরা সূচক অদলবদল, ড্রপড বা ফ্রিজড ফ্রেম, একটি জয়েন্ট তার সীমায় পার্ক করা, একটি অপাঠ্য টাস্ক স্ট্রিং।

একটি রেকর্ডিং সেশন কী ক্যাপচার করে

একটি LeRobot ডেটাসেট ভিডিওর একটি ফোল্ডার নয় বরং ভিডিও সংযুক্ত একটি সময়-সূচীকৃত সারণী: প্রতিটি কন্ট্রোল-লুপ টিক একটি সারি লেখে যেখানে নির্দেশিত অ্যাকশন, ফলোয়ারের পৌঁছানো অবস্থা, প্রতি ক্যামেরায় একটি ফ্রেম, একটি টাইমস্ট্যাম্প এবং সূচক থাকে। পলিসি শুধুমাত্র সেই কলামগুলি দেখে। এর স্কিমা lerobot/svla_so100_pickplace, যা এর meta/info.json থেকে পড়া হয়েছে।

বৈশিষ্ট্যডেটাটাইপআকৃতিএটি কী
actionfloat32[6]লিডার আর্ম থেকে জয়েন্ট টার্গেট
observation.statefloat32[6]ফলোয়ারের পৌঁছানো জয়েন্ট পজিশন
observation.images.topvideo[480, 640, 3]দৃশ্য ক্যামেরা, MP4 (এখানে av1)
observation.images.wristvideo[480, 640, 3]রিস্ট ক্যামেরা, একই হারে
timestampfloat32[1]এপিসোড শুরু হওয়ার পর থেকে সেকেন্ড
frame_index, episode_index, index, task_indexint64[1]স্বয়ংক্রিয়ভাবে পূরণ করা হিসাবরক্ষণ

জয়েন্টগুলি হল main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll এবং main_gripper: SO-100 এর ছয়টি ডিগ্রী অফ ফ্রিডম। অ্যাকশন এবং স্টেট একই আকৃতি ভাগ করে কারণ লিডার-ফলোয়ার টেলিঅপারেশন একটি টার্গেট এবং এক ধাপ পরে পৌঁছানো অবস্থান রেকর্ড করে। এই ব্যবধানটি তথ্য: যেখানে আর্ম মাধ্যাকর্ষণ বা আটকে থাকা বস্তুর সাথে লড়াই করেছে। এই স্ট্রিংগুলি সেই ডেটাসেটের। আজ 0.6.1 দিয়ে রেকর্ড করা একটি সেশন shoulder_pan.pos থেকে gripper.pos পর্যন্ত লেখে, বাসে আইডি 1 থেকে 6: একই ছয়টি জয়েন্ট, ভিন্ন কী, যা একটি কনফিগ যখন একটি বৈশিষ্ট্যকে নাম দিয়ে সম্বোধন করে তখন গুরুত্বপূর্ণ।

একটি বাস্তব ডেটাসেট থেকে একটি মানদণ্ড

সেই ডেটাসেটে 30 fps এ 50টি এপিসোড এবং 19,631টি ফ্রেম রয়েছে: প্রতি এপিসোডে প্রায় 393টি ফ্রেম, বা 13 সেকেন্ড। যদি আপনারগুলি গড়ে এক মিনিট হয়, তাহলে আপনি আরও কঠিন কিছু করছেন অথবা উভয় প্রান্তে ডেড টাইম রেকর্ড করছেন।

LeRobot ডেটাসেট ফরম্যাটের জন্য AY-Robots গ্লসারি এন্ট্রি, যা ডিরেক্টরি লেআউট এবং মেটাডেটা ফাইলগুলি দেখাচ্ছে।
data/, videos/ এবং meta/-তে কী থাকে এবং কোন নীতিগুলি কোন সংস্করণ পড়ে।

বেঞ্চে আপনার যা প্রয়োজন

আইটেমবিস্তারিতনোট
ফলোয়ার আর্মSO-100, ছয়টি Feetech STS3215 সার্ভোযন্ত্রাংশে প্রায় 110 থেকে 150 EUR
লিডার আর্মএকটি দ্বিতীয় SO-100, গিয়ার্স সরানো হয়েছেছয়টি লিডার মোটরের সব গিয়ার্স সরানো হয়েছে: শুধুমাত্র এনকোডার, কম ঘর্ষণ
পাওয়ারবিল অফ মেটেরিয়ালসে থাকা 7.4 V STS3215 ভেরিয়েন্টের সাথে মিলে যায়নিচের সতর্কতা দেখুন
ক্যামেরাদুটি USB ক্যামেরা, 640x480 @ 30 fpsএকটি দৃশ্য ভিউ, একটি কব্জিতে
হোস্টPython 3.12 বা নতুন, ffmpegrequires-python >= 3.12
হাব অ্যাকাউন্টHugging Face রাইট টোকেনoptional with --dataset.push_to_hub=false
7.4 V, 12 V নয়

STS3215 দুটি সংস্করণে আসে: SO-ARM100 README 7.4 V সংস্করণকে 6 V-এ পরিমাপ করা 16.5 kg.cm স্টল টর্ক এবং 12 V সংস্করণকে 30 kg.cm রেট দেয়, এবং উল্লেখ করে যে 12 V মোটর নিলে 5 V সাপ্লাইয়ের পরিবর্তে একটি 12 V 5 A+ সাপ্লাই কিনতে হবে। বিল অফ মেটেরিয়ালসে 7.4 V সার্ভো তালিকাভুক্ত আছে। 7.4 V রেট করা সার্ভোগুলিতে 12 V দিলে সেগুলি নষ্ট হয়ে যায়, তাই কিছু তার লাগানোর আগে মোটরের লেবেল পড়ুন। সার্ভো সাড়া দিচ্ছে না

যদি বাহুটি এখনও তৈরি না হয়ে থাকে, তবে এটি একটি আলাদা সন্ধ্যার কাজ: শুরু করুন SO-100 শুরু করা এবং সম্পূর্ণ SO-100 সেটআপ গাইড। যদি আপনি কিছু না কিনে থাকেন, তবে প্রথমে SO-100 বনাম SO-101 তুলনা পড়ুন: SO-101 হল নতুন সংস্করণ যা উন্নত ওয়্যারিং এবং গিয়ার-অপসারণ ধাপ ছাড়াই আসে, এবং রেকর্ডিং ওয়ার্কফ্লো একই।

lerobot 0.6.1 ইনস্টল করুন

bash
conda create -y -n lerobot python=3.12
conda activate lerobot

# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge

# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech     = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'

lerobot-info
lerobot-info একটি সিস্টেম সারাংশ প্রিন্ট করে, যার মধ্যে PATH-এ খুঁজে পাওয়া ffmpeg সংস্করণও অন্তর্ভুক্ত।

অতিরিক্ত জিনিসগুলিই বেশিরভাগ মানুষকে বিভ্রান্ত করে। pip install lerobot শুধুমাত্র মূল ML নির্ভরতা ইনস্টল করে, রোবটের সাথে কথা বলার মতো কিছু নয়। Koch আর্মগুলির জন্য dynamixel এর পরিবর্তে feetech প্রয়োজন। যদি আপনার শেল কখনও lerobot-record সম্পর্কে না শুনে থাকে, তবে এটিই তার কারণ।

পোর্ট, মোটর আইডি এবং ক্যালিব্রেশন

যন্ত্রাংশ এবং একটি কার্যকরী টেলিপ অপারেশন লুপের মধ্যে তিনটি এককালীন ধাপ রয়েছে। আপনার আর্মের উপর প্রশিক্ষিত একটি পলিসিকে অন্যের উপর চালানোর জন্য, কাঁচা এনকোডার গণনাকে একটি সাধারণ জয়েন্ট কনভেনশনে ম্যাপ করে।

  1. 1
    প্রতিটি আর্মের USB পোর্ট খুঁজুন

    দুটি আর্মই প্লাগ ইন করে এটি চালান, যখন প্রম্পট করা হবে তখন যেটিকে শনাক্ত করছেন সেটিকে আনপ্লাগ করুন এবং কোন পোর্টটি অদৃশ্য হয়ে যায় তা নোট করুন। লিনাক্সে আপনার sudo chmod 666 /dev/ttyACM0 প্রয়োজন হতে পারে।

    bash
    lerobot-find-port
    # Finding all available ports for the MotorsBus.
    # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1']
    # Remove the USB cable from your MotorsBus and press Enter when done.
    # The port of this MotorsBus is '/dev/ttyACM1'
    # Reconnect the USB cable.
  2. 2
    মোটর আইডি এবং বাউডরেট লিখুন

    আইডিগুলি একবারে একটি মোটর করে লেখা হয়, এবং ডকুমেন্টেশন এই বিষয়ে কঠোর: কন্ট্রোলার বোর্ডের সাথে ঠিক একটি মোটর সংযুক্ত করুন, অন্য কোনোটির সাথে এখনও ডেইজি-চেইন করা হয়নি। স্ক্রিপ্টটি চেইনটিকে পিছন দিকে চলে, প্রথমে গ্রিপারের জন্য প্রম্পট করে এবং এটিকে আইডি 6 দেয়, তারপর রিস্ট-রোলকে 5, এবং শোল্ডার-প্যানকে 1 পর্যন্ত। এটি অ্যাসেম্বলির আগে করুন।

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    উভয় আর্ম ক্যালিব্রেট করুন

    প্রতিটি জয়েন্টকে তার পরিসরের মাঝখানে সরান, এন্টার চাপুন, তারপর প্রতিটি জয়েন্টকে তার সম্পূর্ণ পরিসরের মধ্য দিয়ে ঘোরান। id প্রোফাইল ফাইলের নাম হয়ে যায়।

    bash
    lerobot-calibrate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower
    
    lerobot-calibrate \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader
  4. 4
    কিছু রেকর্ড করার আগে টেলিপ অপারেট করুন

    উপরের সবকিছুর জন্য গ্রহণযোগ্যতা পরীক্ষা। যদি টেলিপ অপারেশন ঝাঁকুনিপূর্ণ, মিরর করা হয়, বা একটি জয়েন্ট অনুসরণ না করে, তাহলে রেকর্ডিং 50টি এপিসোডে তা সংরক্ষণ করে।

    bash
    lerobot-teleoperate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader \
        --display_data=true
ক্যালিব্রেশন কোথায় যায় এবং আইডি কেন গুরুত্বপূর্ণ

প্রোফাইলগুলি $HF_LEROBOT_CALIBRATION-এ যায়, ডিফল্ট ~/.cache/huggingface/lerobot/calibration, এবং আইডি হল লুকআপ কী। lerobot-record-কে একটি ক্যালিব্রেটেড আইডি দিলে এটি প্রোফাইলটি পুনরায় ব্যবহার করার জন্য এন্টার বা পুনরায় করার জন্য c অফার করে। এটিকে একটি অজানা আইডি দিলে কোনো ফাইল থাকে না, তাই এটি সেশনের মাঝখানে ক্যালিব্রেশনে চলে যায়।

ক্যামেরাগুলি নীতি কী দেখে তা নির্ধারণ করে

bash
lerobot-find-cameras opencv   # or: lerobot-find-cameras realsense

# --- Detected Cameras ---
# Camera #0:
#   Name: OpenCV Camera @ 0
#   Type: OpenCV
#   Id: 0
#   Backend api: AVFOUNDATION
#   Default stream profile:
#     Format: 16.0
#     Width: 1920
#     Height: 1080
#     Fps: 15.0
প্রতিটি সেশনে এটি চালান: ডকুমেন্টেশন সতর্ক করে যে অপারেটিং সিস্টেমের উপর নির্ভর করে রিবুট বা পুনরায় সংযোগের পরে এই শনাক্তকারীগুলি পরিবর্তিত হতে পারে।

দুটি ভিউ, এবং তাদের অবস্থান গুরুত্বপূর্ণ: একটি স্থির দৃশ্য ক্যামেরা যা ওয়ার্কস্পেসকে কভার করে, এবং একটি রিস্ট ক্যামেরা যা এর কাছাকাছি এন্ড-ইফেক্টর দেখাচ্ছে গ্রিপার কী স্পর্শ করতে চলেছে। LeRobot কমিউনিটি-ডেটা সেট চেকলিস্টে 480x640 / 720p বা তার চেয়ে ভালো দুটি ভিউ, একটি স্থির ব্যাকগ্রাউন্ড, নিরপেক্ষ স্থিতিশীল আলো, এবং লিডার আর্ম ও মানুষের অঙ্গ-প্রত্যঙ্গ ফ্রেমের বাইরে রাখার কথা বলা হয়েছে। রেকর্ডিং গাইড একটি সাধারণ নিয়ম যোগ করে: শুধুমাত্র ক্যামেরার ছবি দেখে আপনার নিজের কাজটি করতে সক্ষম হওয়া উচিত।

ক্যামেরা সূচক একটি স্থিতিশীল পরিচয় নয়

OpenCV সূচকগুলি গণনা ক্রম থেকে আসে, তাই একটি রিবুট বা পুনরায় সংযোগের ফলে সূচক 0 এবং 2 স্থান পরিবর্তন করতে পারে এবং পুরো সেশনের জন্য রিস্ট ভিউকে উপরের স্লটে রাখতে পারে। lerobot নিজেই এটি বলে: এর ক্যামেরা ক্লাস একটি ডিভাইস পাথ এবং একটি পূর্ণসংখ্যা উভয়ই নেয়, এবং সতর্ক করে যে সূচকগুলি রিবুট বা পোর্ট পরিবর্তনের ক্ষেত্রে অস্থির, বিশেষ করে লিনাক্সে। index_or_path কে /dev/v4l/by-id/ এর অধীনে udev সিমলিঙ্কের দিকে নির্দেশ করুন, যা গণনা ক্রমের পরিবর্তে ডিভাইসটিকে অনুসরণ করে। এটি ডেটা সেট অভ্যন্তরীণভাবে অসামঞ্জস্যপূর্ণ হওয়ার সবচেয়ে সাধারণ উপায়, এবং প্রশিক্ষণ এটি মেরামত করতে পারে না। ক্যামেরা সনাক্ত করা যায়নি

রেকর্ড কমান্ড এবং প্রতিটি ফ্ল্যাগ

bash
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')

lerobot-record \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_so100_follower \
    --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_so100_leader \
    --display_data=true \
    --dataset.repo_id=${HF_USER}/so100_pick_cube \
    --dataset.single_task="Pick the red cube and drop it in the box" \
    --dataset.num_episodes=50 \
    --dataset.fps=30 \
    --dataset.episode_time_s=25 \
    --dataset.reset_time_s=10 \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2
ক্যামেরা ডিক্ট একটি শেল-উদ্ধৃত স্ট্রিং; নেস্টেড বন্ধনীগুলি শেল সিনট্যাক্স নয়।

নিচের ডিফল্টগুলি এসেছে src/lerobot/configs/dataset.py মেইন থেকে, কোনো টিউটোরিয়াল থেকে নয়। এর মধ্যে বেশ কয়েকটি এমন নয় যা লোকেরা অনুমান করে।

ফ্ল্যাগডিফল্টএটি কী করে
--dataset.repo_idemptyনাম; ডিফল্টরূপে টাইমস্ট্যাম্প যুক্ত করা হয়
--dataset.single_taskemptyপ্রতিটি এপিসোডের সাথে সংরক্ষিত টাস্ক স্ট্রিং
--dataset.root$HF_LEROBOT_HOME/repo_idরাইট পাথ, ডিফল্ট ~/.cache/huggingface/lerobot/
--dataset.fps30কন্ট্রোল লুপ রেট এবং ডেটাসেট ফ্রেম রেট
--dataset.episode_time_s60একটি এপিসোড স্বয়ংক্রিয়ভাবে এগিয়ে যাওয়ার আগে সেকেন্ড
--dataset.reset_time_s60দৃশ্য রিসেট; আর্ম নড়ে, কিছু সংরক্ষিত হয় না
--dataset.num_episodes50এই সেশনে রেকর্ড করা এপিসোড
--dataset.push_to_hubtrueসেশন শেষে আপলোড; ফলস থাকলে স্থানীয় থাকে
--dataset.streaming_encodingfalse in the dataclass, true in the docs tableক্যাপচারের সময় এনকোড করুন; এটি স্পষ্টভাবে সেট করুন
--dataset.encoder_queue_maxsize30প্রতি ক্যামেরায় বাফার করা ফ্রেম, ~1 s at 30 fps
--dataset.encoder_threadsnull (codec decides)প্রতি এনকোডারে থ্রেড; ক্যাপচার আটকে গেলে কমিয়ে দিন
--dataset.no_stampfalserepo_id ঠিক যেমন টাইপ করা হয়েছে তেমনই রাখুন
--resumefalseএকটি বিদ্যমান ডেটাসেটে যুক্ত করুন; --dataset.root প্রয়োজন
দুটি ফ্ল্যাগ যা অপ্রত্যাশিতভাবে এক ঘন্টা নষ্ট করে

আপনার ডেটাসেটের নাম আপনি যা টাইপ করেছেন তা নয়। lerobot একটি তারিখ-সময় ট্যাগ যুক্ত করে, তাই so100_pick_cube হয়ে যায় so100_pick_cube_20260823_141530। একটি স্থিতিশীল নামের জন্য --dataset.no_stamp=true ব্যবহার করুন। পুনরায় শুরু করা মোট সংখ্যা নয়, সংযোজন গণনা করে। --resume=true সহ, --dataset.num_episodes অতিরিক্ত পর্বগুলি গণনা করে এবং --dataset.root বাধ্যতামূলক হয়ে যায়। একটি 30-পর্বের ডেটাসেটে 50 চাইলে আপনি 80 পাবেন।

একটি সেশনের সময় কীবোর্ড নিয়ন্ত্রণ

  • ডান তীর বা n: পর্ব শেষ করুন বা পর্যায়টি তাড়াতাড়ি রিসেট করুন। এটি আপনি সবচেয়ে বেশি ব্যবহার করেন, কারণ একটি পরিষ্কার গ্রাস খুব কমই 25 সেকেন্ডের বেশি সময় নেয়।
  • বাম তীর বা r: পর্বটি বাতিল করুন এবং পুনরায় করুন। একটি খারাপ টেক এখন কিছুই খরচ করে না এবং পরে অনেক খরচ করে।
  • Escape বা q: সেশন বন্ধ করুন, এনকোডিং শেষ করুন, আপলোড করুন।
  • এগুলি X11, Wayland এবং হেডলেস SSH-এ কাজ করে: কোনো গ্লোবাল কী ব্যাকএন্ড না থাকলে, lerobot-record নিয়ন্ত্রণকারী টার্মিনাল থেকে একই কীগুলি পড়ে। অক্ষরগুলি ল্যাগি SSH লিঙ্কগুলিতে টিকে থাকে, যেখানে তীর ক্রমগুলি বিভক্ত হয়।
  • কীবোর্ড টেলিঅপারেশন ভিন্ন এবং এর জন্য একটি গ্লোবাল ব্যাকএন্ড প্রয়োজন: X11, Windows, অথবা অ্যাক্সেসিবিলিটি সহ macOS।

কতগুলি পর্ব, এবং একটি ভালো পর্ব কেমন দেখতে হয়

রেকর্ডিং নির্দেশিকা একটি প্রথম কাজের জন্য কমপক্ষে 50টি পর্বের পরামর্শ দেয়, প্রতি বস্তুর অবস্থানে প্রায় 10টি। নীতি পৃষ্ঠাগুলি প্রতি মডেলের জন্য একটি ন্যূনতম তালিকা করে, যার নিচে একটি রান GPU সময়ের যোগ্য নয়।

নীতিসর্বনিম্ন পর্বডেটা সেট বিন্যাসGPU স্তরপ্রতি রানের খরচ
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBabout 4 to 12 USD

ভালো প্রশ্ন হলো কতগুলো কী। Data Scaling Laws in Imitation Learning for Robotic Manipulation (লিন এট আল।, 2024) 40,000 এর বেশি প্রদর্শনী সংগ্রহ করেছে এবং 15,000 এর বেশি বাস্তব-বিশ্বের রোলআউট চালিয়েছে। সাধারণীকরণ পরিবেশ এবং বস্তু এর সংখ্যার সাথে প্রায় একটি পাওয়ার-ল সম্পর্ক অনুসরণ করেছে, এবং প্রতি পরিবেশ বা বস্তুর জন্য একটি নির্দিষ্ট সীমা অতিক্রম করার পর, অতিরিক্ত প্রদর্শনীগুলির প্রভাব ছিল নগণ্য। একটি বেঞ্চে: বস্তুটি সরান, আলো পরিবর্তন করুন, কিউবটি অদলবদল করুন, একটি টেক পুনরাবৃত্তি করার পরিবর্তে।

ডেটা উৎস হিসাবে লিডার-ফলোয়ার টেলিঅপারেশন
সুবিধা
  • কন্টিনিউয়াস জয়েন্ট ট্র্যাজেক্টরি যা একটি সার্ভো পুনরুৎপাদন করতে পারে, কীবোর্ড বা গেমপ্যাডের মতো নয়
  • অ্যাকশন এবং স্টেট একটি স্থানাঙ্ক কনভেনশন শেয়ার করে, তাই নীতি এমন একটি লক্ষ্য শেখে যা এটি সরাসরি কমান্ড করতে পারে
  • একটি 25 সেকেন্ডের পর্ব এবং একটি 10 সেকেন্ডের রিসেট প্রতি ঘন্টায় প্রায় 100টি পর্ব হয়
  • অপারেটর ফলোয়ারের স্টল বা বাইন্ড অনুভব করে, তাই ডেটা কমিট করার আগে ত্রুটিগুলি প্রকাশ পায়
বিনিময়
  • একটি দ্বিতীয় বাহু যন্ত্রাংশের খরচ প্রায় দ্বিগুণ করে
  • প্রদর্শনীগুলি অপারেটরের অভ্যাস উত্তরাধিকার সূত্রে পায়; মান্ডলেকার এট আল. দেখেছেন যে নীতির গুণমান প্রদর্শনীর গুণমানের উপর heavily নির্ভর করে
  • লিডার লুপ রেটে নমুনা করা হয়, তাই বিরতিগুলি প্রায় অভিন্ন সারিতে পরিণত হয় যা নীতিকে অপেক্ষা করতে শেখায়
  • সেশনগুলির মধ্যে সামঞ্জস্য নিশ্চিত করার মতো কিছুই নেই: একটি ক্যামেরা 5 সেমি নড়াচড়া করলে তা একটি লুকানো বিতরণ পরিবর্তন

একটি ভালো পর্ব বিরক্তিকর: পুনরাবৃত্তিযোগ্য হোম পোজ, একটি কাজ সম্পন্ন, বস্তুটি বিনে রাখার পর শেষ, চেকলিস্ট দ্বারা প্রস্তাবিত ২৫ থেকে ৫০ অক্ষরের মধ্যে টাস্ক স্ট্রিং। লাল কিউবটি তুলে বাক্সে ফেলুন একটি টাস্ক স্ট্রিং; task1 হলো একটি অ্যান্টি-প্যাটার্ন যা চেকলিস্ট স্পষ্টভাবে উল্লেখ করে। অস্পষ্ট টীকাগুলি এর সমস্যার তালিকার শীর্ষে রয়েছে এবং এগুলি সবচেয়ে গুরুত্বপূর্ণ ভিশন-ল্যাঙ্গুয়েজ-অ্যাকশন মডেলগুলির, যেখানে স্ট্রিংটি একটি মডেল ইনপুট, কোনো ফাইলের নাম নয়।

ত্রুটি যা নীরবে একটি ডেটাসেট নষ্ট করে

কোনোটিই ব্যতিক্রম ঘটায় না। সবগুলি প্রশিক্ষণে টিকে থাকে, একটি ভালো দেখতে লস কার্ভ এবং কিছুই না করা একটি রোবট হিসাবে প্রকাশ পায়। দৃশ্য সেট আপ করার সময় পরীক্ষা করুন।

ত্রুটিএটি কেমন দেখায়এটি কোথা থেকে আসেএটি কিভাবে ধরা যায়
ক্যামেরা ভিউ অদলবদলউপরের কী-এর নিচে কব্জির ছবিপুনরায় প্লাগ করার পর সূচক পুনঃনির্ধারণlerobot-find-cameras প্রতিটি সেশনে; by-id paths
স্থির ফ্রেমডজন ডজন সারির জন্য একই ছবিক্যামেরা সরবরাহ বন্ধ করে দেয়; লুপ শেষ ফ্রেমটি পুনরাবৃত্তি করেlerobot-dataset-viz এ এটি স্ক্রাব করুন
বাদ পড়া ফ্রেমfps গুণ সেকেন্ডের নিচে সারির সংখ্যাকিউ উপচে পড়ে, ব্লক করার পরিবর্তে বাদ দেয়'Encoder queue full' in the log; rows vs fps times duration
জয়েন্ট তার সীমায়একটি জয়েন্ট সর্বনিম্ন বা সর্বোচ্চ সীমায় সমতলনেতার পরিসর অনুসরণকারীর চেয়ে বেশি, অথবা একটি খারাপ মধ্যবর্তী পোজds.meta.stats এ প্রতি-জয়েন্ট min/max; lerobot-find-joint-limits আগে থেকে
ছবি এবং অ্যাকশন বেমানাননীতি প্রত্যাশা করে বা পিছিয়ে থাকেলুপের চেয়ে ভিন্ন fps এ ক্যামেরাkeep every camera at --dataset.fps
নিষ্ক্রিয় সময়একই অ্যাকশন সারির দীর্ঘ ধারাঅপারেটর রেকর্ডার চালু রেখে বিরতি দিয়েছেনপরপর একই অ্যাকশন সারির অংশ
অব্যবহারযোগ্য টাস্ক স্ট্রিংtask1, demo2, testদ্রুত টাইপ করাv3.0 এ meta/tasks.parquet (v2.1 এ এটি meta/tasks.jsonl ছিল); lerobot-edit-dataset modify_tasks দিয়ে ঠিক করুন
ড্রপ হওয়া ফ্রেমগুলি নিজেদের লুকিয়ে রাখে

এনকোডার প্রতিটি ক্যামেরার জন্য একটি সীমাবদ্ধ কিউ (queue) ধারণ করে, ডিফল্টরূপে 30টি ফ্রেম। যখন এটি তাল মেলাতে পারে না, তখন ফ্রেমগুলি ব্লক না হয়ে ড্রপ করা হয়: ক্যাপচার চলতে থাকে এবং কিছুই ক্র্যাশ করে না। আপনি Encoder queue full for {camera}, dropped N frame(s) এবং পর্বের শেষে প্রতি ক্যামেরার জন্য একটি মোট সংখ্যা পাবেন। lerobot থ্রেশহোল্ড: প্রায় 5 শতাংশ অনুপস্থিতি একটি ওভারলোড হওয়া সিস্টেমকে বোঝায়, 2 শতাংশ প্রত্যাশিত স্টার্টআপ লোড। সমাধানের ক্রম: --display_data=false, --dataset.encoder_threads কমানো, vcodec=h264, স্ট্রিমিং বন্ধ করা।

একটি সতর্কতা: স্ট্রিমিং-এনকোডিং গাইডের সারণীতে ডিফল্ট হিসাবে তালিকাভুক্ত করা হয়েছে True, যখন মেইনের ডেটাক্লাস পড়ে streaming_encoding: bool = False। ডকুমেন্টেশন এবং কোড একমত নয়, তাই এটি স্পষ্টভাবে সেট করুন; lerobot যখনই ফ্ল্যাগ বন্ধ করে শুরু হয় তখনই এটি সুপারিশ করে একটি ইঙ্গিত লগ করে।

একটি GPU ভাড়া করার আগে ডেটাসেট পরীক্ষা করুন

ডকুমেন্টেশন থেকে গ্রহণযোগ্যতা পরীক্ষা: CLI দ্বারা রিপোর্ট করা পর্বের সময়কালের সাথে ভিডিওর সময়কাল তুলনা করুন এবং নিশ্চিত করুন যে সারির সংখ্যা fps গুণ সময়কালের সমান। প্রতি পর্বে, মোট সংখ্যার উপর নয়।

python
from lerobot.datasets import LeRobotDataset

ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)

# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])

# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])
একটি পর্ব যা fps গুণ সময়কাল থেকে অনেক দূরে, তা প্রশিক্ষণের জন্য নয়, বরং মুছে ফেলার জন্য একটি প্রার্থী।

তারপর এটি দেখুন। lerobot-dataset-viz ক্যামেরা ভিউয়ের পাশে জয়েন্ট ট্রেস সহ একটি পর্ব ফ্রেম বাই ফ্রেম রি-প্লে করে, Rerun বা Foxglove-এ। অদলবদল করা ক্যামেরা এবং স্থির ফ্রেম দশ সেকেন্ডের মধ্যে দেখা যায়। লোকেরা এই ধাপটি এড়িয়ে যায়।

bash
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0

# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0 \
    --display-mode foxglove

# Drop the episodes that did not survive review
lerobot-edit-dataset \
    --repo_id your-user/so100_pick_cube_20260823_141530 \
    --new_repo_id your-user/so100_pick_cube_clean \
    --operation.type delete_episodes \
    --operation.episode_indices "[3, 17, 41]"
lerobot-edit-dataset স্প্লিট, মার্জ, রিমুভ_ফিচার, মডিফাই_টাস্ক এবং পরিসংখ্যান পুনঃগণনাও করে। উদারভাবে মুছে ফেলুন: একটি খারাপ পর্বের জন্য একটি পর্বের খরচ হয়; এটি রেখে দিলে এর উপর প্রশিক্ষিত প্রতিটি রানের খরচ হয়।
AY-Robots ডেটাসেট ডিরেক্টরি যেখানে পর্বের সংখ্যা এবং ফরম্যাট সহ পাবলিক LeRobot ডেটাসেটগুলি তালিকাভুক্ত করা হয়েছে।
তুলনীয় ডেটাসেটগুলি কীভাবে আকার এবং টীকা করা হয়।

v2.1 অথবা v3.0: রেকর্ড করার আগে সিদ্ধান্ত নিন

v2.1 প্রতিটি পর্বের জন্য একটি parquet এবং একটি MP4 ফাইল লিখত। v3.0 অনেক পর্বকে ভাগ করা শার্ডে একত্রিত করে এবং মেটাডেটা থেকে সীমানা পুনর্গঠন করে, তাই info.json পাথ টেমপ্লেট বহন করে যেমন data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet একটি পর্ব নম্বরের পরিবর্তে। এর মূল কারণ হলো কম, বড় ফাইল: দ্রুত ইনিশিয়ালাইজেশন এবং স্কেলে কম ফাইল-সিস্টেম চাপ।

LeRobot v2.1LeRobot v3.0
বিন্যাসপ্রতিটি পর্বের জন্য একটি parquet এবং একটি MP4প্রতিটি শার্ডে অনেক পর্ব
পর্বের মেটাডেটাJSONL filesmeta/episodes/ এর অধীনে chunked parquet, ডেটাসেট স্ট্যাকের মাধ্যমে
হাব থেকে স্ট্রিমিংনাহ্যাঁ, StreamingLeRobotDataset এর মাধ্যমে
lerobot 0.6.1 দ্বারা লিখিতনাহ্যাঁ, যা আপনি আজ পান
GR00T N1.7 এবং N1.5 দ্বারা পঠিতহ্যাঁনা, অবশ্যই রূপান্তর করতে হবে
আজ রেকর্ডিং, আগামীকাল GR00T প্রশিক্ষণ

lerobot 0.6.1 v3.0 লেখে, কিন্তু GR00T N1.7 এবং N1.5 v2.0 অথবা v2.1 পড়ে এবং এতে ক্র্যাশ করে। ভ্রমণের দিকটি লক্ষ্য করুন: src/lerobot/scripts/ ধারণ করে convert_dataset_v21_to_v30.py এবং অন্য কোনো দিকে কিছু যায় না। সেশনের আগে এটি নিষ্পত্তি করুন। সমাধান: v3 হিসাবে ডেটাসেট প্রত্যাখ্যাত

bash
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id=your-user/so100_pick_cube

# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id=your-user/so100_pick_cube \
    --root=/path/to/dataset/directory \
    --push-to-hub=false
50টি এপিসোডের জন্য দ্রুত। স্কেল একটি ভিন্ন কাজ: lerobot-এর পোর্টিং গাইড, কাঁচা DROID থেকে v3.0-এ, 7+ দিনের স্থানীয় প্রক্রিয়াকরণ এবং প্রায় 400 GB বাজেট করে।

একই ডেটাসেটে যাওয়ার দুটি পথ

উপরের সবকিছু, আপনার নিজের মেশিনে: আপনি USB গণনা, ffmpeg বিল্ড, এনকোডার টিউনিং এবং ক্রমাঙ্কন ফাইলগুলির মালিক। পাইপলাইন বুঝতে, একটি অস্বাভাবিক ক্যামেরা রিগ চালাতে বা ডেটা স্থানীয় রাখতে এটিই সঠিক পথ।

এই পথের খরচ

সময়: প্রতিটি বাহু একত্রিত করতে এক সন্ধ্যা, একটি জটিল প্রথম ক্রমাঙ্কন, এবং একটি প্রথম সেশন যা আপনি বাতিল করবেন কারণ একটি ক্যামেরা ভুল স্লটে ছিল।

পাইপলাইন নিজে তার না করে LeRobot ডেটাসেট রেকর্ড করুন

AY-Robots ডেস্কটপ ক্লায়েন্ট একটি টেলিপেরেশন সেশন থেকে LeRobot ফরম্যাটে এপিসোড, ক্যামেরা স্ট্রিম এবং জয়েন্ট স্টেট রেকর্ড করে, তারপর ডেটাসেটটি প্রশিক্ষকের কাছে হস্তান্তর করে।

ডেস্কটপ ক্লায়েন্ট পান

ডেটা সেট থেকে পলিসি

পঞ্চাশটি পরিষ্কার এপিসোড প্রতিটি রানকে এখানে ফিড করে। আপনার টাস্কে একা স্ক্র্যাচ থেকে প্রশিক্ষণ নেয়, প্রায় 80 M প্যারামিটার প্রতি অ্যাকশন স্টেপে প্রায় 20 ms গতিতে, পাঁচটি মডেলের মধ্যে এটিই একমাত্র যা দ্রুত গতির সাথে স্বাচ্ছন্দ্য বোধ করে। একটি 24 GB কার্ডে প্রায় 450 M প্যারামিটার ব্যবহার করে। একটি প্রায় 3 B প্যারামিটার ফাউন্ডেশন মডেল যেখানে প্রায় 40 M প্যারামিটার স্পর্শ করে, একটি A100 বা H100 প্রয়োজন, এবং সেই v2.1 ডেটা সেট চায়।

এরপর, আপনার কম্বিনেশনের জন্য গাইড: , অথবা ; প্রথম রানের জন্য, সংক্ষিপ্ত। যখন পলিসি বেঞ্চে কাজ করে কিন্তু টেবিল সরানোর সাথে সাথেই ভেঙে পড়ে, তখন সেটি একটি ডেটা সমস্যা: এবং বৈচিত্র্যের উপর গভীরভাবে আলোচনা করে।

একটি প্রথম কার্যকরী পলিসির জন্য আমার আসলে কতগুলি এপিসোড প্রয়োজন?

SmolVLA-এর জন্য ত্রিশটি, ACT, Pi0.5, GR00T N1.5 এবং N1.7-এর জন্য পঞ্চাশটি, যা AY-Robots প্রশিক্ষকরা সর্বনিম্ন হিসাবে প্রয়োগ করে। LeRobot গাইড স্বাধীনভাবে একটি প্রথম কাজের জন্য কমপক্ষে 50টি এপিসোড সুপারিশ করে, প্রতি অবজেক্ট লোকেশনে প্রায় 10টি। ডেটা-স্কেলিং গবেষণায় দেখা গেছে যে জেনারেলাইজেশন প্রদর্শনের সংখ্যার চেয়ে পরিবেশ এবং বস্তুর সাথে স্কেল করে, তাই একটি দৃশ্যের একশটি টেক পাঁচটি ভিন্ন স্থানে পঞ্চাশটির চেয়ে খারাপ।

আমার কি একটি লিডার আর্মের প্রয়োজন, নাকি আমি কীবোর্ড দিয়ে টেলিঅপারেট করতে পারি?

lerobot কীবোর্ড এবং গেমপ্যাড টেলিঅপারেটর সরবরাহ করে, তাই একটি লিডার আর্ম কঠোরভাবে বাধ্যতামূলক নয়, তবে এটি অত্যন্ত পছন্দনীয়: লিডার-ফলোয়ার রেকর্ড করা অ্যাকশনের কোঅর্ডিনেট কনভেনশনে অবিচ্ছিন্ন জয়েন্ট ট্র্যাজেক্টরি দেয়, যখন কীবোর্ড ইনপুট স্টেপড মোশন তৈরি করে যা একটি পলিসি জার্ক হিসাবে শেখে। কীবোর্ড টেলিঅপারেশনের জন্য একটি গ্লোবাল কী ব্যাকএন্ডও প্রয়োজন, তাই এটি Wayland এবং হেডলেস সিস্টেমে ব্যর্থ হয়।

আমি কি একটি Raspberry Pi বা একটি ছোট মিনি পিসিতে রেকর্ড করতে পারি?

হ্যাঁ, টিউনিং সহ। স্ট্রিমিং-এনকোডিং গাইডে একটি লো-রিসোর্স ব্র্যাকেট রয়েছে যা আধুনিক 4-কোর মেশিন এবং Raspberry Pi 5 কভার করে, এবং এর 'কিছু টিউনিং প্রয়োজন' কলামে 640x480 রেজোলিউশন এবং 30 fps-এ দুটি ক্যামেরা রাখে। এর পরামর্শ: --dataset.rgb_encoder.vcodec=h264 এবং --dataset.streaming_encoding=false এর মাধ্যমে এনকোডারকে ক্যাপচার লুপের সাথে প্রতিযোগিতা করা থেকে বিরত রাখুন। এটি 640x480 রেজোলিউশনের দুটি ক্যামেরাকে প্রতি সেকেন্ডে প্রায় 55 মিলিয়ন পিক্সেল এবং 1920x1080 রেজোলিউশনের দুটি ক্যামেরাকে প্রায় 373 মিলিয়ন পিক্সেল হিসাবে রেট করে।

আমি কিভাবে জানব যে আমি যে ডেটা সেটটি রেকর্ড করেছি সেটি আসলে সুস্থ?

তিনটি সহজ পরীক্ষা। প্রতিটি এপিসোডের ভিডিওর সময়কালকে CLI দ্বারা রিপোর্ট করা সময়কালের সাথে তুলনা করুন এবং নিশ্চিত করুন যে রো কাউন্ট প্রতি এপিসোডে fps গুণ সেই সময়কালের সমান, মোট সংখ্যার উপর নয়; এটি lerobot-এর এনকোডিং গাইড দ্বারা প্রদত্ত গ্রহণযোগ্যতা পরীক্ষা। ds.meta.stats পড়ুন, যেখানে একটি জয়েন্টের সর্বনিম্ন মান তার সর্বোচ্চ মানের সমান হলে সেটি কখনও নড়েনি। তারপর lerobot-dataset-viz-এ দুই বা তিনটি এপিসোড রিপ্লে করুন, এটিই একমাত্র উপায় যেখানে অদলবদল করা ভিউ এবং জমে থাকা ফ্রেমগুলি দেখা যায়। ড্রপড ফ্রেমের ক্ষেত্রে গাইড প্রায় 5 শতাংশ অনুপস্থিতিকে সীমা হিসাবে নির্ধারণ করে; প্রায় 2 শতাংশ স্বাভাবিক ক্ষণস্থায়ী লোড, প্রায়শই কেবল স্টার্টআপের কারণে।

আমার প্রশিক্ষণ কাজ ডেটা সেটটিকে v3.0 হিসাবে প্রত্যাখ্যান করেছে। এখন কী করব?

GR00T N1.7 এবং N1.5 LeRobot v2.0 বা v2.1 পড়ে এবং v3.0-এ ক্র্যাশ করে, যা lerobot 0.6.1 রেকর্ড করে। প্রশিক্ষণের আগে ফরম্যাটটি ঠিক করুন, অথবা এমন একটি পলিসি ব্যবহার করুন যা v3.0 নেটিভলি পড়তে পারে: Pi0.5, SmolVLA বা ACT। lerobot একটি v2.1 থেকে v3.0 কনভার্টার সরবরাহ করে এবং এর বিপরীত কিছু নেই।

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started