この記事では、SO-ARM101/100を用いてデータセットを作成し、そのデータセットを学習し、学習済みモデルでロボットアームをAIから操作する方法について解説します。
so-100ロボットとso-101ロボットは互換性があるので、so-100ロボットを動かす場合はコードのso-101箇所をso-100へ書き直し実装してみて下さい。
2台のUSBカメラを接続し、カメラポートの番号を確認します。
※カメラは1台でも動かせます。PCのカメラでも動かせます。
下記のファイルからカメラのポートの番号を更新して下さい。
lerobot/lerobot/common/robot_devices/robots/configs.py
基準値の学習回数値が大きいため、まず動作確認をする場合は下記のファイルから学習回数値を小さくして下さい。動作確認用は4000回に設定しています。確認後は精度を上げるために値を変更してみて下さい。
下記のファイルの場所から学習回数を変更します(10_000_000→40_000)
lerobot/lerobot/configs/train.py
それでは、ロボットアームを実際に操作し、データセットを作成しましょう。下記が実行コマンド例です。<フォルダ名>の箇所を書き直します。データを収集する際は音声で指示があるので音量はONにしておいて下さい。
※データセットを保存するファイル名はデータを作るたびに変更して下さい。
下記にパラメーターの修正箇所とその説明となります。
📝作成したデータセットを削除したい場合は下記を実行して下さい。
データセットの保存先へ移動。
作成したデータセットを用いて学習をおこないます。
※output_dirに学習済みの結果が保存されます。
学習結果を用いてロボットアームをAIで動作します。
※repo_idで指定するデータセットを保存するファイル名はデータを作るたびに変更して下さい。
※control.policy.pathは、学習時にoutput_dirの項目で指定したフォルダ名と同じ場所を指定します。
📝学習モデルを下記のファイル場所から削除できます。
lerobot/outputs/train
カメラ設定の更新
2台のUSBカメラを接続し、カメラポートの番号を確認します。
※カメラは1台でも動かせます。PCのカメラでも動かせます。
ls /dev/video*
PC付属のカメラは一般的に/dev/viode0, /dev/viode1が割り振られます。USBカメラを追加した場合は、1つ目のカメラは/dev/video2, /dev/video3,2つ目のカメラは、/dev/video4, /dev/video5が割り振られるため、/dev/video2, /dev/video4の値をindexに2, 4と設定します。カメラの位置はカメラを抜き差しし、ls /dev/video*を実行することで、どのカメラがどの番号と対応しているか確認します。
下記のファイルからカメラのポートの番号を更新して下さい。
lerobot/lerobot/common/robot_devices/robots/configs.py
学習回数の変更
基準値の学習回数値が大きいため、まず動作確認をする場合は下記のファイルから学習回数値を小さくして下さい。動作確認用は4000回に設定しています。確認後は精度を上げるために値を変更してみて下さい。
下記のファイルの場所から学習回数を変更します(10_000_000→40_000)
lerobot/lerobot/configs/train.py
Record the dataset : データセット作成
それでは、ロボットアームを実際に操作し、データセットを作成しましょう。下記が実行コマンド例です。<フォルダ名>の箇所を書き直します。データを収集する際は音声で指示があるので音量はONにしておいて下さい。
※データセットを保存するファイル名はデータを作るたびに変更して下さい。
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--control.type=record \
--control.fps=30 \
--control.single_task="Grasp a lego block and put it in the bin." \
--control.repo_id=<フォルダ名>/so101_test \
--control.tags='["so101","tutorial"]' \
--control.warmup_time_s=5 \
--control.episode_time_s=10 \
--control.reset_time_s=5 \
--control.num_episodes=30 \
--control.display_data=true \
--control.push_to_hub=false
下記にパラメーターの修正箇所とその説明となります。
【パラメータの説明】
- control.repo_id: データセットの保存先フォルダ。一度データセットを作成したあとに、同じフォルダ名を指定するとエラーがでます。
- wormup-time-s: 初期化時間
- episode-time-s: 毎回のデータ収集時間を表す。
- reset-time-s: 各データ収集間の準備時間を表す。
- num-episodes: 収集されるデータ グループの数を示す。
- push-to-hub:データを画面上に表示するかを示す。HuggingFace Hubにデータをアップロードするかどうかを決定します。
📝作成したデータセットを削除したい場合は下記を実行して下さい。
データセットの保存先へ移動。
cd ~/.cache/huggingface/lerobot/
ファイルを削除。
rm -rf 削除したいファイル名
📝Ubuntuマシンの環境変数(LANG)を英語に変更。データセットを学習する際の音声が他言語の場合は下記から修正して下さい。
nanoを実行し、.bashrcの言語設定を修正。
~/.bashrc
nanoを実行し、.bashrcの言語設定を修正。
nano ~/.bashrc
下記のコマンドを画像のように入力して下さい。
export LANG=en_US.UTF-8
~/.bashrc
Train : データセットを学習
作成したデータセットを用いて学習をおこないます。
※output_dirに学習済みの結果が保存されます。
python lerobot/scripts/train.py \
--dataset.repo_id=<ファイル名>/so101_test \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--job_name=act_so101_test \
--policy.device=cuda \
--wandb.enable=false
RTX4060のノートパソコンの場合、4000stepの学習に20分ほど時間がかかります。
Evaluate your policy : ロボットアームを学習済みモデルで操作
学習結果を用いてロボットアームをAIで動作します。
※repo_idで指定するデータセットを保存するファイル名はデータを作るたびに変更して下さい。
※control.policy.pathは、学習時にoutput_dirの項目で指定したフォルダ名と同じ場所を指定します。
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--control.type=record \
--control.fps=30 \
--control.single_task="Grasp a lego block and put it in the bin." \
--control.repo_id=<フォルダ名>/eval_act_so101_test \
--control.tags='["tutorial"]' \
--control.warmup_time_s=5 \
--control.episode_time_s=30 \
--control.reset_time_s=30 \
--control.num_episodes=10 \
--control.push_to_hub=true \
--control.policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
【パラメータの説明】
- wormup-time-s: 初期化時間
- episode-time-s: 毎回のデータ収集時間を表す。
- reset-time-s: 各データ収集間の準備時間を表す。
- num-episodes: 収集されるデータ グループの数を示す。
- push-to-hub:データを画面上に表示するかを示す。HuggingFace Hubにデータをアップロードするかどうかを決定します。
- control.policy.path: 学習済みモデルの読み込み先
📝学習モデルを下記のファイル場所から削除できます。
lerobot/outputs/train