כפפת מישוש Juqiao

איסוף נתונים

הקלט לחץ מגע לצד מצב מפרק הרובוט ווידאו מצלמה. הכפפה מוסיפה אופנת מישוש הלוכדת כמה קשה תפס הרובוט לוחץ - מידע בלתי נראה לראייה בלבד.

מה הכפפה מוסיפה למערך הנתונים שלך מערכי נתונים סטנדרטיים של תפעול טלפון לוכדים מיקומים משותפים, מהירויות ותמונות מצלמה. הוספת כפפת Juqiao מתעדת מפת לחץ של 64 צמתים, 200 הרץ המציגה את ההתפלגות המרחבית של כוח המגע במהלך כל אחיזה. מדיניות המתאמנת על נתונים אלה יכולה ללמוד לווסת את כוח האחיזה - חיוני עבור עצמים שבירים או ניתנים לעיוות.
הגדרת חומרה

חיבורי מערכת

חבר את כל המכשירים לפני הפעלת תוכנה כלשהי. הכפפה מחווטת USB אך ורק - אין מצב אלחוטי.

רובוט זרוע + יד

Orca Hand (מומלץ) או גורם קצה אחר. מחובר באמצעות מתאם USB או CAN של Feetech, תלוי בזרוע.

/dev/ttyUSB0 or CAN0

כפפת Juqiao

USB-C למחשב מארח. מופיע כסדרה CDC-ACM. כבל 1.5 מ'; השתמש בתוספת USB במידת הצורך לחופש תנועה.

/dev/ttyACM0

מצלמת פרק כף היד

מצלמת USB או GigE מותקנת על פרק כף היד של הרובוט, ומספקת תצוגה ממוקדת עצמים לאימון.

/dev/video0 or GigE IP

מצלמה עילית

מצלמת סביבת עבודה קבועה להקשר של סצנה. התאם עם מצלמת שורש כף היד עבור מערכי נתונים מרובים.

/dev/video2 or GigE IP

מכשיר טלאופרציה

זרוע מנהיג (SO-101 / OpenArm leader), בקר VR, או SpaceMouse שמניעים את הרובוט העוקב.

נמל לידר / HID
זרימת עבודה של הקלטה

הקלטה שלב אחר שלב

1

הרם את הזרוע והיד של הרובוט

הפעל את נהג הזרוע (והנהג של Orca Hand אם רלוונטי) בטרמינלים נפרדים. ודא ש-joint_states מתפרסמים לפני שתמשיך.

# Terminal 1: Robot arm (example: OpenArm) השקת ros2 openarm_ros2 openarm.launch.py ​​יציאה:=/dev/ttyUSB0 # Terminal 2: Orca Hand (if using Orca Hand end-effector) ros2 הפעל orca_ros2 orca_hand.launch.py ​​port:=/dev/ttyUSB1 # Verify ros2 נושא hz /joint_states # Should be ~100 Hz ros2 נושא hz /orca_hand/joint_states # Should be ~100 Hz
2

הפעל את מנהל ההתקן של Juqiao Glove

הפעל את צומת ROS2 של הכפפה. ודא שנתוני 200 הרץ זורמים לפני תחילת כל סשן הקלטה.

# Terminal 3: Juqiao Glove השקת ros2 juqiao_glove_ros2 glove.launch.py ​​port:=/dev/ttyACM0 # Verify pressure data is live ros2 נושא hz /juqiao_glove/tactile_array # Should be ~200 Hz ros2 topic echo /juqiao_glove/grasp_region # Should print region strings
3

הפעל מצלמות

התחל צמתי מצלמה עבור תצוגות פרק כף היד וראש. ודא שנושאי תמונה מתפרסמים בקצב פריימים יעד (בדרך כלל 30 פריימים לשנייה).

# Wrist camera (USB) ros2 הפעל usb_cam usb_cam_node_exe --ros-args -p video_device:=/dev/video0 -p framerate:=30.0 # Overhead camera (GigE example) השקת ros2 camera_ros2 gige_camera.launch.py ​​ip:=192.168.1.100 # Verify ros2 נושא hz /wrist_camera/image_raw ros2 נושא hz /overhead_camera/image_raw
4

ודא שכל הזרמים מסונכרנים

לְהִשְׁתַמֵשׁ רשימת נושאים של ros2 כדי לוודא שכל הנושאים הנדרשים קיימים. בדוק שחותמות הזמן נמצאות בטווח של 20 אלפיות השנייה בכל השיטות לפני הקלטת פרקים כלשהם.

רשימת נושאים ros2 | grep -E "joint|tactile|image|grip" # Expected topics: # /joint_states (arm, ~100 Hz) # /orca_hand/joint_states (hand, ~100 Hz) # /juqiao_glove/tactile_array (glove, ~200 Hz) # /juqiao_glove/grasp_region (glove, ~200 Hz) # /wrist_camera/image_raw (camera, 30 Hz) # /overhead_camera/image_raw (camera, 30 Hz)
5

הקלט מערך נתונים עם LeRobot

השתמש בסקריפט הרשומה של LeRobot. ה --נושא מישוש הדגל מוסיף את זרם לחץ הכפפות כעמודת נתונים לצד מצבים ותמונות משותפים.

# Record 50 episodes; press Enter to start each, Space to stop python -m lerobot.scripts.record \ --רובוט-נתיב lerobot/configs/robot/orca_hand.yaml \ --fps 30 \ --repo-id $HUGGINGFACE_USER/orca_grasp_tactile \ --תייגים "כפפה-juqiao, מישוש, מניפולציה" \ --זמן חימום-s 2 \ --זמן פרק 30 \ --reset-time-s 5 \ --מספר פרקים 50 \ --push-to-hub \ --טactile-topic /juqiao_glove/tactile_array \ --מפתח מישוש מישוש_לחץ
אין עדיין דגל של LeRobot --נושא מישוש? השתמש במעטפת ההקלטה הרב-מודאלית SVRC המטפלת בסנכרון ובסכימת מערך הנתונים באופן אוטומטי: מרכז רובוטיקה להתקין pip[מקליט]
6

סקור פרקים לפני שדוחפים

הפעל מחדש כל פרק עם שכבת העל של מפת החום כדי לאמת את איכות הנתונים המישוש לפני התחייבות ל-HuggingFace Hub.

# Replay and overlay heatmap on video python -m roboticscenter.scripts.review_episode \ --dataset-path ./data/orca_grasp_tactile \ --פרק-אינדקס 0 \ --שכבת-מגע \ --מפתח מישוש מישוש_לחץ # Discard bad episodes python -m lerobot.scripts.delete_episodes \ --dataset-path ./data/orca_grasp_tactile \ --פרקים 3 7 12 # episode indices to discard
7

דחף אל HuggingFace Hub

העלה את מערך הנתונים המאומת. כרטיס מערך הנתונים נוצר אוטומטית עם תיאורי אופנים כולל מישוש.

huggingface-cli התחברות # first time only python -m lerobot.scripts.push_dataset \ --dataset-path ./data/orca_grasp_tactile \ --repo-id $HUGGINGFACE_USER/orca_grasp_tactile # Verify upload python -c" ממערכי נתונים ייבוא load_dataset ds = load_dataset('$HUGGINGFACE_USER/orca_grasp_tactile', split='train') print(ds.column_names) print(ds.features['tactile_pressures']) "
הַפנָיָה

סכימת ערכת נתונים

כל מסגרת במערך הנתונים מכילה את העמודות הבאות. כל המערכים מאוחסנים כעמודי float32 פרקט; תמונות כרצפי וידאו MP4.

עַמוּדָהצורה / סוגתֵאוּר
תצפית.מצב float32[6] עמדות מפרקי זרוע הרובוט (רדיאנים). אינדקס 6 הוא צמצם תפס אם משתמשים בזרוע 6-DOF.
observation.hand_state float32[17] עמדות משותף של יד אורקה (רדיאנים), 17 DOF. להשמיט אם אין יד מיומנת. מסומן לפי שם משותף במטא נתונים.
observation.tactile_pressures float32[64] Juqiao Glove לחץ מנורמל לצומת, 0.0 (ללא מגע) עד 1.0 (קנה מידה מלא). 200 הרץ מופחת כדי להתאים לקצב פריימים של רובוט.
observation.tactile_pressures_raw uint16[64] ערכי ADC גולמיים של 16 סיביות. שמור לנורמליזציה מחדש לאחר כיול מחדש. אופציונלי; להשמיט כדי להקטין את גודל הנתונים.
observation.grasp_region str היוריסטיקה של אזור מגע פעיל: "כַּף הַיָד", "אֲגוּדָל", "מַדָד", "אֶמצַע", "טַבַּעַת", "זרת", או "" (אין קשר).
תצפית.תמונות.פרק כף היד uint8[H, W, 3] מסגרת RGB של מצלמת שורש כף היד במהירות 30 פריימים לשנייה, מאוחסנת כרצף וידאו MP4.
תצפית.תמונות.מעל uint8[H, W, 3] מסגרת RGB של מצלמה עילית במהירות 30 פריימים לשנייה.
פְּעוּלָה float32[6 או 23] כוון למנחי מפרקים עבור הזרוע (6) ובאופן אופציונלי יד (17). הצורה תלויה אם קיימת יד מיומנת.
הוראת_שפה str תיאור משימה, למשל. "להרים את הביצה מבלי לשבור אותה". מאפשר הדרכת מדיניות מותנית בשפה.
episode_index int מספר פרק בתוך מערך הנתונים.
frame_index int מספר פריים בתוך הפרק (אינדקס 0).
חותמת זמן לצוף64 שניות חלפו מאז תחילת הפרק.

הורדת דגימה במישוש

הכפפה זורמת ב-200 הרץ; הרובוט והמצלמות פועלים בדרך כלל במהירות 30-100 הרץ. המקליט מיישר מסגרות באמצעות התאמת חותמת הזמן של השכן הקרוב ביותר. כדי לשמר את זרם המישוש המלא של 200 הרץ כמערך נפרד:

# Store full-rate tactile as a variable-length array per frame python -m roboticscenter.scripts.record \ --מצב מישוש מלא_קצב # default is "matched" (one per robot frame) # This produces a ragged column: observation.tactile_sequence # shape per row: float32[N, 64] where N varies (typically 6-7 frames at 200Hz/30fps)
אֵיכוּת

רשימת איכות פרק

סקור כל פרק לפי הקריטריונים האלה לפני הכללתו במערך הנתונים שלך. פרק רע אחד יכול להציג דפוסי מישוש מזויפים המשפילים את הכשרת המדיניות.

  • זרם המישוש הוא רציף - אין פערי מסגרת לְאַמֵת frame.sequence מרווחים ללא דילוגים. טיפות מסגרת מופיעות כערכים חוזרים בעמודת המישוש.
  • קו הבסיס במנוחה קרוב לאפס (<0.03) בתחילת הפרק (לפני כל מגע), צומת הלחץ המקסימלי צריך להיות מתחת ל-0.03. סחף מעל 0.05 במנוחה מציין שהכפפה זקוקה לכיול מחדש.
  • אירועי אנשי קשר מתיישבים עם האחיזה הנראית לעין בסרטון משחק חוזר עם --שכבה-מישוש. קוצים בלחץ (צומת מרבי > 0.4) צריכים לחפוף עם סגירת האחיזה הנראית לעין במצלמת פרק כף היד.
  • אזור האחיזה עקבי בשלב המגע תפיסה_אזור צריך להתייצב על אזור אחד או שניים במהלך כל אחיזה (למשל. "כַּף הַיָד" + "מַדָד"). אזורים המשתנים במהירות מעידים על חוסר יישור כפפה או אות רועש.
  • חביון כפפה < 20 אלפיות השנייה ביחס למצב הרובוט השווה את התחלת אירוע מישוש לשיא מהירות התפסן. חביון > 20 אלפיות השנייה מציע גודש ברכזת USB - חבר את הכפפה ישירות ליציאת USB מארח.
  • הוראת השפה תואמת את המשימה שהודגמה עבור מערכי נתונים מותנים בשפה, ודא שההוראה שהוזנה בתחילת הפרק מתארת ​​במדויק את מה שהמפעיל הוכיח בפועל.
  • אין הפרעות כבל לתנועת רובוט אסור לכבל USB באורך 1.5 מ' להגביל את תנועות היד של המפעיל או לשלוף את הכפפה במהלך הפרק. השתמש בקליפס לניהול כבל על האמה.
אימון מדיניות

אימון עם תצפיות מישוש

מדיניות שצורכת קלט מישוש בדרך כלל רואה שיפור של 15-30% במשימות רגישות למגע (טיפול באובייקט שביר, הכנסת יתדות, קיפול בד) בהשוואה לקווי בסיס של ראייה בלבד.

# ACT policy with tactile observations (SVRC fork adds tactile encoder) python -m lerobot.scripts.train \ --dataset-repo-id $HUGGINGFACE_USER/orca_grasp_tactile \ --חוק מדיניות \ --policy.observation_keys \ "observation.images.wrist" \ "observation.images.overhead" \ "observation.state" \ "observation.state" \ "observation.state" \ "observation"\""\"observation.state" \"\statobservation.state" \"\statobservation.state" \statobservation". "observation.state" \"\statobservation.state" \ "observation.state" \ "observation.state". "observation.hand_statiles" --output-dir outputs/act_tactile # The tactile encoder maps float32[64] → latent via a small MLP # No special architecture changes required for ACT or Diffusion Policy
# Diffusion Policy with tactile (identical --observation_keys, different policy flag) python -m lerobot.scripts.train \ --dataset-repo-id $HUGGINGFACE_USER/orca_grasp_tactile \ --הפצת מדיניות \ --policy.observation_keys \ "observation.images.wrist" \ "observation.state" \ "observation.tactile_pressures \if-out" --s
טיפ: בטלה מישוש בזמן eval time לַעֲבוֹר observation.tactile_pressures = zeros(64) במהלך הסקה כדי למדוד עד כמה המדיניות מסתמכת על מישוש לעומת ראייה. זה מזהה אם המשימה שלך דורשת מישוש או אם הראייה מספיקה.