LeRobot documentation
YAM
YAM
YAMは、I2RT Robotics製の、模倣学習とエンボディドAI向けの6自由度アームです。LeRobotでは、yam_followerが線形DM4310グリッパーを備えた標準的なYAM v1アーム1本を駆動し、bi_yam_followerが2本を駆動します。lerobot-calibrate、lerobot-rollout、lerobot-replayと組み合わせて使用してください。LeRobotにはまだYAMリーダーアームがないため、YAMはポリシーによって駆動するか、データセットの再生によって駆動されます。
I2RTのガイドに従って腕を組み立て、配線してください。このページではLeRobot側の説明を行います。
| ガイド | 対象範囲 |
|---|---|
| YAM アームシリーズ | 開梱、マウント、配線、モーターとグリップ |
| ソフトウェアセットアップ | CANアダプタ、ビットレート、固定インターフェース名 |
| YAM Cell | 2つのフォロワーとリーダーを備えたバイマニュアルステーション |

YAM フォローア(左)と YAM Cell 両手ステーション(右)。LeRobot がフォローアを駆動します。画像は I2RT Robotics のご提供によるものです。
ハードウェアと安全性
各アームにはID 1から7までの7つのモーターが搭載されています。関節1から3にはDM4340、関節4から6およびグリップにはDM4310が使用されています。YAM Pro、Ultra、BIG YAMおよびその他のグリップは、現時点ではサポートされていません。
必要なのは:
- Linux, and one USB-to-CAN adapter per arm (SocketCAN, classic CAN at 1 Mbit/s).
- すべてのモーターの CAN タイムアウトは最大 400 ms(
8000ticks、I2RT の値)に設定してください。例えば、I2RT SDK のset_timeout.py --timeoutを使用します。このタイムアウトは、LeRobot がコマンドの送信を停止した場合の最後の安全策であり、この設定がない場合、LeRobot はトルクを有効にしません。 - 初回接続時のインターネットアクセス: 重力補償は、
lerobot/robot-urdfsバケットから YAM モデルをダウンロードし、HF_LEROBOT_HOME/robot-urdfs/yam/v1以下にキャッシュします。
アームを安定した面に固定し、作業スペースを空けておいてください。接続を解除するとトルクがオフになり、アームは重力で落下します。まずアームを支えてください。動作中に電源またはCANアダプタの接続が切断された場合は、プログラムを停止し、アームを支えたうえで、再接続してください。
LeRobot🤗のインストール
インストールガイドに従って、YAMサポートをインストールします:
pip install -e ".[yam]"これにより、アーム用にmotorbridgeとpython-can、重力補償用にplacoがインストールされます。
ハードウェアを接続する
両アームは同じモーターIDを使用するため、それぞれに独立したCANインターフェースが必要です。
lerobot-setup-can --mode=setup --interfaces=can0 --use_fd=false2つのアームを使用する場合は、--interfaces=can0,can1 を使用します。このコマンドは sudo ip link を用いて Linux インターフェースを設定し、モーターコマンドは送信しません。2つのアームを使用する場合、再起動後に can0 と can1 が入れ替わる可能性があります。各インターフェースがどのアームを駆動しているかを確認するか、I2RT の ソフトウェアセットアップ を使用して can_follower_l のような固定名を割り当て、それらの名前をポートとして使用してください。
デバイスタイプ
| 型 | デバイス |
|---|---|
yam_follower | 単一フォロワー |
bi_yam_follower | 両手フォロワー |
2つのアームがある場合、各アームのオプションを--robot.left_arm_config.<option>と--robot.right_arm_config.<option>で設定します。
キャリブレーション
キャリブレーションでは、グリップの限界位置(完全に閉じた状態と完全に開いた状態)のみを測定します。関節は工場出荷時のゼロ位置を維持したままです。以下に示すように、まずアームを折りたたんでください。測定中はトルクがオフになっています。アームを支えながら、手動でグリップのみを動かしてください。各プロンプトでEnterを押してください。既存のキャリブレーションがある場合、接続すると制御が開始されます。既存のキャリブレーションを再利用するにはEnterを押してください。再度測定するにはcを入力してください。LeRobotは、トルクをオフにする前にアームを支えるよう求めます。

すべての関節がゼロの折り畳み姿勢(左)、および線形DM4310グリップ(右)。画像はI2RT Roboticsの提供によるものです。
lerobot-calibrate --robot.type=yam_follower --robot.port=can0 --robot.id=yam
左のグリップが先に測定され、その後右のグリップが測定され、それぞれ<id>_leftファイルと<id>_rightファイルに保存されます。
lerobot-calibrate --robot.type=bi_yam_follower --robot.id=bimanual_yam \ --robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1
後続のコマンドでも同じ--robot.idを使用してください。これにより、LeRobotが保存されたファイルを読み込みます。
観察とアクション
片腕には、観測とアクションの両方でjoint_1.posからjoint_6.pos、そしてgripper.posが含まれます。関節は度数法の絶対角度であり、グリップは0(閉)から100(開)の範囲です。use_degrees=falseにすると、I2RTやMolmoAct2のデータと同様にラジアンと0から1の範囲に切り替わります。use_velocity_and_torque=trueにすると、.velと.torqueの観測が追加されます。アクションは関節の絶対目標値であり、関節の制限値にクリップされます。
2つのアームは、left_およびright_プレフィックスを付けた同じ名前を使用します。アームに設定されたカメラもプレフィックスが付与されますが、トップレベルの--robot.camerasは名前をそのまま保持します。
ポリシーの実行
接続前に、すべての関節がゼロになるようにアームを折りたたみ位置に配置してください。LeRobot は、各関節が測定位置から 11.5° 以内にあることを確認してから、その測定位置から制御を開始します。ポリシーがアクションを送信するまで、何も動きません。
lerobot-rollout \
--robot.type=yam_follower --robot.port=can0 --robot.id=yam \
--robot.cameras='{"wrist": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
--policy.path=<user>/<policy> \
--task="Pick up the cube"2つのアームを使用する場合は、--robot.type=bi_yam_follower --robot.id=bimanual_yam --robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1を使用します。ロールアウトを記録するには、--dataset.repo_id=<user>/rollout_<name>を追加してください。推論を実行してポリシーを評価するを参照してください。lerobot-replayは、同じ--robot.*オプションを使用して、記録されたエピソードを再生します。
最初のアクションの前に、およびcommand_timeout_s(1秒)間アクションが届かない場合、アームは現在の姿勢を保持します。idle_mode=floatの場合、関節は重力補償と軽い減衰が適用され、手動でアームを動かすことができます。この間、グリップの開閉は維持され、トラッキングは手動で動かした位置から再開されます。
安全性
- モーターの故障またはフィードバックの欠如により、すべてのコマンドが停止します。2つのアームがある場合、いずれかのアームで故障が発生すると、両方のアームが停止します。続行するには、切断してから再接続してください。
- 重力モデルは、カメラやペイロードを装着していない標準アームをカバーしています。いずれかを追加した後、フロートモードでアームがドリフトしないことを確認し、ドリフトが発生する場合は
gravity_factorsを調整してください。
設定オプション
| オプション | デフォルト | 説明 |
|---|---|---|
port | 必須 | SocketCANインターフェース、例えばcan0 |
use_degrees | true | 角度は度、グリップは0〜100のスケールです。falseを指定すると、ラジアンと0〜1のスケールになります。 |
use_velocity_and_torque | false | .vel と .torque の観測値を追加します |
idle_mode | hold | アクションが届かない場合、holdでポジションを維持するか、floatにするか |
command_timeout_s | 1.0 | アイドルモードに入るまでの、アクションのない秒数 |
initial_position_deg | すべてゼロ | 必須の初期位置。Noneを指定するとチェックがスキップされます |
initial_tolerance_deg | 11.5 | 初期位置からの許容距離 |
gripper_force_limit_n | 50.0 | グリップがオブジェクトでブロックされた後の指の力 |
gravity_factors | [1.0, 1.1, 1.1, 1.2, 1.0, 1.0] | 重力補償の関節ごとの乗数 |
cameras | {} | アームに取り付けられたカメラ |
例: MolmoAct2
lerobot/MolmoAct2-BimanualYAM-LeRobot は、allenai/MolmoAct2-BimanualYAM を LeRobot 形式に変換したもので、公開された正規化統計情報が含まれています。ラジアンと 0〜1 のグリッパーで 2 本の YAM アームを用いて学習され、カメラは上、左、右の順で 3 台使用されています。詳細は MolmoAct2 を参照してください。
pip install -e ".[yam,molmoact2,dataset]"
lerobot-rollout \
--robot.type=bi_yam_follower --robot.id=bimanual_yam \
--robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1 \
--robot.left_arm_config.use_degrees=false --robot.right_arm_config.use_degrees=false \
--robot.cameras='{
"top": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/TOP_CAMERA", "width": 640, "height": 480, "fps": 30},
"left": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/LEFT_CAMERA", "width": 640, "height": 480, "fps": 30, "fourcc": "MJPG"},
"right": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/RIGHT_CAMERA", "width": 640, "height": 480, "fps": 30, "fourcc": "MJPG"}
}' \
--policy.path=lerobot/MolmoAct2-BimanualYAM-LeRobot \
--inference.type=rtc --inference.rtc.execution_horizon=20 --inference.queue_threshold=20 \
--device=cuda --interpolation_multiplier=2 \
--interactive=true --play_sounds=false \
--task="Pick up the red block and place it in the green bin"/start を入力してポリシーを実行し、/subtask <text> で指示を変更し、/reset で初期位置に戻し、/stop で終了します。リターンは一定時間持続し、YAM の速度制限も引き続き適用されるため、初期位置から遠い位置にあるアームは途中で停止する可能性があります。
Float モードを使用すると、任意の位置からポリシーを開始できます。--robot.left_arm_config.idle_mode=float --robot.right_arm_config.idle_mode=float を追加してください。最初の /start の前、および /reset が完了してから 1 秒以内に、アームを手動で希望する位置まで移動し、そこからポリシーを実行するには /start を入力してください。このために /stop を使用しないでください。セッションを終了し、トルクを無効にしてしまいます。
トラブルシューティング
| 問題 | 確認 |
|---|---|
| CANインターフェースが存在しないか、ダウンしています | アダプターの電源とUSBケーブルを確認し、ip link showを実行してください。lerobot-setup-canを再度実行してください。 |
missing or stale motor feedback | 24 V電源、CAN配線およびターミネーション、モーターID 1〜7、およびportがこのアームのインターフェースであることを確認してください。 |
| 誤った腕が動きます | 各インターフェースがどのアームを駆動しているかを確認するか、インターフェースに固定の名前を割り当ててください。 |
unsafe motor CAN timeout | I2RT SDK を使用して、すべてのモーターの CAN タイムアウトを最大 400 ms に設定します。 |
not within initial_tolerance_deg | 接続する前に、すべての関節をゼロにしてアームを折りたたんでください。 |
| 接続時に再度キャリブレーションを求められます | キャリブレーション時と同じ--robot.idを使用してください。 |
| アームがフロートモードでドリフトする | アームのカメラやペイロードに対してgravity_factorsを調整します。 |
| MolmoAct2は腕を誤った位置に移動させます | 両方のアームでuse_degrees=falseを設定してください。モデルはラジアンと0〜1のグリップを使用します。 |
参考文献
- YAM Arm シリーズ: ハードウェア、モーター、グリップ
- ソフトウェアセットアップ: CANビットレートと固定インターフェース名
- YAM Cell: 両手ステーション
- I2RT SDK:モーターツール、URDFおよびMuJoCoモデル
- YAM製品ページ
- MolmoAct2: LeRobotでのポリシーの読み込み