Slide 1

Slide 1 text

箱庭(Hakoniwa) Unity-Asset 合同会社箱庭ラボ 森崇

Slide 2

Slide 2 text

はじめに • この資料では、Unityの箱庭アセット作るための情報を整理しています。 • 前提とする環境 • GitHubリポジトリ情報 • 箱庭Unity環境のインストール⽅法 • Workシーンの説明 • 箱庭Unityアセットの作成⼿順(例) 2

Slide 3

Slide 3 text

前提とする環境 • OS︓Windows、MacOS、Ubuntu • メモリ︓8GB以上 • GPUメモリ︓8GB以上 • Unityバージョン • Unity Hub: v3.7.0以上 • Unity︓2022.3.10f1以上 • ターミナル • Windowsの場合は、WSL2が必要です。 • それ以外の場合は、標準のターミナルをご利⽤ください。 3

Slide 4

Slide 4 text

GitHubリポジトリ情報 • URL • https://github.com/toppers/hakoniwa-unity-simasset-plugin • リポジトリ名 • hakoniwa-unity-simasset-plugin • 説明 • 箱庭のUnityアセットの共通機能を管理しています。 • 将来的にはUnityアセットストアでの公開を⽬指しています。 • ライセンス • TOPPERSライセンス 4

Slide 5

Slide 5 text

箱庭Unity環境のインストール⽅法 • インストール⼿順 • 動作確認⼿順 5 動画:https://github.com/toppers/hakoniwa-unity-simasset-plugin/blob/main/README.md#%E3%83%87%E3%83%A2 インストール成功すると、 右図のようにロボットをキー ボードで操作できます。

Slide 6

Slide 6 text

Workシーンの説明 • Workシーンは、箱庭Unityアセットを作成するためのシーンです。 • 箱庭Unityアセットは、「Robot」配下に配置します。 • デフォルトでは以下のように、2つのアセットが配置されています。 6 SampleRobot 箱庭のデフォルトのロボットです。 作動モーターで動作し、センサとして カメラや2DLiDARがあります SampleRobotTestDriver SampleRobotのテストドライバです。 キー⼊⼒を受け付け、SampleRobot にPDUデータを送信します。また、 SampleRobotが送信するPDUデータ を受信してデータ表⽰します。 SampleRobotのカメラ データを表⽰している様⼦

Slide 7

Slide 7 text

箱庭Unityアセットの作成⼿順(例) • 作りたいものの仕様を検討する • 外部との通信データ仕様を検討する • 箱庭部品選定 • 箱庭部品を組み⽴てる • 荷物運搬BOXを⾃作する • 超⾳波センサを⾃作する • テストドライバを作成する • 動作確認する 7

Slide 8

Slide 8 text

作りたいものの仕様を検討する 8 基本機能 ロボット部品 実現⽅法 遠隔操縦 アクチュエータ 作動モーターにタイヤを2個つけて実現する キャスター バックに球形コライダーを2個つける 障害物検出 超⾳波センサ センサの有効範囲は5mとして、 4⽅向監視する ・左(-90度)、右(90度) ・斜め左(-10度)、斜め右(10度) 衝突検出 バンパーセンサ 衝突検出︓ON ⾮検出時︓OFF 荷物着脱検出 荷物着脱検出センサ 荷物あり︓ON 荷物なし︓OFF 荷物運搬 荷物運搬⽤BOX コライダーを4⽅につける Body 荷物運搬⽤BOX キャスター アクチュエータ バンパー 超⾳波 センサー 荷物着脱 検出センサ バンパー キャスター 超⾳波 センサー アクチュエータ

Slide 9

Slide 9 text

外部との通信データ仕様を検討する 9 部品 通信データ型 通信データ名 送信周期 アクチュエータ geometry_msgs/Twist cmd_vel - 超⾳波センサ pico_msgs/LightSensor ultrasonic_sensor 20msec バンパーセンサ std_msgs/Bool bumper_sensor 20msec 荷物着脱検出センサ std_msgs/Bool baggage_sensor 20msec

Slide 10

Slide 10 text

箱庭部品選定 基本部品 ArticulationBody アクチュエータ ArticulationBody Unityの C#スクリプト センサ Unityの C#スクリプト マテリアル ロボットルート ロボット毎に1個割り当てする (ロボット全体制御パーツ) Unityの C#スクリプト 既存の箱庭部品が使えないかチェックする (Assets/Model/HakoRoboParts)

Slide 11

Slide 11 text

選定結果 11 基本機能 ロボット部品 選定したもの 遠隔操縦 アクチュエータ 02_Actuator/ - DifferentialMotorController - L-Wheel - R-Wheel キャスター 01_basic/ - Caster 障害物検出 超⾳波センサ 対応するものはなかった(⾃作する) 衝突検出 バンパーセンサ 03_Sensor/ - TouchSensor 荷物着脱検出 荷物着脱検出センサ 03_Sensor/ - TouchSensor 荷物運搬 荷物運搬⽤BOX 対応するものはなかった(⾃作する) Body 荷物運搬⽤BOX キャスター アクチュエータ バンパー 超⾳波 センサー 荷物着脱 検出センサ バンパー キャスター 超⾳波 センサー アクチュエータ

Slide 12

Slide 12 text

箱庭部品を組み⽴てる(ベース︓1/2) • Assets/Prefab/SampleRobotを複製して、BuggageTransporter という名前で新しいプレハブを作成する。 12

Slide 13

Slide 13 text

箱庭部品を組み⽴てる(ベース︓2/2) • MainBody以外の部品を、⼀旦、全部外す • ヒエラルキービューからたどります。 13

Slide 14

Slide 14 text

箱庭部品を組み⽴てる(タイヤ︓1/4) • 作動モータを取り付ける • Interface-D/Interface-DFの下に、DifferentialMotorControllerをD&D 14

Slide 15

Slide 15 text

箱庭部品を組み⽴てる(タイヤ︓2/4) • 左のタイヤをつける • DifferentialMotorController/Interface-Lの下にL-WheelをD&D 15

Slide 16

Slide 16 text

箱庭部品を組み⽴てる(タイヤ︓3/4) • 左のタイヤをつける • DifferentialMotorController/Interface-Rの下にR-WheelをD&D 16

Slide 17

Slide 17 text

箱庭部品を組み⽴てる(タイヤ︓4/4) • PDUデータ仕様に合わせて変更する • DifferentialMotorControllerのインスペクタービューを 表⽰して変更する • 今回は、共有メモリベースでの通信とするので、 • Io_MethodをSHM • Comm_MethodをDIRECT • としました。 17

Slide 18

Slide 18 text

箱庭部品を組み⽴てる(フロント︓1/1) • MainBodyの前⾯にバンパやセンサを設置するので、サブホルダをつける • Interface-F配下に、MainBodySubHolderを設置する 18

Slide 19

Slide 19 text

箱庭部品を組み⽴てる(バンパ︓1/4) • MainBodySubHolderにバンパ︓タッチセンサをつける • Interface配下に、TouchSensorを設置する • ただし、デフォルトではサイズが⼩さいのと位置もずれているので以下のように調整します。 19 変更前 変更後 ※デフォルトのタッチセンサは衝突検出はできますが、衝突してもすり抜けてしまいますので、 ※必要に応じて⼲渉オブジェクト(isTriggerがFalseのコライダー)を配置してください。

Slide 20

Slide 20 text

箱庭部品を組み⽴てる(バンパ︓2/4) • MainBodySubHolderにバンパ︓タッチセンサをつける • Interface配下に、TouchSensorを設置する • ただし、デフォルトではサイズが⼩さいのと位置もずれているので以下のように調整します。 20

Slide 21

Slide 21 text

箱庭部品を組み⽴てる(バンパ︓3/4) • バンパの⾊を⿊⾊にする(LightBlackマテリアルをD&D) 21

Slide 22

Slide 22 text

箱庭部品を組み⽴てる(バンパ︓4/4) • PDUデータ仕様に合わせて変更する • TouchSensorのインスペクタービューを表⽰して変更する • Topic_name 及び update_cycle を仕様に合わせる • また、今回は、共有メモリベースでの通信とするので、 • Io_MethodをSHM • Comm_MethodをDIRECT • としました。 22

Slide 23

Slide 23 text

箱庭部品を組み⽴てる(キャスター︓1/1) • MainBodyの後⽅にキャスターを設置するので、BodyBackをつける • Interface-D/Interface-DB配下に、 BodyBackを設置する • 若⼲、⽔平ではないので、Yの位置を調整しています。(参照︓Inspectorビュー) 23

Slide 24

Slide 24 text

荷物運搬BOXを⾃作する • 作り⽅︓ • Cube5個⽤意して、サイズ変更して、BOX上に配置する • 床⾯にタッチセンサを配置する 24

Slide 25

Slide 25 text

超⾳波センサを⾃作する(1/3) • Unityを利⽤した超⾳波センサの実装としては、 • Physics.Raycast • を利⽤します。 • 今回の場合は、4⽅向のセンシングになるので、 • センシング時に4⽅向の距離測定を⾏うことで実現します。 • ソースコード︓ LightSensor4way 25 障害物 障害物までの距離 測定ポイント Physics.Raycast() Unityのコライダーをアタッ チしたゲームオブジェクト 超⾳波センサ実装のイメージ︓

Slide 26

Slide 26 text

超⾳波センサを⾃作する(2/3) • 距離を測定するスクリプト解説︓ 26 前⽅⽅向 衝突検出した距離 検出範囲 現在位置 障害物検出した場合、その光線を緑⾊で表⽰する ( Unityのシーンビューの場合のみ) 障害物検出しなかった場合、その光線を⾚⾊で表⽰する ( Unityのシーンビューの場合のみ) 前⽅⽅向を取得 (呼び出し元で⽅向を変えています)

Slide 27

Slide 27 text

超⾳波センサを⾃作する(3/3) • 作成したスクリプトをアタッチ。⾒た⽬としては、LiDARっぽいシリンダーを利⽤。 27

Slide 28

Slide 28 text

テストドライバを作成する • ロボット名とPDUデータ名を確認する • 動作確認内容を検討する • 動作確認プログラムを作成する 28

Slide 29

Slide 29 text

ロボット名とPDUデータ名を確認する(1/3) • ロボット名︓BuggageTransporter 29 • 箱庭のPDUデータにアクセス・オブジェクトを取得するためには • ロボット名とPDU名が必要です。 • ロボット名は、ヒエラルキービューのRobotは以下の名前です。

Slide 30

Slide 30 text

ロボット名とPDUデータ名を確認する(2/3) 30 部品 通信データ型 通信データ名 アクチュエータ geometry_msgs/Twist cmd_vel 超⾳波センサ pico_msgs/LightSensor ultrasonic_sensor バンパーセンサ std_msgs/Bool bumper_sensor 荷物着脱検出センサ std_msgs/Bool baggage_sensor • PDUデータ名は、各部品の通信データ名です。 • スクリプトアタッチする際に、通信データ名を以下で設定しています。

Slide 31

Slide 31 text

ロボット名とPDUデータ名を確認する(3/3) • 箱庭のPDUデータにアクセス・オブジェクトを取得するための名前は、 • <ロボット名>_<通信データ名>Pdu • です。 ロボット名︓BuggageTransporter 31 部品 通信データ名 PDUデータ・アクセスオブジェクト名 アクチュエータ cmd_vel BuggageTransporter_cmd_velPdu 超⾳波センサ ultrasonic_sensor BuggageTransporter_ultrasonic_sensorPdu バンパーセンサ bumper_sensor BuggageTransporter_bumper_sensorPdu 荷物着脱検出センサ baggage_sensor BuggageTransporter_baggage_sensorPdu

Slide 32

Slide 32 text

動作確認内容を検討する 32 基本機能 ロボット部品 動作確認内容 遠隔操縦 アクチュエータ キーボード操作で移動できるか確認する キャスター 移動時にボディを⽀えられるか 障害物検出 超⾳波センサ 障害物を配置して、レーザ光線の⾊が変わ ることを確認する 緑︓検出 ⾚︓未検出 衝突検出 バンパーセンサ 衝突検出︓⾚(ゲームオブジェクトの⾊) ⾮検出時︓⻘(ゲームオブジェクトの⾊) 荷物着脱検出 荷物着脱検出センサ 荷物あり︓⾚(ゲームオブジェクトの⾊) 荷物なし︓⻘(ゲームオブジェクトの⾊) 荷物運搬 荷物運搬⽤BOX 荷物を落とすためのゲームオブジェクトを作成 し、ロボットの荷物運搬⽤BOXに荷物を落と す。 3 1 2 キーボード操作⽤ ゲームオブジェクト バンパーセンサ確認⽤ ゲームオブジェクト 荷物着脱検出センサ確認 ゲームオブジェクト 4 荷物を落とすための ゲームオブジェクト 動作確認するための機能要素

Slide 33

Slide 33 text

動作確認プログラムを作成する • テストドライバ概要 • キーボード操作⽤ゲームオブジェクト • バンパーセンサ確認⽤ゲームオブジェクト • 荷物着脱検出センサ確認ゲームオブジェクト • 荷物を落とすゲームオブジェクト 33

Slide 34

Slide 34 text

テストドライバ概要(1/3) • 考え⽅その1 • テスト対象ロボットのPDUデータをテストドライバがアクセスして、 • ロボットが期待した動きやデータを返すかをチェックする 34 テスト ドライバ テスト対象 ロボット PDUデータ (センサ) PDUデータ (アクチュエータ) テスト対象ロボットに ⼊⼒を与える (移動指⽰など) テスト対象ロボットの 出⼒を確認する (タッチセンサの値とか)

Slide 35

Slide 35 text

テストドライバ概要(2/3) • 考え⽅その2 • テストドライバの⼊出⼒確認には、ゲーム機能を利⽤する 35 テスト ドライバ PDUデータ (センサ) PDUデータ (アクチュエータ) 1 キーボード操作⽤ ゲームオブジェクト 2 バンパーセンサ確認⽤ ゲームオブジェクト OFF ON PDUデータの値に応 じてゲームオブジェク トの⾊を変更する

Slide 36

Slide 36 text

テストドライバ概要(3/3) • 考え⽅その3 • テストドライバは、箱庭のロボットと同じ位置付けとして作成する 36 Robot配下にテストドライバを配置する テストドライバに通常のロボットと 同じスクリプトをアタッチする

Slide 37

Slide 37 text

キーボード操作⽤ゲームオブジェクト(1/2) • キーボード操作で作動モーターを移動させるプログラムは箱庭にすであります。 • DifferentialMotorControllerTestDriver.cs • MotorTestDriver 37 仕様︓キー⼊⼒ ↑︓前進。キー押下し続けると加速します。 ↓︓後進。キー押下し続けると加速します。 →︓右旋回 ←︓左旋回 スペースキー︓停⽌

Slide 38

Slide 38 text

キーボード操作⽤ゲームオブジェクト(2/2) • テストドライバの配置 38

Slide 39

Slide 39 text

バンパーセンサ確認⽤ゲームオブジェクト(1/2) • タッチセンサの動作チェックプログラムは箱庭にすであります。 • TouchSensorTestDriver.cs • TouchSensorTestDriver 39

Slide 40

Slide 40 text

バンパーセンサ確認⽤ゲームオブジェクト(2/2) • テストドライバの配置 40

Slide 41

Slide 41 text

荷物着脱検出センサ確認ゲームオブジェクト • テストドライバの配置 41

Slide 42

Slide 42 text

荷物を落とすゲームオブジェクト(1/2) • 荷物を落とすプログラムは箱庭にすであります。 • ColliderTriggerControl.cs • Baggage 42 仕様︓キー⼊⼒ A︓荷物が落ちます。

Slide 43

Slide 43 text

荷物を落とすゲームオブジェクト(2/2) • テストオブジェクトの配置 43 テストオブジェクトは、 Workシーン直下に 配置します 理由︓ PDUデータアクセスしないため

Slide 44

Slide 44 text

動作確認する 44 • 前進して、バンパ接触、荷物を落として、荷物着脱センサ反応 • その後、超⾳波センサの光線を確認 https://www.youtube.com/watch?v=XXcHeae4AHE