
1. はじめに
このキャリブレーション手順は最新のリポジトリに追いついていないため、非推奨です。公式のドキュメントに従ってください。
前回はSO-ARM100の組み立てについて紹介しました。シリーズ3回目となるこの記事では、SO-ARM100を実際に動かしていきます。まずはキャリブレーションとテレオペレーションの実施から始めます。
キャリブレーションは、LeaderアームとFollowerアームの動きを一致させ、テレオペレーションの準備を行います。テレオペレーションは、Leaderアームを操作してFollowerアームを制御するします。この後の模倣学習向けのデータ収集に向けて重要な作業となります。
コンフィグファイルの設定などを間違えなければはまりどころの少ない工程です。
SO-ARM100についてもキャリブレーションの手順が若干変更になりましたが、今回の記事で対応しています。またSO-ARM101が公開されましたが、キャリブレーション以降の手順は同じですので参考にしてください。
◽️過去記事
2. キャリブレーション
キャリブレーションはleaderアーム、followerアームが姿勢が一致した場合に同じ関節角が得られるように、組み立て時や部品ごとの誤差をなくすための作業です。
▼PCとSO-ARM100の接続
LeaderアームとFollowerアームそれぞれにインタフェースボードを取り付け、PCと接続してください。また、電源を接続してください。
▼コンフィグファイルの編集
LeaderアームとFollowerアームをLeRobotに認識させるために、コンフィグファイルを編集します。まず、モーターの初期設定を参考にして、LeaderアームとFollowerアームのシリアルポート名を確認します。
確認したシリアルポート名をコンフィグファイルに設定します。LeRobotのプロジェクトのルートディレクトリから、lerobot/common/robot_devices/robots/config.pyを開き、So100RobotConfigの設定箇所に移動します。複数のロボットの設定が記載されているため、間違えないようにしてください。
leader_armsとfollower_armsセクションのポート名をダミーから、記録したシリアルポート名に書き換えます。
注意: 接続するUSBポートやハブが変わった場合、シリアルポート名を変更となるため、その都度config.pyを書き換える必要があります。
◽️lerobot/common/robot_devices/robots/configs.py: So100RobotConfig
@RobotConfig.register_subclass("so100") @dataclass class So100RobotConfig(ManipulatorRobotConfig): calibration_dir: str = ".cache/calibration/so100" # `max_relative_target` limits the magnitude of the relative positional target vector for safety purposes. # Set this to a positive scalar to have the same value for all motors, or a list that is the same length as # the number of motors in your follower arms. max_relative_target: int | None = None leader_arms: dict[str, MotorsBusConfig] = field( default_factory=lambda: { "main": FeetechMotorsBusConfig( port="/dev/tty.usbmodem58760431091", #ここを書き換える motors={ # name: (index, model) "shoulder_pan": [1, "sts3215"], "shoulder_lift": [2, "sts3215"], "elbow_flex": [3, "sts3215"], "wrist_flex": [4, "sts3215"], "wrist_roll": [5, "sts3215"], "gripper": [6, "sts3215"], }, ), } ) follower_arms: dict[str, MotorsBusConfig] = field( default_factory=lambda: { "main": FeetechMotorsBusConfig( port="/dev/tty.usbmodem585A0076891", #ここを書き換える motors={ # name: (index, model) "shoulder_pan": [1, "sts3215"], "shoulder_lift": [2, "sts3215"], "elbow_flex": [3, "sts3215"], "wrist_flex": [4, "sts3215"], "wrist_roll": [5, "sts3215"], "gripper": [6, "sts3215"], }, ), } ) cameras: dict[str, CameraConfig] = field( default_factory=lambda: { "laptop": OpenCVCameraConfig( camera_index=0, fps=30, width=640, height=480, ), "phone": OpenCVCameraConfig( camera_index=1, fps=30, width=640, height=480, ), } ) mock: bool = False
▼キャリブレーションの実行
lerobotのプロジェクトルートディレクトリから、以下のコマンドを実行してleaderアームとfollowerアームのキャリブレーションを実行します。
python lerobot/scripts/control_robot.py \ --robot.type=so100 \ --robot.cameras='{}' \ --control.type=calibrate \ --control.arms='["main_follower"]'
USBシリアル接続でエラーが発生した場合は、コンフィグファイルの設定を見直してください。また、Lerobotのインストール時に-eオプションを指定しなかった場合、設定が反映されません。その場合、pip install -e .[‘feetech’]を実行してLerobotのモジュールを再インストールしてください。
コマンド実行後は、指示に従って手動でロボットを指定のポーズにし、Enterキーを押してください。
ポーズは以下の順番で4つ指定してください。
1. ミドルポジション
アッパーアームとフォアアームが直角になるように姿勢を固定する。

2. ゼロポジション
ID2のサーボから前方で最大限伸ばす姿勢

3. ローテーティッドポジション
ミドルポジションの状態からリストを真下に向け、ショルダーとリストのヨー軸(垂直方向に回転する軸)を全て90度右へ回転させる。グリッパは真横に突き出す。

4. レストポジション
全ての関節を折りたたむ姿勢

以下のコマンドを実行しLeaderアームもFollowerアームと同様の手順でキャリブレーションを実行します。
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--robot.cameras='{}' \
--control.type=calibrate \
--control.arms='["main_follower"]'
▼キャリブレーション結果の確認
キャリブレーションの結果は、config.pyに記載されたフォルダにJSON形式で保存されています。デフォルトでは、lerobotのパッケージルートから.cache/calibration/so100にmain_leader.jsonとmain_follower.jsonが保存されます。これらのファイルには、リーダーとフォロワーのキャリブレーション値、各関節のオフセット、スタート値とエンド値が記載されています。キャリブレーションをやり直す場合は、このファイルを削除し、再度キャリブレーションを行ってください。
3. テレオペレーションの実行
leaderアームとfollowerアームを使ってテレオペレーションを行います。
▼ロボットの設置
ロボットをテーブルなど安定した台の上に二台設置します。後方からクランプで台座の左右を固定してください。followerアームは、大きく動いてもleaderアームやPCとぶつからないよう、周囲の物から十分に離して設置します。また、小さなお子さんが近づかないようにしましょう。突然の動作や暴走の可能性があります。
ロボットに電源を接続し、PCとUSBで接続してください。
▼テレオペレーションの実行
まずはカメラなしでテレオペレーションを行います。lerobotのプロジェクトルートから以下のコマンドを実行してテレオペレーションを開始します。
python lerobot/scripts/control_robot.py \ --robot.type=so100 \ --robot.cameras='{}' \ --control.type=teleoperate
ターミナルにログが表示され、ロボットが動作を開始します。操作する際は、リーダーアームをゆっくり持ちながら行ってください。リーダーアームの関節は動きやすいため、急に動かさないように注意し、グリップを握りながらもう片方の手でロボットのフォアアームを支えて動かします。

動作を停止する場合は、レストポジションにしてからCtrl+Cでスクリプトを停止してください。
▼カメラの確認
カメラの動作確認を行います。configs.pyを確認し、指定されているカメラの接続番号を確認してください。また、デフォルトではlattopカメラとmobileのカメラが設定されています。Android端末やiOS端末はPCやmacOSの外部カメラとして動作することが可能です。これらの接続方法については今回は触れません。phoneの設定はコメントアウトしておきます。
▫️lerobot/common/robot_devices/robots/configs.py: So100RobotConfigから抜粋
cameras: dict[str, CameraConfig] = field( default_factory=lambda: { "laptop": OpenCVCameraConfig( camera_index=0, # カメラ番号を指定 fps=30, width=640, height=480, ), # "phone": OpenCVCameraConfig( # camera_index=1, # fps=30, # width=640, # height=480, # ), } )
leaderとfollowerの姿勢を合わせて、以下のコマンドを実行すると先ほどと同様にテレオペレーションが開始されます。今度はカメラが起動し、映像がPCのディスプレイに表示されます。起動せずにすぐにプログラムが終了したり、PCに映像が表示されない場合はconfigs.pyでSO-ARM100の設定が変更されているか、カメラIDが正しいかを確認してください。
python lerobot/scripts/control_robot.py \ --robot.type=so100 \ --control.type=teleoperate
確認が終わったら先ほどと同様にロボットをレストポジションにした後スクリプトを停止します。
4. まとめ
今回はSO-ARM100のキャリブレーションとテレオペレーションの動作確認を行いました。コンフィグファイルの設定が正しくできていればはまりどころは少ない工程です。
次回からはlerobotを使いAIによるロボットの制御に挑戦を開始します。。