箱庭とUnityで組み立てる
オレオレロボットのはじめかた
森崇(永和システムマネジメント)

1. 箱庭とは何か
2. Unityとは何か

3. Unity上のロボットの構造
4. 箱庭機能との接合部分

5. 箱庭があると何が嬉しくなるのか
6. 箱庭ロボットの作り方

箱庭とはなにか• 箱の中に，様々なモノをみんなの好みで配置して，いろいろ試せる！

・仮想環境上(箱庭)でIoT/ロボット・システムを開発する• ⇒ 各分野のソフトウェアを持ち寄って，机上で全体結合＆実証実験！
ロボット制御系
エンジニア

組込み系
エンジニア

ネットワーク系
エンジニア

ロボットAI系
エンジニア

Web系
エンジニア

3

箱庭チュートリアル会の背景
2019ー2021
公開中

2022ー2024
箱庭チュートリアル
組込み系
エンジニア
ロボット制御系
エンジニア
ロボットAI系
エンジニア

箱庭プロトタイプ
モデル開発

箱庭ユーザを広める活動

結合環境構築(箱庭ベース環境)

箱庭チュートリアル開発&&広報活動2025
組込み系エンジニア---------------------------ECU/AUTOSAR開発入門シミュレーション環境
ロボット制御系エンジニア---------------------------ロボット制御モデリング/プログラ
ミング入門シミュレーション環境
ロボットAI系エンジニア---------------------------ロボット制御学習サイクル自動化
入門シミュレーション環境

4現状の箱庭の全体像（Windows版）

5

Unityとは何か

6• ユニティ・テクノロジーズ社が開発したゲーム開発プラットフォーム• 物理演算エンジンが搭載されています• 質量・速度・摩擦・風といった，古典力学的な法則をシミュレーションするコンピュータのソフトウェア• ※参照元：ウィキペディア• Unityでできること• ロボット作れます• 物理的な法則に従ってモノを動かすことができます• ロボットの周辺環境も作れますボールを置いて，物理シミュレーションを実行するまで
7

ロボットも動かすことができる

8

Unity上のロボットの構造解説• Unityの操作• Unityエディタの画面構成• 基本的な操作方法• Unityで物理シミュレーションするための基礎知識• ロボットを動かすためのUnityの構造

9Unityエディタの画面構成（１／２）

10Sceneビュー
Hierarchy
ビュー

Projectビュー

Inspectorビュー

Unityエディタの画面構成（２／２）
Gameビュー
Main Cameraを通して移した世界

Consoleビュー

ここにログが出てきます11基本的な操作方法• 視点の操作• 視点移動
• 視点回転• ズーム操作• ゲーム・オブジェクトの操作• ゲーム・オブジェクト移動• ゲーム・オブジェクト回転• ゲーム・オブジェクト拡大・縮小

12

視点移動
マウス・ホイール押しながら右左

13

マウス・ホイール押しながら上下視点回転
右クリックしながら右左

14

右クリック押しながら上下ズーム操作
ズームイン

15

ズームアウトゲーム・オブジェクト移動
左クリックしながら移動

16

ゲーム・オブジェクト回転左クリックしながら回転17ゲーム・オブジェクト拡大・縮小
左クリックしながら拡大・縮小

18

19

InspectorビューでもできますUnityで物理シミュレーションするための基礎知識• ゲームオブジェクト• プリミティブな素材• 衝突判定用のオブジェクト• 物理挙動• RigidBody• Jointコンポーネント• ArticulationBody• 独自処理(Unityスクリプト)の追加方法• Unityイベント関数の実行順序

ゲームオブジェクト

21• Unity上のすべてのキャラやロボットはゲームオブジェクトで出来ています• 以下のTransform情報を持ちます• 名前• 位置(x, y, z)• 回転(x, y, z)• スケール(x, y, z)

無色、透明ですプリミティブな素材

22

1. Cube2. Sphere

Cylinder3. Capsule

4. Cylinder
5. Quad6. Plane

Cube
SpherePlane

CapsuleQuad

衝突判定用のオブジェクト• コライダの種類• Boxコライダ• Sphereコライダ• Capsuleコライダ• Meshコライダ

23プリミティブな素材のコライダを見てみる

全オブジェクトのMesh Rendererをオン

全オブジェクトのMesh Rendererをオフ

コライダによる衝突の様子
コライダなしの場合：

25

コライダありの場合：

物理挙動

26

• RigidBody• Rigidbody (リジッドボディ) はオブジェクトに物理挙動を可能にするためのメインコンポーネントです。リジッドボディを加えた瞬間から、オブジェクトは重力の影響を受けるようになります。さらに、1つ以上の Collider (コライダー) コンポーネントを加わえれば、オブジェクトは衝突の影響によって動くようになります。

Jointコンポーネント

27• Joint (ジョイント) コンポーネントは、Rigidbody (リジッドボディ) を他のRigidbody または空間の固定点に接続します。ジョイントはリジッドボディを動かす力を加え、ジョイントの制限はその動きを制限します。ジョイントはリジッドボディに以下の自由度を与えます。
RigidBody

Joint

Jointコンポーネントの種類

RigidBody

箱庭での利用有無

Character Joint

×

Configurable Joint〇

Fixed Joint〇

Hinge Joint〇

Spring Joint×Fixed Joint

28• SphereにFixed Jointコンポーネントをアタッチし、Capsuleと接続するSphere

Fixed Jointを付ける
CapsuleFixed Joint

29

Hinge Joint30• リジッドボディを、他のリジッドボディや空間上の点に、共有された原点で取り付け、その原点の特定の軸を中心に回転させることができます。ドアや指の関節を模倣するのに便利です。
回転位置（Anchor）

ジョイントする
RigidBody
回転対象
RigidBody

回転方向（Axis）

Hinge Jointの例

回転位置（Anchor）

31

回転方向（Axis）

ジョイントする
RigidBody
回転対象
RigidBody

回転速度/力を決める
パラメータ

Hinge Joint

32

物理挙動

33

• ArticulationBody• Articulation Body (連結ボディ) を使うことによって、ゲームオブジェクトを使ったロボットアームやキネマティックチェーンのような 物理的連結 を構築することができます。これらは、産業用アプリケーションのシミュレーションのコンテキストでリアルな物理動作を得るのに役立ちます。
• 連結ボディは、RigidBody や 通常のジョイント といった従来の構成で定義されるプロパティを、1 つのコンポーネントで定義することができます。ただし、これらのプロパティは、階層内のゲームオブジェクトの位置に依存します。

プロジェクト設定を変更する必要あります34

論よりRUN!

35• RigidBodyをやめて、ArticulationBodyに変更する！

Articulation Bodyをアタッチするだけ！！

ArticulationBody

36

Fixed37

Hinge Jointと同じ設定したい場合
CubeをCylinder配下に移動

CylinderのArticulationBodyの接合部分および回
CylinderのArticulationBodyの接合部
転方向を編集分および回転方向を編集

38

Joint Typeを Revolute にして、回転設定する

Revolute39

独自処理(Unityスクリプト)の追加方法（１／２）
40• Unityのゲームオブジェクトには、Unityスクリプト（C#）を追加できます

シミュレーション開始
時に呼び出されます

フレーム毎に呼び出されます独自処理(Unityスクリプト)の追加方法（２／２）
41

Unityイベント関数の実行順序• https://docs.unity3d.com/ja/2023.2/Manual/ExecutionOrder.html

Start()

FixedUpdate()

Update()Initialization

Physics

Rendering

Input events

End of frame

Game logicPausing

Decommissioning

42

Unityイベント関数の実行順序

箱庭ロボットのセンサ/アクチュエータ
実装はFixedUpdate()内で実行されます43Unityイベント関数の実行順序

44

Unityイベント関数の実行順序

45

ロボットを動かすためのUnityの構造

46• Unity上でロボットを動かすには以下の３レベルがあります
1. UnityのRigidBodyやArticulationBodyをアタッチしてロボットを動かす
2. UnityのC#スクリプトでロボットを制御する
3. Unity外のプログラム（Python/C++言語など）で、Unity上のロボットを制御する• 外部プログラムの実行環境 ：OS上のプロセス、マイコンシミュレータ上のRTOSタスク等• 外部プログラムとの通信方式：ROS/ROS2、MQTT、UDP/TCP、、、レベル１

RigidBody等

レベル２

RigidBody
等

UnityのC#スクリプト

レベル３

RigidBody
等

UnityのC#スクリプト
通信スタックプログラムの実行環境

通信方式

通信スタック箱庭機能との接合部分

47• 箱庭APIを通してUnity上のロボット／制御プログラムを接続する
Unity上のロボット

ロボット制御プログラム

プログラムの実行環境
UnityのC#スクリプト

RigidBody等

TOPPERS/
箱庭

箱庭API(C#)

Unity向け箱庭
シミュレーション実行
タイミング制御箱庭
通信スタック

通信方式(UDP/MQTT/ROS2…)

箱庭API(様々なプログラミング言語)

箱庭
通信スタックC++版
箱庭コア機能箱庭API概要

48

箱庭イベントアクチュエータ指示通り動いて！

センサ情報を書き込みして！

ロボット・データ

データ型は、ROS2のメッセージと同じI/O系API

箱庭API(C#)• I/O系• ロボット・センシングデータの書き込み• ロボット・アクチュエータ指示データの読み込み• データ型• ROS2のメッセージのインタフェース定義言語(IDL)で定義します• 現状、TB3ベースのデータ型は標準サポートしています• 必要に応じて、以下で追加することが可能です。
• https://github.com/toppers/hakoniwa-ros2pdu• 箱庭イベント• Unityシミュレーション実行向け• Unityエディタ向け

49

箱庭があると何が嬉しくなるのか

50• Unity• 通信スタック作らなくても良い• 通信方式も選べる• ROS2/MQTT/gRPC/UDP/MMAP• 箱庭ロボット・アセットを選べる• EV3、Spike、TurtleBot3• 箱庭ロボット組み立てキットがある• アクチュエータ

• 差動モーター、サーボモーター、LEDなど• センサ• カメラセンサ、２Dレーザスキャナ、タッチセンサ、IMU• ロボット制御プログラム• 様々なプログラムの言語を選べる• C/C++、Python、mRuby• マイコンシミュレータも使える• Athrill

Athrill• 専用デバイスも自作可能• オープンソース/ライセンスフリー• TOPPERSライセンス

Athrill箱庭ロボットの作り方• 箱庭ロボットの組み立て方• 箱庭ロボット部品の構成• 箱庭ロボット部品の構造

51

52

ベースのアイディア• URL：• https://qiita.com/kanetugu2018/items/29ee98bc434191eee8f1

TurtleBot3風のロボットを作ってみよう！

53

54

作ったロボットを動かしてみよう！

55

ロボット制御用のPythonプログラム

箱庭ロボット部品の構成

56

基本部品

マテリアル

ArticulationBody

UnityのC#スクリプト

アクチュエータ
ArticulationBody

ロボットルート
ロボット毎に１個割り当てする(ロボット全体制御パーツ)
センサ

UnityのC#スクリプト

UnityのC#スクリプト

基本部品例(MainBody)• ArticulationBodyで構成されている

57

アクチュエータ例(DiffrentialMotorController)• ArticulationBodyとUnityスクリプトで構成されている

58

アクチュエータ例(Camera)• CameraとUnityスクリプトで構成されている

59

60

箱庭ロボット部品の構造• 箱庭の全体的な処理の流れ• 組み立てた箱庭ロボットの内部処理• 箱庭ロボットの部品構造

箱庭の全体的な処理の流れ
Unity処理

コールバック61

箱庭共通処理（WorldController）

箱庭内のロボット処理(コールバック関数)

Start()

Initialize()

FixedUpdate()
アクチュエータ用
データ受信

アクチュエータ用
データ(PDU)

DoActuation()
ロボット処理実行

IInsideAssetController
CopySensing
DataToPdu()

センサ
データ送信

センサデータ(PDU)

組み立てた箱庭ロボットの内部処理

62• RobotPartsRootがアクチュエータ/センサ部品群を統括し、処理実行する• 各種アクチュエータ/センサはインタフェース化されているため、RobotPartsRootは再利用可能• 箱庭部品として、アクチュエータ/センサのプロトタイプ実装クラスを用意している
IRobotPartsController(インタフェース)【役割】
アクチュエータの制御コントローラ用のインタフェース【インタフェース仕様】
DoControl()関数実装では、PDUデータを取得し、アクチュエータ指示値を関係するアクチュエータに伝達する

IRobotPartsMotor(インタフェース)【役割】
モーター制御用のインタフェース【インタフェース仕様】
SetTargetVeolcity()関数実装では、指示値に従って、モーターの物理挙動を実現する

IRobotPartsMotor

IRobotPartsController
SetTargetVelocity()
IInsideAssetController
インタフェース実装

DoControl()

RobotPartsRoot【役割】
すべてのセンサ/アクチュエータの処理を実行する親玉

DoActuation()【補足】
ロボット組み立て時には、本Unityスクリプトを必ずアタッチしないといけない

CopySensing
DataToPdu()

IRobotPartsPincherFinger

IRobotPartsSensor
UpdateSensor
Values()IRobotPartsSensor(インタフェース)【役割】
センサ用のインタフェース【インタフェース仕様】
UpdateSensorValues()関数実装では、センシング処理を実行し、取得したデータをPDUに保存する

UpdateGrip()

IRobotPartsActuator
IRobotPartsActuator(インタフェース)【役割】
アクチュエータ用の共通インタフェース

箱庭ロボット部品の構成（もう一回）
基本部品

63
マテリアル

ArticulationBody

UnityのC#スクリプト

アクチュエータ
ArticulationBody

ロボットルート
ロボット毎に１個割り当てする(ロボット全体制御パーツ)
センサ

UnityのC#スクリプト

UnityのC#スクリプトイベント関数インタフェース視点での全体像
IRobotPartsController

IInsideAssetController

IRobotParts

RobotParts
Root

IRobotPartsSensor

Unity向け箱庭
シミュレーション実行
タイミング制御64

IRobotPartsTouchSensor

IRobotPartsMotorSensor

IRobotPartsActuator

IRobotPartsMotor

IRobotPartsPincherFinger[凡例]<<Unity>>
FixedUpdate()

インタフェース実装

インタフェース

インタフェース継承
処理呼び出しインスタンスインスタンス例

65

ロボットルート<<C#スクリプト>>
RobotPartsRoot

IRobotPartsSensor

レーザスキャナ

カメラセンサ<<C#スクリプト>>
Laserscanner<<C#スクリプト>>
CameraSensor

IRobotPartsController<<C#スクリプト>>
DifferentialMotorController

左モーター

右モーター

<<C#スクリプト>>
WheelMotor<<C#スクリプト>>
WheelMotor

IRobotPartsAcuatorRobotPartsRoot66

IRobotPartsController：
DifferentialMotorController

67IRobotPartsActuator：
WheelMotor

68

IRobotPartsSensor：
Laserscanner69

IRobotPartsSensor：
CameraSensor

70