הגדרת תוכנה

התקנת orca_core SDK, הגדרת מנהל התקן USB, API של בקרת אצבע בודדת, ממשק יד ROS2, קריאת חיישני מישוש וסימולציית MuJoCo. מהתקנה חדשה של Python ועד כל 17 המפרקים הנעים.

קפוץ לקטע:

שלב 1 - התקנת SDK

התקנת SDK של orca_core

orca_core הוא ה-SDK הרשמי של Python עבור יד Orca. זה ניתן להתקנה באמצעות pip ותומך ב-Python 3.9+. אין צורך ב-ROS לשליטה משותפת בסיסית.

צור סביבה וירטואלית

python -m venv ~/.venvs/orca
source ~/.venvs/orca/bin/activate   # Windows: .venvs\orca\Scripts\activate

התקן באמצעות pip

pip install orca-core

התקן באמצעות שירה (מומלץ לפיתוח)

git clone https://github.com/orcahand/orca_core.git
cd orca_core
poetry install

ודא את ההתקנה ומצא את היד שלך

python -c "from orca_core import OrcaHand; print('orca_core installed OK')"

# Find the USB serial port
python -c "
from orca_core import OrcaHand
# Lists available ports
import serial.tools.list_ports
ports = list(serial.tools.list_ports.comports())
for p in ports:
    print(p)
"
שלב 2 - Finger Control API

בקרת אצבע אישית

ה OrcaHand הכיתה חושפת את כל 17 המפרקים באמצעות אביזרי אצבע ומפרקים בעלי שם. ברירת המחדל של מצב בקרה היא current_based_position.

חבר וקרא את כל עמדות המפרק

from orca_core import OrcaHand

hand = OrcaHand(port="/dev/ttyUSB0", handedness="right")
hand.connect()

# Read all joint positions (returns dict of joint_name: position_deg)
positions = hand.get_positions()
print(positions)
# e.g. {'thumb_abduct': 0.0, 'thumb_mcp': 15.2, ...}

hand.disconnect()

הזז מפרקים בודדים

from orca_core import OrcaHand
import time

hand = OrcaHand(port="/dev/ttyUSB0", handedness="right")
hand.connect()
hand.enable_all()

# Move thumb MCP joint to 45 degrees
hand.set_position("thumb_mcp", 45.0)
time.sleep(0.5)

# Move index finger MCP to 60 degrees
hand.set_position("index_mcp", 60.0)
time.sleep(0.5)

# Open all fingers
hand.open_all()
time.sleep(1.0)

hand.disable_all()
hand.disconnect()

הגדר מספר מפרקים בו זמנית

from orca_core import OrcaHand

hand = OrcaHand(port="/dev/ttyUSB0", handedness="right")
hand.connect()
hand.enable_all()

# Command all 17 joints at once (dict of joint_name: target_deg)
pose = {
    "thumb_abduct": 30.0,
    "thumb_mcp":    45.0,
    "thumb_pip":    30.0,
    "thumb_dip":    20.0,
    "index_mcp":    70.0,
    "index_pip":    60.0,
    "index_dip":    40.0,
    # ... remaining joints
}
hand.set_positions(pose)

hand.disable_all()
hand.disconnect()
שלב 3 - תפוס פרימיטיבים

פרימיטיביות אחיזה מובנים

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

שימוש בפרימיטיבים של אחיזה

from orca_core import OrcaHand
from orca_core.grasps import GraspLibrary
import time

hand = OrcaHand(port="/dev/ttyUSB0", handedness="right")
hand.connect()
hand.enable_all()
grasps = GraspLibrary()

# Open hand
hand.execute_grasp(grasps.open)
time.sleep(1.0)

# Power grasp (whole-hand wrap)
hand.execute_grasp(grasps.power_grasp)
time.sleep(1.0)

# Precision pinch (thumb + index tip)
hand.execute_grasp(grasps.precision_pinch)
time.sleep(1.0)

# Tripod grasp (thumb + index + middle)
hand.execute_grasp(grasps.tripod)
time.sleep(1.0)

# Lateral pinch (thumb side against index lateral)
hand.execute_grasp(grasps.lateral_pinch)
time.sleep(1.0)

hand.open_all()
hand.disable_all()
hand.disconnect()

אינטרפולציה בין אחיזה

from orca_core import OrcaHand
from orca_core.grasps import GraspLibrary
import time, numpy as np

hand = OrcaHand(port="/dev/ttyUSB0", handedness="right")
hand.connect()
hand.enable_all()
grasps = GraspLibrary()

# Smoothly interpolate from open to power grasp over 30 steps
for alpha in np.linspace(0, 1, 30):
    pose = grasps.interpolate(grasps.open, grasps.power_grasp, alpha)
    hand.set_positions(pose)
    time.sleep(0.05)

hand.disable_all()
hand.disconnect()
שלב 4 - שילוב ROS2

ממשק יד ROS2

ה orca_ros2 החבילה מספקת ממשק ROS2 מלא עבור בקרת זרוע + יד מתואמת. הוא מפרסם מצבים משותפים ומקבל פקודות מסלול משותף.

התקן את orca_ros2

mkdir -p ~/orca_ws/src && cd ~/orca_ws/src
git clone https://github.com/orcahand/orca_ros2.git
cd ~/orca_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install

הפעל את צומת נהג היד

source ~/orca_ws/install/setup.bash
ros2 launch orca_ros2 orca_hand.launch.py \
  port:=/dev/ttyUSB0 \
  handedness:=right

הירשם לנושא המדינה המשותף

ros2 topic echo /orca_hand/joint_states

שלח פקודת עמדה משותפת

ros2 topic pub /orca_hand/joint_command \
  sensor_msgs/msg/JointState \
  '{name: ["index_mcp", "index_pip"], position: [1.22, 1.05]}'

זרוע מתואמת + שיגור יד (עם OpenArm)

ros2 launch orca_ros2 openarm_orca.launch.py \
  arm_can_interface:=can0 \
  hand_port:=/dev/ttyUSB0 \
  handedness:=right

זה משיק את שני ה openarm_ros2 נהג זרוע וה orca_ros2 נהג יד תחת מרחב שמות יחיד, המאפשר ביצוע מסלול מתואם באמצעות MoveIt2.

שלב 5 - חיישני מישוש

קריאת חיישן מישוש

ה-Orca Hand מורכבת אופציונלית בחיישני מישוש בקצות האצבעות (Paxini או תואם). נתונים מישוש זורמים באופן עצמאי דרך חיבור USB נפרד.

קריאת כוח מגע בקצות האצבעות

from orca_core import OrcaHand
from orca_core.sensors import TactileSensorArray

hand = OrcaHand(port="/dev/ttyUSB0", handedness="right")
tactile = TactileSensorArray(port="/dev/ttyUSB1")  # separate USB port

hand.connect()
tactile.connect()
hand.enable_all()

import time
for _ in range(100):
    # Returns dict of finger_name: contact_force_N
    forces = tactile.read_forces()
    positions = hand.get_positions()
    print(f"Index force: {forces.get('index', 0):.3f} N | "
          f"Index MCP: {positions['index_mcp']:.1f} deg")
    time.sleep(0.01)

hand.disable_all()
hand.disconnect()
tactile.disconnect()

סף זיהוי אנשי קשר

from orca_core.sensors import TactileSensorArray

tactile = TactileSensorArray(port="/dev/ttyUSB1")
tactile.connect()

# Set contact detection threshold per finger (in N)
tactile.set_threshold(finger="index", threshold_n=0.1)
tactile.set_threshold(finger="thumb", threshold_n=0.15)

# Returns True when contact exceeds threshold
in_contact = tactile.is_in_contact("index")
print("Index in contact:", in_contact)
אופציונלי - סימולציה

הדמיית MuJoCo

ה-Orca Hand נשלח עם דגמי MuJoCo MJCF מכוילים - יד שמאל, יד ימין וסצנה דו-ידנית. הסימולציה חולקת שמות מפרקים זהים ומרחבי פעולה עם חומרה אמיתית.

התקן והפעל את הסימולציה

pip install mujoco
pip install orca-core[sim]  # or: pip install orca-mujoco

# Clone the MuJoCo model package
git clone https://github.com/orcahand/orcahand_description.git

# Launch the right-hand sim
python -c "
import mujoco, mujoco.viewer
import numpy as np

model = mujoco.MjModel.from_xml_path('orcahand_description/mjcf/orca_right.xml')
data = mujoco.MjData(model)

with mujoco.viewer.launch_passive(model, data) as viewer:
    while viewer.is_running():
        mujoco.mj_step(model, data)
        viewer.sync()
"

העברת סים לאמית

שמות מפרקים בדגם MJCF תואמים את orca_core SDK בדיוק. ניתן לפרוס מדיניות המאומנת בסימולציה על פרימיטיביות אחיזה ישירות לחומרה אמיתית - ההבדל היחיד הוא זמן השהייה טורית של USB (~3ms) לעומת תזמון צעדים בפיזיקה.

פתרון בעיות

בעיות נפוצות

שגיאה 1 חלק מהאצבעות לא מגיבות - סריקת סרוו חלקית

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

לִקְבּוֹעַ:

# Scan to see which servo IDs are found
python -c "
from orca_core import OrcaHand
hand = OrcaHand(port='/dev/ttyUSB0', handedness='right')
hand.connect()
ids = hand.scan_motors()
print('Found IDs:', ids)  # should be 1..17
hand.disconnect()
"
שגיאה 2 אצבע מגיעה לגבולות קשים - מתח יתר בגידים

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

לִקְבּוֹעַ:

# Check joint limits — move each joint to its range manually
python -c "
from orca_core import OrcaHand
hand = OrcaHand(port='/dev/ttyUSB0')
hand.connect()
# Enable compliance mode — move finger by hand to feel the limits
hand.set_compliance_mode(finger='index', enabled=True)
"
# If finger hits hard limit below expected range,
# loosen the extensor tendon by 0.5 turns at the tendon anchor
שגיאה 3 נושא ROS2 joint_states לא מתפרסם

צומת מנהל ההתקן orca_ros2 הושק אך אינו מפרסם מצבים משותפים. בדרך כלל בעיית הרשאת יציאה או הפעלת orca_core מתנגשת.

לִקְבּוֹעַ:

# 1. Ensure no other orca_core session has the port open
# Close any Python scripts using the hand first

# 2. Add USB serial permissions (Linux)
sudo usermod -aG dialout $USER  # log out and back in

# 3. Re-launch with explicit port
ros2 launch orca_ros2 orca_hand.launch.py port:=/dev/ttyUSB0

# 4. Check topic
ros2 topic hz /orca_hand/joint_states   # should be ~100 Hz

תוכנה עובדת? התחל לאסוף נתונים.

ברגע שכל 17 המפרקים זזים, השלב הבא הוא הקלטת פרקי מניפולציה מיומנת.