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ループへの接続。
