3.6K Views
April 10, 24
スライド概要
この資料では、Unityの箱庭アセット作るための情報を整理しています。
- 前提とする環境
- GitHubリポジトリ情報
- 箱庭Unity環境のインストール方法
- Workシーンの説明
- 箱庭Unityアセットの作成手順(例)
TOPPERS/箱庭WG活動でUnityやらAthrillやらmROSやら触ってます。 最近は仕事の関係でWeb系の技術に注力しつつ、箱庭への転用を模索しています。 2023年8月1日:合同会社箱庭ラボに移動しました
箱庭(Hakoniwa) Unity-Asset 合同会社箱庭ラボ 森崇
はじめに • この資料では、Unityの箱庭アセット作るための情報を整理しています。 • 前提とする環境 • GitHubリポジトリ情報 • 箱庭Unity環境のインストール⽅法 • Workシーンの説明 • 箱庭Unityアセットの作成⼿順(例) 2
前提とする環境 • OS︓Windows、MacOS、Ubuntu • メモリ︓8GB以上 • GPUメモリ︓8GB以上 • Unityバージョン • Unity Hub: v3.7.0以上 • Unity︓2022.3.10f1以上 • ターミナル • Windowsの場合は、WSL2が必要です。 • それ以外の場合は、標準のターミナルをご利⽤ください。 3
GitHubリポジトリ情報 • URL • https://github.com/toppers/hakoniwa-unity-simasset-plugin • リポジトリ名 • hakoniwa-unity-simasset-plugin • 説明 • 箱庭のUnityアセットの共通機能を管理しています。 • 将来的にはUnityアセットストアでの公開を⽬指しています。 • ライセンス • TOPPERSライセンス 4
箱庭Unity環境のインストール⽅法 • インストール⼿順 • 動作確認⼿順 インストール成功すると、 右図のようにロボットをキー ボードで操作できます。 動画:https://github.com/toppers/hakoniwa-unity-simasset-plugin/blob/main/README.md#%E3%83%87%E3%83%A2 5
Workシーンの説明 • Workシーンは、箱庭Unityアセットを作成するためのシーンです。 • 箱庭Unityアセットは、「Robot」配下に配置します。 • デフォルトでは以下のように、2つのアセットが配置されています。 SampleRobotのカメラ データを表⽰している様⼦ SampleRobot 箱庭のデフォルトのロボットです。 作動モーターで動作し、センサとして カメラや2DLiDARがあります SampleRobotTestDriver SampleRobotのテストドライバです。 キー⼊⼒を受け付け、SampleRobot にPDUデータを送信します。また、 SampleRobotが送信するPDUデータ を受信してデータ表⽰します。 6
箱庭Unityアセットの作成⼿順(例) • 作りたいものの仕様を検討する • 外部との通信データ仕様を検討する • 箱庭部品選定 • 箱庭部品を組み⽴てる • 荷物運搬BOXを⾃作する • 超⾳波センサを⾃作する • テストドライバを作成する • 動作確認する 7
作りたいものの仕様を検討する 基本機能 ロボット部品 実現⽅法 遠隔操縦 アクチュエータ 作動モーターにタイヤを2個つけて実現する 荷物運搬⽤BOX 超⾳波 センサー Body キャスター 障害物検出 超⾳波センサ バンパー バックに球形コライダーを2個つける センサの有効範囲は5mとして、 4⽅向監視する ・左(-90度)、右(90度) ・斜め左(-10度)、斜め右(10度) 衝突検出 バンパーセンサ 衝突検出︓ON ⾮検出時︓OFF 荷物着脱検出 荷物着脱検出センサ 荷物あり︓ON 荷物なし︓OFF 荷物運搬 荷物運搬⽤BOX コライダーを4⽅につける キャスター アクチュエータ 超⾳波 センサー 荷物着脱 検出センサ キャスター バンパー アクチュエータ 8
外部との通信データ仕様を検討する 部品 通信データ型 通信データ名 送信周期 アクチュエータ geometry_msgs/Twist cmd_vel - 超⾳波センサ pico_msgs/LightSensor ultrasonic_sensor 20msec バンパーセンサ std_msgs/Bool bumper_sensor 20msec 荷物着脱検出センサ std_msgs/Bool baggage_sensor 20msec 9
箱庭部品選定 既存の箱庭部品が使えないかチェックする (Assets/Model/HakoRoboParts) 基本部品 マテリアル ArticulationBody Unityの C#スクリプト アクチュエータ ArticulationBody ロボットルート ロボット毎に1個割り当てする (ロボット全体制御パーツ) センサ Unityの C#スクリプト Unityの C#スクリプト
選定結果 基本機能 ロボット部品 選定したもの 遠隔操縦 アクチュエータ 02_Actuator/ - DifferentialMotorController - L-Wheel - R-Wheel キャスター 01_basic/ - Caster 障害物検出 超⾳波センサ 対応するものはなかった(⾃作する) 衝突検出 バンパーセンサ 03_Sensor/ - TouchSensor 荷物着脱検出 荷物着脱検出センサ 03_Sensor/ - TouchSensor 荷物運搬 荷物運搬⽤BOX 対応するものはなかった(⾃作する) 荷物運搬⽤BOX 超⾳波 センサー Body キャスター バンパー アクチュエータ 超⾳波 センサー 荷物着脱 検出センサ キャスター バンパー アクチュエータ 11
箱庭部品を組み⽴てる(ベース︓1/2) • Assets/Prefab/SampleRobotを複製して、BuggageTransporter という名前で新しいプレハブを作成する。 12
箱庭部品を組み⽴てる(ベース︓2/2) • MainBody以外の部品を、⼀旦、全部外す • ヒエラルキービューからたどります。 13
箱庭部品を組み⽴てる(タイヤ︓1/4) • 作動モータを取り付ける • Interface-D/Interface-DFの下に、DifferentialMotorControllerをD&D 14
箱庭部品を組み⽴てる(タイヤ︓2/4) • 左のタイヤをつける • DifferentialMotorController/Interface-Lの下にL-WheelをD&D 15
箱庭部品を組み⽴てる(タイヤ︓3/4) • 左のタイヤをつける • DifferentialMotorController/Interface-Rの下にR-WheelをD&D 16
箱庭部品を組み⽴てる(タイヤ︓4/4) • PDUデータ仕様に合わせて変更する • DifferentialMotorControllerのインスペクタービューを 表⽰して変更する • 今回は、共有メモリベースでの通信とするので、 • Io_MethodをSHM • Comm_MethodをDIRECT • としました。 17
箱庭部品を組み⽴てる(フロント︓1/1) • MainBodyの前⾯にバンパやセンサを設置するので、サブホルダをつける • Interface-F配下に、MainBodySubHolderを設置する 18
箱庭部品を組み⽴てる(バンパ︓1/4) • MainBodySubHolderにバンパ︓タッチセンサをつける • Interface配下に、TouchSensorを設置する • ただし、デフォルトではサイズが⼩さいのと位置もずれているので以下のように調整します。 変更前 変更後 ※デフォルトのタッチセンサは衝突検出はできますが、衝突してもすり抜けてしまいますので、 ※必要に応じて⼲渉オブジェクト(isTriggerがFalseのコライダー)を配置してください。 19
箱庭部品を組み⽴てる(バンパ︓2/4) • MainBodySubHolderにバンパ︓タッチセンサをつける • Interface配下に、TouchSensorを設置する • ただし、デフォルトではサイズが⼩さいのと位置もずれているので以下のように調整します。 20
箱庭部品を組み⽴てる(バンパ︓3/4) • バンパの⾊を⿊⾊にする(LightBlackマテリアルをD&D) 21
箱庭部品を組み⽴てる(バンパ︓4/4) • PDUデータ仕様に合わせて変更する • TouchSensorのインスペクタービューを表⽰して変更する • Topic_name 及び update_cycle を仕様に合わせる • また、今回は、共有メモリベースでの通信とするので、 • Io_MethodをSHM • Comm_MethodをDIRECT • としました。 22
箱庭部品を組み⽴てる(キャスター︓1/1) • MainBodyの後⽅にキャスターを設置するので、BodyBackをつける • Interface-D/Interface-DB配下に、 BodyBackを設置する • 若⼲、⽔平ではないので、Yの位置を調整しています。(参照︓Inspectorビュー) 23
荷物運搬BOXを⾃作する • 作り⽅︓ • Cube5個⽤意して、サイズ変更して、BOX上に配置する • 床⾯にタッチセンサを配置する 24
超⾳波センサを⾃作する(1/3) • Unityを利⽤した超⾳波センサの実装としては、 • Physics.Raycast • を利⽤します。 • 今回の場合は、4⽅向のセンシングになるので、 • センシング時に4⽅向の距離測定を⾏うことで実現します。 • ソースコード︓ LightSensor4way 超⾳波センサ実装のイメージ︓ Physics.Raycast() 障害物 測定ポイント Unityのコライダーをアタッ チしたゲームオブジェクト 障害物までの距離 25
超⾳波センサを⾃作する(2/3) • 距離を測定するスクリプト解説︓ 前⽅⽅向を取得 (呼び出し元で⽅向を変えています) 現在位置 検出範囲 前⽅⽅向 衝突検出した距離 障害物検出した場合、その光線を緑⾊で表⽰する ( Unityのシーンビューの場合のみ) 障害物検出しなかった場合、その光線を⾚⾊で表⽰する ( Unityのシーンビューの場合のみ) 26
超⾳波センサを⾃作する(3/3) • 作成したスクリプトをアタッチ。⾒た⽬としては、LiDARっぽいシリンダーを利⽤。 27
テストドライバを作成する • ロボット名とPDUデータ名を確認する • 動作確認内容を検討する • 動作確認プログラムを作成する 28
ロボット名とPDUデータ名を確認する(1/3) • 箱庭のPDUデータにアクセス・オブジェクトを取得するためには • ロボット名とPDU名が必要です。 • ロボット名は、ヒエラルキービューのRobotは以下の名前です。 • ロボット名︓BuggageTransporter 29
ロボット名とPDUデータ名を確認する(2/3) • PDUデータ名は、各部品の通信データ名です。 • スクリプトアタッチする際に、通信データ名を以下で設定しています。 部品 通信データ型 通信データ名 アクチュエータ geometry_msgs/Twist cmd_vel 超⾳波センサ pico_msgs/LightSensor ultrasonic_sensor バンパーセンサ std_msgs/Bool bumper_sensor 荷物着脱検出センサ std_msgs/Bool baggage_sensor 30
ロボット名とPDUデータ名を確認する(3/3) • 箱庭のPDUデータにアクセス・オブジェクトを取得するための名前は、 • <ロボット名>_<通信データ名>Pdu • です。 ロボット名︓BuggageTransporter 部品 通信データ名 PDUデータ・アクセスオブジェクト名 アクチュエータ cmd_vel BuggageTransporter_cmd_velPdu 超⾳波センサ ultrasonic_sensor BuggageTransporter_ultrasonic_sensorPdu バンパーセンサ bumper_sensor BuggageTransporter_bumper_sensorPdu 荷物着脱検出センサ baggage_sensor BuggageTransporter_baggage_sensorPdu 31
動作確認内容を検討する 基本機能 ロボット部品 動作確認内容 遠隔操縦 アクチュエータ キーボード操作で移動できるか確認する キャスター 移動時にボディを⽀えられるか 障害物検出 超⾳波センサ 障害物を配置して、レーザ光線の⾊が変わ ることを確認する 緑︓検出 ⾚︓未検出 衝突検出 バンパーセンサ 衝突検出︓⾚(ゲームオブジェクトの⾊) ⾮検出時︓⻘(ゲームオブジェクトの⾊) 荷物着脱検出 荷物運搬 荷物着脱検出センサ 荷物運搬⽤BOX 荷物あり︓⾚(ゲームオブジェクトの⾊) 荷物なし︓⻘(ゲームオブジェクトの⾊) 荷物を落とすためのゲームオブジェクトを作成 し、ロボットの荷物運搬⽤BOXに荷物を落と す。 動作確認するための機能要素 1 キーボード操作⽤ ゲームオブジェクト 2 バンパーセンサ確認⽤ ゲームオブジェクト 3 荷物着脱検出センサ確認 ゲームオブジェクト 4 荷物を落とすための ゲームオブジェクト 32
動作確認プログラムを作成する • テストドライバ概要 • キーボード操作⽤ゲームオブジェクト • バンパーセンサ確認⽤ゲームオブジェクト • 荷物着脱検出センサ確認ゲームオブジェクト • 荷物を落とすゲームオブジェクト 33
テストドライバ概要(1/3) • 考え⽅その1 • テスト対象ロボットのPDUデータをテストドライバがアクセスして、 • ロボットが期待した動きやデータを返すかをチェックする テスト対象ロボットに ⼊⼒を与える (移動指⽰など) PDUデータ (アクチュエータ) テスト ドライバ テスト対象 ロボット PDUデータ (センサ) テスト対象ロボットの 出⼒を確認する (タッチセンサの値とか) 34
テストドライバ概要(2/3) • 考え⽅その2 • テストドライバの⼊出⼒確認には、ゲーム機能を利⽤する キーボード操作⽤ ゲームオブジェクト PDUデータ (アクチュエータ) 1 バンパーセンサ確認⽤ ゲームオブジェクト PDUデータの値に応 じてゲームオブジェク トの⾊を変更する OFF テスト ドライバ PDUデータ (センサ) 2 ON 35
テストドライバ概要(3/3) • 考え⽅その3 • テストドライバは、箱庭のロボットと同じ位置付けとして作成する Robot配下にテストドライバを配置する テストドライバに通常のロボットと 同じスクリプトをアタッチする 36
キーボード操作⽤ゲームオブジェクト(1/2) • キーボード操作で作動モーターを移動させるプログラムは箱庭にすであります。 • DifferentialMotorControllerTestDriver.cs • MotorTestDriver 仕様︓キー⼊⼒ ↑︓前進。キー押下し続けると加速します。 ↓︓後進。キー押下し続けると加速します。 →︓右旋回 ←︓左旋回 スペースキー︓停⽌ 37
キーボード操作⽤ゲームオブジェクト(2/2) • テストドライバの配置 38
バンパーセンサ確認⽤ゲームオブジェクト(1/2) • タッチセンサの動作チェックプログラムは箱庭にすであります。 • TouchSensorTestDriver.cs • TouchSensorTestDriver 39
バンパーセンサ確認⽤ゲームオブジェクト(2/2) • テストドライバの配置 40
荷物着脱検出センサ確認ゲームオブジェクト • テストドライバの配置 41
荷物を落とすゲームオブジェクト(1/2) • 荷物を落とすプログラムは箱庭にすであります。 • ColliderTriggerControl.cs • Baggage 仕様︓キー⼊⼒ A︓荷物が落ちます。 42
荷物を落とすゲームオブジェクト(2/2) • テストオブジェクトの配置 テストオブジェクトは、 Workシーン直下に 配置します 理由︓ PDUデータアクセスしないため 43
動作確認する 前進して、バンパ接触、荷物を落として、荷物着脱センサ反応 • その後、超⾳波センサの光線を確認 • https://www.youtube.com/watch?v=XXcHeae4AHE 44