
একটি 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 থেকে পড়া হয়েছে।
| বৈশিষ্ট্য | ডেটাটাইপ | আকৃতি | এটি কী |
|---|---|---|---|
| action | float32 | [6] | লিডার আর্ম থেকে জয়েন্ট টার্গেট |
| observation.state | float32 | [6] | ফলোয়ারের পৌঁছানো জয়েন্ট পজিশন |
| observation.images.top | video | [480, 640, 3] | দৃশ্য ক্যামেরা, MP4 (এখানে av1) |
| observation.images.wrist | video | [480, 640, 3] | রিস্ট ক্যামেরা, একই হারে |
| timestamp | float32 | [1] | এপিসোড শুরু হওয়ার পর থেকে সেকেন্ড |
| frame_index, episode_index, index, task_index | int64 | [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 সেকেন্ড। যদি আপনারগুলি গড়ে এক মিনিট হয়, তাহলে আপনি আরও কঠিন কিছু করছেন অথবা উভয় প্রান্তে ডেড টাইম রেকর্ড করছেন।

বেঞ্চে আপনার যা প্রয়োজন
| আইটেম | বিস্তারিত | নোট |
|---|---|---|
| ফলোয়ার আর্ম | SO-100, ছয়টি Feetech STS3215 সার্ভো | যন্ত্রাংশে প্রায় 110 থেকে 150 EUR |
| লিডার আর্ম | একটি দ্বিতীয় SO-100, গিয়ার্স সরানো হয়েছে | ছয়টি লিডার মোটরের সব গিয়ার্স সরানো হয়েছে: শুধুমাত্র এনকোডার, কম ঘর্ষণ |
| পাওয়ার | বিল অফ মেটেরিয়ালসে থাকা 7.4 V STS3215 ভেরিয়েন্টের সাথে মিলে যায় | নিচের সতর্কতা দেখুন |
| ক্যামেরা | দুটি USB ক্যামেরা, 640x480 @ 30 fps | একটি দৃশ্য ভিউ, একটি কব্জিতে |
| হোস্ট | Python 3.12 বা নতুন, ffmpeg | requires-python >= 3.12 |
| হাব অ্যাকাউন্ট | Hugging Face রাইট টোকেন | optional with --dataset.push_to_hub=false |
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 ইনস্টল করুন
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অতিরিক্ত জিনিসগুলিই বেশিরভাগ মানুষকে বিভ্রান্ত করে। pip install lerobot শুধুমাত্র মূল ML নির্ভরতা ইনস্টল করে, রোবটের সাথে কথা বলার মতো কিছু নয়। Koch আর্মগুলির জন্য dynamixel এর পরিবর্তে feetech প্রয়োজন। যদি আপনার শেল কখনও lerobot-record সম্পর্কে না শুনে থাকে, তবে এটিই তার কারণ।
পোর্ট, মোটর আইডি এবং ক্যালিব্রেশন
যন্ত্রাংশ এবং একটি কার্যকরী টেলিপ অপারেশন লুপের মধ্যে তিনটি এককালীন ধাপ রয়েছে। আপনার আর্মের উপর প্রশিক্ষিত একটি পলিসিকে অন্যের উপর চালানোর জন্য, কাঁচা এনকোডার গণনাকে একটি সাধারণ জয়েন্ট কনভেনশনে ম্যাপ করে।
- 1প্রতিটি আর্মের USB পোর্ট খুঁজুন
দুটি আর্মই প্লাগ ইন করে এটি চালান, যখন প্রম্পট করা হবে তখন যেটিকে শনাক্ত করছেন সেটিকে আনপ্লাগ করুন এবং কোন পোর্টটি অদৃশ্য হয়ে যায় তা নোট করুন। লিনাক্সে আপনার
sudo chmod 666 /dev/ttyACM0প্রয়োজন হতে পারে।bashlerobot-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মোটর আইডি এবং বাউডরেট লিখুন
আইডিগুলি একবারে একটি মোটর করে লেখা হয়, এবং ডকুমেন্টেশন এই বিষয়ে কঠোর: কন্ট্রোলার বোর্ডের সাথে ঠিক একটি মোটর সংযুক্ত করুন, অন্য কোনোটির সাথে এখনও ডেইজি-চেইন করা হয়নি। স্ক্রিপ্টটি চেইনটিকে পিছন দিকে চলে, প্রথমে গ্রিপারের জন্য প্রম্পট করে এবং এটিকে আইডি 6 দেয়, তারপর রিস্ট-রোলকে 5, এবং শোল্ডার-প্যানকে 1 পর্যন্ত। এটি অ্যাসেম্বলির আগে করুন।
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3উভয় আর্ম ক্যালিব্রেট করুন
প্রতিটি জয়েন্টকে তার পরিসরের মাঝখানে সরান, এন্টার চাপুন, তারপর প্রতিটি জয়েন্টকে তার সম্পূর্ণ পরিসরের মধ্য দিয়ে ঘোরান।
idপ্রোফাইল ফাইলের নাম হয়ে যায়।bashlerobot-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কিছু রেকর্ড করার আগে টেলিপ অপারেট করুন
উপরের সবকিছুর জন্য গ্রহণযোগ্যতা পরীক্ষা। যদি টেলিপ অপারেশন ঝাঁকুনিপূর্ণ, মিরর করা হয়, বা একটি জয়েন্ট অনুসরণ না করে, তাহলে রেকর্ডিং 50টি এপিসোডে তা সংরক্ষণ করে।
bashlerobot-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 অফার করে। এটিকে একটি অজানা আইডি দিলে কোনো ফাইল থাকে না, তাই এটি সেশনের মাঝখানে ক্যালিব্রেশনে চলে যায়।
ক্যামেরাগুলি নীতি কী দেখে তা নির্ধারণ করে
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 সিমলিঙ্কের দিকে নির্দেশ করুন, যা গণনা ক্রমের পরিবর্তে ডিভাইসটিকে অনুসরণ করে। এটি ডেটা সেট অভ্যন্তরীণভাবে অসামঞ্জস্যপূর্ণ হওয়ার সবচেয়ে সাধারণ উপায়, এবং প্রশিক্ষণ এটি মেরামত করতে পারে না। ক্যামেরা সনাক্ত করা যায়নি।
রেকর্ড কমান্ড এবং প্রতিটি ফ্ল্যাগ
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_id | empty | নাম; ডিফল্টরূপে টাইমস্ট্যাম্প যুক্ত করা হয় |
| --dataset.single_task | empty | প্রতিটি এপিসোডের সাথে সংরক্ষিত টাস্ক স্ট্রিং |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | রাইট পাথ, ডিফল্ট ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | কন্ট্রোল লুপ রেট এবং ডেটাসেট ফ্রেম রেট |
| --dataset.episode_time_s | 60 | একটি এপিসোড স্বয়ংক্রিয়ভাবে এগিয়ে যাওয়ার আগে সেকেন্ড |
| --dataset.reset_time_s | 60 | দৃশ্য রিসেট; আর্ম নড়ে, কিছু সংরক্ষিত হয় না |
| --dataset.num_episodes | 50 | এই সেশনে রেকর্ড করা এপিসোড |
| --dataset.push_to_hub | true | সেশন শেষে আপলোড; ফলস থাকলে স্থানীয় থাকে |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | ক্যাপচারের সময় এনকোড করুন; এটি স্পষ্টভাবে সেট করুন |
| --dataset.encoder_queue_maxsize | 30 | প্রতি ক্যামেরায় বাফার করা ফ্রেম, ~1 s at 30 fps |
| --dataset.encoder_threads | null (codec decides) | প্রতি এনকোডারে থ্রেড; ক্যাপচার আটকে গেলে কমিয়ে দিন |
| --dataset.no_stamp | false | repo_id ঠিক যেমন টাইপ করা হয়েছে তেমনই রাখুন |
| --resume | false | একটি বিদ্যমান ডেটাসেটে যুক্ত করুন; --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 স্তর | প্রতি রানের খরচ |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 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 গুণ সময়কালের সমান। প্রতি পর্বে, মোট সংখ্যার উপর নয়।
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"])তারপর এটি দেখুন। lerobot-dataset-viz ক্যামেরা ভিউয়ের পাশে জয়েন্ট ট্রেস সহ একটি পর্ব ফ্রেম বাই ফ্রেম রি-প্লে করে, Rerun বা Foxglove-এ। অদলবদল করা ক্যামেরা এবং স্থির ফ্রেম দশ সেকেন্ডের মধ্যে দেখা যায়। লোকেরা এই ধাপটি এড়িয়ে যায়।
# 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]"
v2.1 অথবা v3.0: রেকর্ড করার আগে সিদ্ধান্ত নিন
v2.1 প্রতিটি পর্বের জন্য একটি parquet এবং একটি MP4 ফাইল লিখত। v3.0 অনেক পর্বকে ভাগ করা শার্ডে একত্রিত করে এবং মেটাডেটা থেকে সীমানা পুনর্গঠন করে, তাই info.json পাথ টেমপ্লেট বহন করে যেমন data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet একটি পর্ব নম্বরের পরিবর্তে। এর মূল কারণ হলো কম, বড় ফাইল: দ্রুত ইনিশিয়ালাইজেশন এবং স্কেলে কম ফাইল-সিস্টেম চাপ।
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| বিন্যাস | প্রতিটি পর্বের জন্য একটি parquet এবং একটি MP4 | প্রতিটি শার্ডে অনেক পর্ব |
| পর্বের মেটাডেটা | JSONL files | meta/episodes/ এর অধীনে chunked parquet, ডেটাসেট স্ট্যাকের মাধ্যমে |
| হাব থেকে স্ট্রিমিং | না | হ্যাঁ, StreamingLeRobotDataset এর মাধ্যমে |
| lerobot 0.6.1 দ্বারা লিখিত | না | হ্যাঁ, যা আপনি আজ পান |
| GR00T N1.7 এবং N1.5 দ্বারা পঠিত | হ্যাঁ | না, অবশ্যই রূপান্তর করতে হবে |
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 হিসাবে ডেটাসেট প্রত্যাখ্যাত।
# 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একই ডেটাসেটে যাওয়ার দুটি পথ
উপরের সবকিছু, আপনার নিজের মেশিনে: আপনি USB গণনা, ffmpeg বিল্ড, এনকোডার টিউনিং এবং ক্রমাঙ্কন ফাইলগুলির মালিক। পাইপলাইন বুঝতে, একটি অস্বাভাবিক ক্যামেরা রিগ চালাতে বা ডেটা স্থানীয় রাখতে এটিই সঠিক পথ।
সময়: প্রতিটি বাহু একত্রিত করতে এক সন্ধ্যা, একটি জটিল প্রথম ক্রমাঙ্কন, এবং একটি প্রথম সেশন যা আপনি বাতিল করবেন কারণ একটি ক্যামেরা ভুল স্লটে ছিল।
ডেস্কটপ ক্লায়েন্ট LeRobot-ফরম্যাটের ডেটাসেট, এপিসোড, ক্যামেরা স্ট্রিম এবং জয়েন্ট স্টেট রেকর্ড করে, সরাসরি একটি টেলিপেরেশন সেশন থেকে। সেই ডেটাসেট প্রশিক্ষণ ফর্মকে খাওয়ায়: মডেল, ডেটাসেট এবং হাইপারপ্যারামিটার নির্বাচন করুন, এবং ব্যাকএন্ড মডেলের VRAM দ্বারা আকারের একটি GPU ভাড়া করে, প্রশিক্ষক চালায় এবং চেকপয়েন্ট অবজেক্ট স্টোরেজে লেখে।
- 1ক্লায়েন্ট ইনস্টল করুন
ডাউনলোড পৃষ্ঠায়; ক্লায়েন্ট ডকুমেন্টেশনে সেটআপ করুন।
- 2টেলিপ সেশন থেকে রেকর্ড করুন
বাহু চালান; ক্লায়েন্ট LeRobot ফরম্যাটে এপিসোড লেখে। ওয়াকথ্রু: আপনার প্রথম ডেটাসেট রেকর্ড করুন।
- 3অথবা আপনার নিজের ডেটা আনুন
একটি ডেটাসেট Hugging Face রেপো আইডি বা আপনার নিজের মেশিন থেকেও আসতে পারে: ডেটাসেট ডক্স, পাবলিক ডিরেক্টরি।
- 4প্রশিক্ষণ দিন এবং এটি ফিরিয়ে চালান
প্রশিক্ষণ ম্যাট্রিক্সে সংমিশ্রণটি নির্বাচন করুন, তারপর বাহুতে নীতিটি ফিরিয়ে চালান। প্রায় 24 GB টায়ারে 1 থেকে 3 USD, A100 বা H100 টায়ারে 4 থেকে 12 USD।
এটি আপনার বাহু একত্রিত বা ক্রমাঙ্কন করে না, এবং এটি একটি ত্রুটিপূর্ণ এপিসোড মেরামত করে না, তাই পরিদর্শন ধাপটি এখনও প্রযোজ্য। অন্য প্রান্তে একটি কঠোর সীমাও রয়েছে: দ্রুত কাজগুলির জন্য, ইনফারেন্সকে সার্ভোগুলির পাশে থাকতে হয়। নিয়ন্ত্রণ লুপ প্রতি অ্যাকশন ধাপে 20 থেকে 485 ms চলে, এবং এর উপরে পাবলিক-ইন্টারনেট রাউন্ড ট্রিপগুলি একটি কার্যকরী নীতিকে একটি দ্বিধাগ্রস্ত নীতিতে পরিণত করে।
পাইপলাইন নিজে তার না করে 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
- LeRobot: বাস্তব-বিশ্বের রোবটগুলিতে অনুকরণ শিক্ষা
- LeRobot: SO-100 অ্যাসেম্বলি, মোটর সেটআপ এবং ক্যালিব্রেশন
- LeRobot: ক্যামেরা এবং lerobot-find-cameras
- LeRobot: ইনস্টলেশন এবং এক্সট্রাস ম্যাট্রিক্স
- LeRobotDataset v3.0: লেআউট এবং v2.1 মাইগ্রেশন
- LeRobot: স্ট্রিমিং ভিডিও এনকোডিং এবং ড্রপড ফ্রেম
- LeRobot: v3.0 (DROID)-এ বড় ডেটাসেট পোর্ট করা
- lerobot v0.6.1 রিলিজ, 3 আগস্ট 2026
- DatasetRecordConfig: আসল রেকর্ডিং ডিফল্ট
- lerobot_record.py: রেকর্ড লুপ এবং রেজিউম হ্যান্ডলিং
- TheRobotStudio/SO-ARM100: বিল্ড রেপো এবং বিল অফ মেটেরিয়ালস
- Hugging Face: LeRobot কমিউনিটি ডেটাসেট চেকলিস্ট
- lerobot/svla_so100_pickplace: 50 এপিসোড, 19,631 ফ্রেম
- Lin et al. (2024), অনুকরণ শিক্ষায় ডেটা স্কেলিং আইন
- Mandlekar et al. (2021), অফলাইন মানব প্রদর্শনী থেকে শেখার ক্ষেত্রে কী গুরুত্বপূর্ণ
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started