|
執筆バージョン: Unreal Engine 5.8
|
はじめに
今回は、Unreal Engine(UE)を使って、ロボットアームに物をつかむ動作を学習させる実験をしてみました。
近年注目されている「フィジカルAI」は、AIが現実世界の物体や環境を認識し、ロボットなどを動かす技術です。今回は、UE上の仮想空間でロボットアームの動作を学習させ、その結果を実際のロボットアームで試してみます。
これが何の役に立つのか
AIでロボットに作業を覚えさせるには、人が実機を動かして見せる「お手本」がたくさん必要です。
今回は、このお手本づくりをUE5の仮想空間とコードに置き換えられるかを試しました。

機材
使用したのは、小型ロボットアーム「SO-101」。ロボットアーム本体に電源とWebカメラを合わせても、PCを除く機材費は56,000円でした。
| 機材 |
購入金額 |
| ロボットアーム本体(SO-101) |
51,000円 |
| 電源 × 2 |
3,000円 |
| Webカメラ |
2,000円 |
| 合計(PCを除く) |
56,000円 |
↓UE上での学習(UE5画面)
↓学習を元に、実機で確認(実写) UE×AIの学習だけで実際につかめた!
この記事では、UEのSceneCapture2Dで2方向の画像を撮り、アームの状態や動作の指令と組にして、学習用のお手本データを集める仕組みをご紹介します。
実機でデータを集めるには、棒を置き直したり、カメラの位置を調整したりする手間がかかります。
UEなら開始状態をプログラムで戻し、同じ手順で収集を繰り返せます。今回は、この仕組みで集めたお手本を使い、学習モデルを作成するところまで試しました。
1. UEのシーンを用意する
UEで作つくられたデジタルツインのヒストリアのオフィスのシーンを使い、小型ロボットアームのSO-101を動かします。
机上の黄色い棒をつかみ、紙に描いた別のパネルへ運ぶ課題です。

UE内では、アームの6関節に補間した角度を直接与えます。
物理の力で動かしているのは、トルクに上限を設けた指の開閉部分です。
机の上にアームと棒、置き先を示す紙を配置します。紙はA4、6枚のパネルは各75×75mmで、寸法を実機に合わせました。
例では、パネル1にある棒をパネル6へ運びます。

2. SceneCapture2Dで2方向から撮る
棒と指の重なりを別の方向から確認できるように、UE内の仮想カメラであるSceneCapture2Dを2台置きます。
レベル内でCapture_AとCapture_BというActor Labelを付け、位置・向きを調整します。
次の表は、本プロジェクトの収集処理で使用している設定です。
| 項目 |
設定と目的 |
| Texture Target |
カメラごとに別のRGBA8 Render Targetを用意 |
| Capture Source |
Final Color (LDR) in RGB。表示用の色をPNGに保存 |
| FOV Angle |
カメラごとの水平画角。収集時はカメラ設定ファイルから読み込み |
| Exposure |
Manual。撮影ごとの自動露出変化を避け、カメラごとに値を固定 |
| Motion Blur |
0。止めた状態を記録 |
| Capture Every Frame |
有効。物理を止めている間も描画を更新 |
撮影にはUnreal EngineのPython APIのSceneCaptureComponent2D.capture_scene()、
PNGへの保存にはRenderingLibrary.export_render_target()を使います。
保存先は運搬と手順ごとに分け、同じ時点の2画像を組にします。
カメラA
カメラB
3.運搬のお手本を記録する
お手本は、Pythonのプログラムが決めたルールどおりに自動で作ります。UEでは棒の位置や、指が棒に触れたかが正確に分かるので、それを見ながらつかんで運ぶまでの9つの動きを1つずつ進めます。
時間を止めてから撮る
撮影中に棒が動くと画像と記録がずれます。そこで物理計算をプログラムの指示で1/240秒ずつだけ進めて撮るときは止めます。画像は関節の角度や次の指令とセットで保存します。
指先の行き先を決める
指先をどこへ、どの向きに動かすかを決め、関節の角度を逆算します。

接触を確かめて、持ち上げる
つかむ位置では、腕を止めたまま指だけを閉じます。閉じる指令を送っただけでは成功とせずに指先が棒の近くにあり、両側の指が棒に触れたことを確かめてから持ち上げ、置き先へ運びます。

置いて、指を開き、離れる
棒の中心と置き先の水平距離が7mm未満になったら下ろして指を開いて上へ退避します。棒の中心が置き先に入りに止まっているのが見えれば成功です。

学習データを3,722件あつめました。画像や関節の記録の照合で食い違いがあれば、そのデータは追加しません。
4.集めたお手本から、まとめて動きを予測する

AIには、カメラ2台の画像と関節の角度などを見せて運び終えるまでの手順を答えさせます。
答えをお手本と比べ、ずれが減るように少しずつ調整します。これをくり返すのが「学習」です。
AIはPyTorchで作り、画像の数値化には画像認識でよく使われるResNet18を使います。画像の色から探した黄色い棒の位置なども加えますが、UEが知っている棒の正確な位置は使いません。
動かすときは最初に手順を一度だけ決め、その順に動かします。
UE上で学習結果を実際にロボットアームで試したら見事成功!
学習に使ったお手本と同じ開始状態で動かし、最後まで運べました。
アームの角度と棒の位置・向きは学習時と一致し、開始画像もほぼ同じです。
指先位置の誤差は平均14.9mm、最大59.8mmでした。
まとめ
UEで作ったシーンにSceneCapture2Dを2台置き、物理を進めるタイミングと撮影を分けることで、画像と状態がそろったお手本を収集できました。
学習結果を見るときも、使った入力と試験条件をそろえて確認することが大切です。
この撮影の仕組みは、部品の姿勢推定や外観検査など、ロボットの運搬以外の検証用データ作りにも応用できます。
今回は、Unreal Engineを使ったフィジカルAIの学習を試してみました。
ヒストリア・エンタープライズでは、こうした仮想環境を活用したフィジカルAIの学習・検証についてもご相談を承っています。
ご興味がありましたら、お気軽にお問い合わせください。
ヒストリア・エンタープライズ お問い合わせはこちら