Unreal Engine 5を使ってみる その4(Unreal Learning Kit:仮想ロボットのトレーニング レッスン1)
はじめに
今回はUnreal Engine 5で、仮想ロボットのチュートリアルがあったので試してみました。これからシミュレーションでロボットを制御するための第一歩です。
▼こちらのページを参考にしました。
仮想ロボットのトレーニングを学ぼう - Unreal Engine
今回はレッスン1を試してみました。レッスンのタイトルを見ると、実際のロボコンでも取り組まれているようなラインナップですね。
ちなみに対象学年が「8~12年生(アメリカ/13歳以上)」と書かれていたのですが、13~18歳対象のようです。アメリカとは学年の表記が違うんですね。
▼以前の記事はこちら
プロジェクトの作成
まずはプロジェクトを作成します。
▼先程のページから、コースアセットのダウンロードページに飛びます。

▼こちらのページに飛ぶので、ランチャーで開きます。
Unreal Learning Kit:UE オンラインラーニング - UE マーケットプレイス (unrealengine.com)
▼プロジェクトを作成します。

Unreal Learning Kitには、ゲームセクションとロボティックセクションがあります。今回はロボティックセクションを扱います。
プロジェクトを開くと、まずはゲームセクションの画面が表示されました。
▼LeverやButton、触れると消えるオブジェクトなど、参考になりそうなサンプルがあります。


LearningKitのRobotsを試してみる
マップを開く
コンテンツドロワーからLearningKit_RobotsのMaps_Robotsを開き、試してみました。
▼L1~L5のフォルダがありますが、それぞれ参考ページのレッスンに該当しています。レッスンプラン、生徒向けガイドも用意されています。

▼レッスン1の生徒向けガイドはこちら。こちらを見ながら進めました。
unreal-engine-robotics-student-guide-1-ja-c43b9a64fd2f.pdf (unrealengine.com)
なお、レベルの編集中に数字を押すと、それぞれのロボットにフォーカスした位置に移動する場合があります。
1-1:Balance and Design
BalanceAndDesignのAとBがあるのですが、Aは車輪やキャスターが変な位置の場合、Bは適切な位置の場合のようです。
▼変な位置に取り付けられています。



▼倒れていました。

Unreal Engineなのでプログラミングやゲームのイメージが強かったのですが、こういった配置も考慮する必要があるんですね。
とりあえずタイヤを取り付けてモーターを回せば走るというわけではないようです。
▼Bでの配置はこんな感じ。こちらはちゃんと走行していました。

1-2:Friction Traction
ここでは「トラクション」がテーマになるのですが、まずはトラクションについて調べてみました。
▼こちらの記事が図付きで分かりやすいかと思います。
『トラクション』 ってなんだ? 『パワー』ってなんだ? | ①大パワーのFFがない理由(トラクション効率) | TOPPER (mf-topper.jp)
要するに、駆動輪と重心の位置が近いと接地荷重が増え、路面とタイヤの摩擦力が増加し、加速度が大きくなるといったところでしょうか。
▼駆動輪が重心位置から離れた構成だと、坂を上ることができていません。


▼相撲をさせると、足長のロボットが押し出されました。


1-3:Moving Straight
モーターでの直進がテーマになっています。ここで、1-1のロボットのブループリントを見てみます。
▼アウトライナーの「BPC_Robot_○○を編集」で、編集画面を開くことができます。

▼Run Motorでモーターを回転させているようです。片方のモーターは180度回転させて取り付けているので、Speedに-1をかけています。

▼1-3では走行後、停止しました。


▼Run Motor for Timeが使われていますね。デフォルト値は3のようで、そのあとは惰性で走っているのかな?と思います。

1-4:Turning
1-3は直進だったのに対し、1-4は旋回です。
▼左から円弧を描いた回転、片方の車輪を基点とした回転、超信地旋回的な回転をします。

▼ぐるぐる回っていました。


▼Pivot Turnのブループリントはこちら。回転の基点となるMotor Bは、Linear Dampingで線形減衰しているようです。


▼Linear Dampingに関するページがありました。物理ボディを止めるための最小値が100だそうです。今は100になっていますね。
▼Spin Turnのブループリントはこちら。二つの車輪が逆回転している状態ですね。

▼Arc Turnのブループリントはこちら。回転速度が異なっています。

1-5:Dead Reckoning
Dead Reckoningは推測航法のことで、移動距離が長いほど誤差が大きくなるようです。
▼実際にはカーナビにも使われていて、GPSだけでなく加速度センサーなどを組み合わせているようです。
https://www.furuno.com/jp/gnss/technical/tec_dead
▼何回かスタートさせると、少し違った軌道になっていました。

▼障害物に衝突する場合と、車輪が引っかかって回転していることがありました。センサーなどで避ける必要がありそうですね。


▼過去に二輪ロボットを作ったときも、同様に椅子の足に引っかかってぐるぐる回っていることがありました。まさにこんな感じです。
1-6:Challenge
いよいよチャレンジ!数値を変えて、マップ内を走行できるようにしてみます。
▼こんな感じのマップです。

▼最初の状態では、前進して停止します。

時間とスピードを調整して繋げていき、8の字を描くようにしてみました。
▼全体のフローはこちら。Motor AとBの変数は一つずつ用意して繋げたほうがすっきりしそうですね。

▼実際に動かしたときの動画がこちら。
1-5の話ですが、何回か実行すると若干異なるルートで走行することがありました。
さらにブループリントを見てみる
Run MotorノードやRun Motor for Time ノードを使っていましたが、これらもダブルクリックすると内部の処理を見ることができます。
▼Run Motorはこちら。Set Drive Startで動いているようです。

▼Run Motor for Timeはこちら。こちらにはSet Drive Endがありますね。

さらにSet Drive Start/Endも中身を見ることができます。
▼Angular Drive Params、Angular Velocity Targetなどが使われているようです。

▼Angular Velocity Targetについては最低限の説明しかないのですが、ターゲットの角速度をセットするようです。
▼シミュレーションで現実世界に近づけるため、ランダムな変数も用意されているようです。

またロボットが衝突すると音が鳴るのですが、それもプログラムされていました。
▼イベント Hitのところにありました。

▼ロボットが速く動いているときに衝突すると、閾値を超えて音が鳴るようですね。

最後に
参考にしたページではコース長さが5時間と書いていたのですが、しっかり取り組むともっと時間がかかりそうですね。
シミュレーションでロボットを動かすのは、実際にロボットのパラメータを調整しているときのようでした。ロボット教室でバイトをしていたときはLEGOのマインドストームを子どもたちが使っていて、数値を少しずつ変えながら調整していました。
もっと現実的でなくゲームらしい動きをすると思っていたので、物理的な要素がちゃんと考えられているように感じました。他のレッスンも時間があるときに試してみようと思います。