今回は、SO-ARMを2つ使って双腕対応に挑戦します。
前回は、単一のアームを使った学習に成功しました。今回は、さらに複雑なタスクに対応するため、双腕の制御に挑戦していきます!
双腕ロボットは、単腕では難しいような、物体の共同把持や、片方のアームで物を固定し、もう片方で作業を行うといった複雑な動作を実行でき、より人間に近いタスクが可能になります
双腕のteleop
まず、2つのSO-101を同時に制御できるようにします。活動当時、LeRobot公式から双腕用のテレオペレーションコードが公開されていなかったため、自力でのコーディングが必要でしたが、幸いにも公式ページから公開されるようになりました。今回は、この公式のコードを使用してteleopしていきます
1. 環境の準備
- SO-101 Follower × 2
- SO-101 Leader × 2
それぞれをPCに接続します。USBポートの管理が単腕より複雑になるので、`lerobot-find-port`コマンドを使用してよく確認します。
2. コマンドの実行
それぞれのUSBポートを確認したら、以下のコマンドを実行します。
lerobot-teleoperate \
--robot.type=bi_so100_follower \
--robot.left_arm_port=左followerのポート \
--robot.right_arm_port=右followerのポート \
--robot.id=任意のfollowerのid \
--teleop.type=bi_so100_leader \
--teleop.left_arm_port=左leaderのポート \
--teleop.right_arm_port=右leaderのポート \
--teleop.id=任意のleaderのid \
--display_data=true
双腕が同時に動いた瞬間は感動!🦾
やっぱり双腕はカッコいいですね。
エピソードの記録
次に、試しにエピソードを記録してみます。双腕ロボットの動きを学習させるには、お手本となる動作データを記録する必要があります。今回は、2つのリーダーアームを使って2つのフォロワーアームを同時に動かし、カメラ映像とアームの関節角度をセットで記録します。
1. 記録環境の準備
– カメラ
- top:アーム全体を上から捉え、2つのアームとブロックの位置関係を把握
- left・right:それぞれのアームのグリッパーの状況を把握
- `lerobot-find-cameras opencv`コマンドを使って、それぞれのカメラのパス(`/dev/video0など`)を確認します
– タスク
- 2本のペンを同時に持ち上げて、コップの中に入れる
2. 記録開始
以下のコマンドを実行して、テレオペレーションと同時にデータの記録を開始します。
lerobot-teleoperate \
--robot.type=bi_so100_follower \
--robot.left_arm_port=左followerのポート \
--robot.right_arm_port=右followerのポート \
--robot.id=任意のfollowerのid \
--robot.cameras='{
left: {"type": "opencv", "index_or_path":左腕用カメラのパス, "width": 640, "height": 480, "fps": 30},
top: {"type": "opencv", "index_or_path": 上からのカメラのパス, "width": 640, "height": 480, "fps": 30},
right: {"type": "opencv", "index_or_path": 右腕用カメラのパス, "width": 640, "height": 480, "fps": 30}
}' \
--teleop.type=bi_so100_leader \
--teleop.left_arm_port=左leaderのポート \
--teleop.right_arm_port=右leaderのポート \
--teleop.id=任意のleaderのid \
--display_data=true
--dataset.repo_id=${HF_USER}/bi_so100_test \
--dataset.num_episodes=5 \
--dataset.single_task="pen pick and place"
実行すると、映像と関節角度が記録されています。

エピソードの再生
記録したエピソードが正しく保存されているかを確認します。これにより、データが破損していないか、また記録された動作が意図した通りに行われているかをチェックできます。
先ほど記録したものを以下のコマンドで再生してみます。
lerobot-replay \
--robot.type=bi_so100_follower \
--robot.left_arm_port=左followerのポート \
--robot.right_arm_port=右followerのポート \
--robot.id=任意のfollowerのid \
--dataset.repo_id=${HF_USER}/bi_so100_test \
--dataset.episode=0
問題なく再生できました!
これで学習用データが準備できたことを確認できました。
双腕SO-101の課題
学習に向けたデータ収集を行いましたが、使ってみるといくつか課題が見えてきました。
1. 5DOF Manipulatorの制約
SO-101は5DOF Manipulator + 1DOF Gripperという構造です。
しかし、5自由度では微妙に足りず、思うように動かせないシーンが多々ありました。
たとえば、ハンカチを折り畳むタスクではかなり苦戦しました。
む、難しい…😢
2. 左右同形状による使いにくさ
今回は同じ3Dモデルで両腕を構築したため、左右どちらも「右腕用」のような形状です。
そのため、左腕でのグリッパ操作が少ししづらかったり、ストッパーが干渉する問題が出ています。
まとめ
今回は、SO-101を2台使用した双腕ロボットの実装に成功しました。レオペレーション、エピソード記録、エピソード再生まで公式のコードを使用してスムーズに動かすことを確認しました。
しかし、実際に動かしてみるといくつかの課題も見えてきました。これらの課題は、今後エピソードを取るうえで、学習精度を向上させる上で無視できない点です。
今後は、これらの課題を克服するために、SO-101のハードウェア自体の改造に着手していきます!