mechArm 270 × Unity R2R2Rループが閉じた瞬間|PickAndPlaceシミュレーション完成
LOG124R2R2R2026/4/2

mechArm 270 × Unity R2R2Rループが閉じた瞬間|PickAndPlaceシミュレーション完成

ピック&プレイスが動いた。

ブロックを掴んで、持ち上げて、箱に入れた。たったそれだけのことに見えるかもしれないけど、これはR2R2Rループの実機側が成立したということだ。

💡 Key Takeaway

複数関節同時動作の確認からピック&プレイスの完全動作まで、1日で駆け抜けた。手動で姿勢を取得して角度を記録する方法で、APPROACH → PICK → APPROACH_PLACE → PLACE の4点シーケンスが成立。実機でブロックが箱に収まった。

まず複数関節の同時動作を確認した

単軸テストとグリッパー開閉を確認した。今日はその次、複数関節を同時に動かすことから始めた。

multi_joint_test.py を作って実行した。

Step1 (J1+J2):   ✓ 成功
Step2 (J1+J2+J3): ✓ 成功
Step3 (全軸):    ✓ 成功

動きは滑らかだった。振動もなく、速度感も問題なし。これで実機の基礎動作が全部揃った。

ピック動作の設計:最初のアプローチは失敗した

最初に作ったピックスクリプトは、グリッパーを開いた状態で横からブロックに近づく設計だった。

実行してみたら、アームがブロックをずらしてしまった。掴む前に弾いてしまう。

当たり前だ。横から近づけばグリッパーがブロックに当たる。

上からアプローチしなければいけない。

フリームーブで姿勢を手動取得する

mc.release_all_servos() でフリームーブモードにして、手でアームを動かした。

取得した姿勢:

姿勢名

角度

説明

APPROACH_PICK

[-54.22, 81.91, -30.14, -8.08, -50.27, -29.44]

ブロックの真上

PICK

[-46.93, 102.74, -43.33, 3.6, -60.11, -31.9]

掴む位置

APPROACH_PLACE

[59.85, 16.87, 27.94, 10.01, -45.17, -35.33]

箱の真上

PLACE

[63.28, 48.33, 24.08, 13.18, -68.29, -31.28]

箱の中に置く位置

グリッパー操作は set_gripper_state(0, 70) で開く、set_gripper_state(1, 70) で閉じる。実績のある関数に統一した。

ピック&プレイスのシーケンス

Step1:  HOME へ移動
Step2:  グリッパーを開く
Step3:  APPROACH_PICK へ移動(ブロックの真上)
Step4:  PICK へ移動(真下に降ろす)
Step5:  グリッパーを閉じる(掴む)
Step6:  APPROACH_PICK へ戻る(持ち上げ)
Step7:  APPROACH_PLACE へ移動(箱の真上)
Step8:  PLACE へ移動(箱の中へ)
Step9:  グリッパーを開く(離す)
Step10: APPROACH_PLACE へ戻る
Step11: HOME へ戻る

pick_and_place.py を実行した。

ブロックが箱に入った。

わかったこと

アプローチ方向は動作設計の根幹だ。横から近づくか、上から近づくかで、成功と失敗が分かれる。座標ではなく「どこから来るか」という文脈が動作の質を決める。

これはロボットの動きをデザインするということの本質だと思う。角度の数字ではなく、空間の文脈を設計している。

定数まとめ

HOME           = [0, 0, 0, 0, 0, -30]
APPROACH_PICK  = [-54.22, 81.91, -30.14, -8.08, -50.27, -29.44]
PICK           = [-46.93, 102.74, -43.33, 3.6, -60.11, -31.9]
APPROACH_PLACE = [59.85, 16.87, 27.94, 10.01, -45.17, -35.33]
PLACE          = [63.28, 48.33, 24.08, 13.18, -68.29, -31.28]
SPEED          = 20

次はプレイス精度の改善とR2R2Rループへの接続。