YKpages

ロボット分野で勉強したことのまとめ

Unity ゲーム開発日記:プロジェクト作成と GitHub

はじめに

これまで二年以上Unityを使って色々してきましたが、 一つのゲームを完成させたことはありませんでした。

今回は思い切って、すぐ完成させられそうなシンプルなゲームを作成し、 Google Play Store などにリリースしてみようと思います。

作成するゲームは2Dのシューティングゲームです。

できる限りシンプルでオシャレなゲームにする予定です。

タイトルは「オシャレなロケット Oshare-Na-Rocket」

流れ

  • Unityプロジェクト作成、GitHubで管理
  • ゲームシステム作成
  • 素材作成(イラスト、BGM)
  • リリース

環境

  • Windows10
  • Unity 2018.2.14f1

参考

Unity公式チュートリアル

unity3d.com

こちらも

baba-s.hatenablog.com

プロジェクト作成

現在の最新バージョン Unity 2018.2.14f1 をインストール

Unity のバージョン管理は公式の「Unity Hub」を使うと便利です

インストールが終わったら新規プロジェクトを作成

GitHub で管理

Git を利用するとプロジェクトのバージョン管理が簡単にできます

今回は GitHub というwebサービスを利用します

GitHub の利用方法が分からない人は各自でググってください(私は良く分かっていません笑)

UnityのプロジェクトをGitHubにあげる場合はきちんと「.gitignore」を設定すると楽になります

GitHub で Repository を作成するときに .gitgnore を選択できるのでそこで「Unity」を選択するだけで済みます。

一応、方法は以下にまとめておきます

kato-robotics.hatenablog.com

以下が私のGitHubのページです

github.com

おわりに

この記事ではUnityのプロジェクトを作成してGitHubにあげました。

次はゲームのシステムを作っていきます。山場です。

Unity と ROS の通信 ( ROS# : ros-sharp )

はじめに

UnityアプリとROSの間でデータをやり取りしたい

ROS#というライブラリを使うと簡単に実現できるようです

公式の情報を見ればだいたい分かりますが、 一応メモを残しておきます

github.com

参考

qiita.com

バージョン1.3以降の場合

kuwamai.hatenablog.com

環境

Unity側

  • Windows10
  • Unity 2018.2.8f1
  • ROS# v1.0 (バージョン:v1.3 → v1.0)

ROS側

  • Ubuntu 16.04 LTS
  • ROS Kinetic

ROS#をインポート

GitHubページから最新版UnityPackageをダウンロードしてインポート

UnityのAsset Storeからもインポートできるようです

github.com

ros-sharpパッケージ内にサンプルシーンが入っているのでそれを見るとだいたい使い方が分かります

(Assets > RosSharp > Scenes)

オブジェクトのPoseを配信してみる

Unity側の準備

Hierarchyで空(Empty)のオブジェクトを作成(名前:ROSConnector)

Create>Create Enpty で作成

そのオブジェクトに Assets > RosSharp > Script > RosCommunication > RosConnector.cs をアタッチ

(もしくはRosSharp > Prefabs > RosConnectorから作成)

InspectorでROS側PCのURLを入力

f:id:kato_robotics:20181030160707p:plain

次にCubeを作成します。ここではこのCubeのPoseを配信してみます。

HierarchyでCreate > 3D Object > Cube で作成

作成したCubeに RosSharp > Scripts > MessageHandling > PoseProvider.cs をアタッチ

PoseProviderのframeIdは、特に何もなければUnityと入力

f:id:kato_robotics:20181030162029p:plain

最後にROSConnectorに RosSharp > Scripts > RosCommunication > UnityTimePublisher.cs をアタッチ

Topic/poseと入力

Message ProviderCubeを選択

f:id:kato_robotics:20181030162535p:plain

ROS側の準備

すでにROSがインストールされているUbuntuを用意

以下のコマンドでrosbridge-serverをインストール

sudo apt-get install ros-kinetic-rosbridge-server

rosbridge_suite - ROS Wiki

rosbridge-serverはROSとROSではないソフトウェアで簡単に通信を行えるようにするものです

以下のコマンドで実行

roslaunch rosbridge_server rosbridge_websocket.launch

やってみる

準備が整ったらUnityのプレイボタンを押します

UnityとROSの接続が成功するとubuntu側の端末にClient connected. 1 clients total.と表示されます

f:id:kato_robotics:20181030163537p:plain

接続が成功したら以下のコマンドを打ってPoseが配信されているかを確認します

rostopic list

f:id:kato_robotics:20181030163905p:plain

次に以下のコマンドを打ってメッセージの内容を確認します

rostopic echo /pose

/poseトピックのメッセージが確認できると思います

ここでUnity側のCubeのPositionやRotationを変更するとメッセージの内容も変わることが確認できます

f:id:kato_robotics:20181030164347p:plain

座標系について

ちなみにですが、UnityとROSでは座標系が異なっています

そのことについてまとめたので確認してみてください

kato-robotics.hatenablog.com

通信が上手くいかない場合

考えられる点

  • ROSConnectorで入力するROS側PCのURLが間違っている
  • Unity側PCとROS側PCが同じネットワークにいない
  • rosbridge-serverを起動していない
  • Unity側の準備が足りていない

など

配信されているPoseの可視化について

ROSには可視化ツールとしてRvizというソフトウェアがあります

このrvizで今回Unityから配信したPoseデータを可視化してみるとおもしろいかと思います

以下のコマンドで実行できます

rosrun rviz rviz

使い方は調べれば出てきます

rvizで可視化する場合、Unity上でCubeにアタッチしたPoseProviderのFrameIdを設定する必要があります

気になること

ROS#がiOS端末上では上手く動かない問題

(2019/04/17追記)

以下情報

github.com

まとめ

ROS#を利用してUnityとROSでデータをやり取り

おわりに

今回はUnityからROSへデータを送りましたが、 もちろんROSからUnityへデータを送ることもできます

またROS#の強みは、簡単であることと、URDFも扱えるということみたいです

ROS#の存在はありがたい

おまけ

kato-robotics.hatenablog.com

kato-robotics.hatenablog.com

ROS と Unity における座標系の違いについて

はじめに

ROS と Unity でロボットの座標データをやり取りするときに、 座標系の違いを調べる必要があったのでまとめておきます

座標系について

  • ROS : 右手系
  • Unity : 左手系

f:id:kato_robotics:20181024194534j:plain
Unity と ROS の座標系について

変換方法

Unity -> ROS

Position: Unity(x,y,z) -> ROS(z,-x,y)
Quaternion: Unity(x,y,z,w) -> ROS(z,-x,y,-w)

ROS -> Unity

Position: ROS(x,y,z) -> Unity(-y,z,x)
Quaternion: ROS(x,y,z,w) -> Unity(-y,z,x,-w)

おわりに

メモしておかないと忘れます

Unity, ROS 間での JSON パースメモ (nav_msgs/Odometry.msg)

はじめに

/opt/ros/kinetic/share/nav_msgs/msg/Odometry.msg

この型のデータを ROS から Unity アプリへ送信したときのパースの方法のメモ

Odometryメッセージの型の中身

階層構造が重要

  • Header header
    • uint32 seq
    • time stamp
    • string frame_id
  • string child_frame_id
  • geometry_msgs/PoseWithCovariance pose
    • Pose pose
      • Point position
        • float64 x
        • float64 y
        • float64 z
      • Quaternion orientation
        • float64 x
        • float64 y
        • float64 z
        • float64 w
    • float64[36] covariance
  • geometry_msgs/TwistWithCovariance twist
    • Twist twist
      • Vector3 linear
      • Vector3 angular
    • float64[36] covariance

気をつけること

poseとtwistの変数名が重複しているので区別する

コード例

[System.Serializable]
    public class Odom
    {
        public string topic; //トピック名
        public Msg msg; // メッセージ内容
        public string op; // Operation : publish, subscribe など
    }

    [System.Serializable]
    public class Msg
    {
        public Header header;
        public string child_frame_id;
        public Pose pose;
        public Twist twist;
    }

    [System.Serializable]
    public class Header
    {
        public Stamp stamp;
        public string frame_id;
        public string seq;
    }

    [System.Serializable]
    public class Stamp
    {
        public int secs;
        public int nsecs;
    }

    [System.Serializable]
    public class Pose
    {
        public Pose2 pose; // 変数名がJSONのキーと合っていれば良い
        float[] covariance;
    }

    [System.Serializable]
    public class Pose2
    {
        public Vector3 position;
        public Quaternion orientation;
    }

    [System.Serializable]
    public class Twist
    {
        public Twist2 twist; // 変数名がJSONのキーと合っていれば良い
        float[] covariance;
    }

    [System.Serializable]
    public class Twist2
    {
        public Vector3 linear;
        public Vector3 angular;
    }

受け取るとき

// message = 受け取ったJSONデータ
Odom odomMsg = JsonUtility.FromJson<Odom>(message);

websocket-sharp を使った通信例

github.com

おわりに

ROS から Unity アプリへJSONデータを送ったときのパースの一例をまとめた

Raspberry Pi 3B, Ubuntu 16.04 LTS で Docker を使うメモ

はじめに

Raspberry Pi3 Model B の Ubuntu 16.04 上で Docker を使ってみた

Docker は docker-ce を使う。この CE が無料版らしい。

環境

  • Raspberry Pi3 Model B
  • Ubuntu 16.04 LTS
  • Docker 18.06.1-ce

インストール方法

公式ページを参考にしてインストール

docs.docker.com

流れの通りにやればインストールできる

一つ注意点としてCPUによってコマンドが異なるところがある

archコマンドでCPUが分かる)

ARMなので「armhf」用のコマンドをうつ

インストールが終わったら以下のコマンドで確認

sudo docker run hello-world

以下のメッセージが表示されたらOK

Hello from Docker!

nginxでサーバを立ち上げてみる

以下の記事を参考

qiita.com

sudo docker run -d -p 8080:80 --name webserver nginx

このコマンドでサーバが立ち上がる

初回ではダウンロードがあるので少し時間がかかる

http://[raspberry Pi の ip adress]:8080にアクセスできる

以下のコマンドでコンテナの一覧が表示される

ここではnginxのコンテナが表示されるはず

sudo docker ps

以下のコマンドでコンテナを終了させる

sudo docker kill webserver

以下のコマンドでコンテナを削除

sudo docker rm webserver

まとめ

Raspberry Pi3 Model B の Ubuntu 16.04 LTS 上で Docker を使った

インストールをして、nginxでサーバを立ててみた

おわりに

噂に聞いてた通りDocker便利

ぜひ使っていきたい

VRChat ワールドに動きを付けるアニメーション

はじめに

VRChatではオブジェクトに動きをつけるためにアニメーションを利用します。(C#スクリプトは使えないはず)

今回はパパっとアニメーションを使ってみようと思います。

環境

  • Unity5.6.3p1
  • Windows10
  • VRChat SDK 2018.06.21

ワールドの準備

ワールド作成の準備を行った状態にします。(画像は最低限の準備をした状態)

f:id:kato_robotics:20180818201920p:plain

ワールド作成方法については以下の記事を参照。

kato-robotics.hatenablog.com

Cubeを作成

今回は動かす対象としてCubeを用います。

Hierarchyで、Create -> 3D Object -> Cube を選択。

CubeのTransformでPositionを(X, Y, Z) -> (0, 2, 0)にします。

f:id:kato_robotics:20180818202656p:plain

Cubeのアニメーションを作成

Cubeを選択した状態でWindow -> Animationを選択します。

f:id:kato_robotics:20180818203139p:plainf:id:kato_robotics:20180818205854p:plain

するとAnimationのウインドウが出てくるので、Createボタンを押します。

f:id:kato_robotics:20180818203220p:plain

アニメーションの名前は適当に決めます。(例えば"CubeAnimation")

次にAdd Propertyボタンを押し、Transform -> Rotationを選択。("+"ボタンを押す)

f:id:kato_robotics:20180818203744p:plain

1:00のところをクリックして赤い線が移動したことを確認してから、Rotation.yの値を「360」にします。

f:id:kato_robotics:20180818204748p:plain

アニメーションの再生ボタンを押すと、Cubeが0秒から1秒の間でY軸周りに360度回転しているはずです。

以上でアニメーションを作成できました。

VRChatで確認

作成したワールドをアップロードして、VRChat上で確認してみてください。

ずっとCubeが回転しているはずです。

f:id:kato_robotics:20180818210443p:plain

何かをきっかけにアニメーションを起動

今の状態だとCubeはずっと回転しています。

何かをきっかけにアニメーションを起動したい場合は、 「VRC_Trigger」を利用するか、 Assets -> VRCSDK -> Examples -> Sample Assets -> Animation -> CustomOverrideEmpty を利用するといいと思います。

おわりに

VRChatでのアニメーションについて書きました。

と言ってもVRChatだからと言って何か特別な設定が必要なわけではないので、 「Unity アニメーション」と検索すれば情報はたくさん出てくると思います。

もっと詳しく情報がたくさんあると思うので調べてみてください。

VRChat 10分でできるワールド作成

はじめに

VRChatでパパっとワールドを作ります。

すぐできます。

目次

環境

  • Unity5.6.3p1
  • Windows10
  • VRChatSDK 2018.06.21

Unity 2017.4.15f1 でも大丈夫

本記事では Unity5.6.3p1 を使用しています。

VRChat は Unity 2017.4.15f1 に対応したようですが、 ワールドをアップロードする手順に変更はないようです。

rush-masafy.hatenablog.com

ワールドをアップロードするまでの流れ

Unity のインストール

まず、Unity をインストールします。

バージョンは「Unity 2017.4.15f1」です。

バージョンが正しいことを確認してインストールしてください。

VRChat SDKをインポート

VRChat SDKをダウンロードして、 Unity にインポートします。

「VRChat SDK」とは VRChat のワールド作成や アバターのアップロードを行うために必要となるものです。

VRChat SDK は、VRChat 公式サイトで入手できます。

VRChat の公式サイトにログインして(アカウントを持っていない人は新規登録する)、 「Download」で「VRchat SDK」を入手します。

vrchat.net

新規のUnityプロジェクトを作成し、 VRChat SDKをインポートします。

Assets -> Import Package -> Custom Package からVRChat SDKを選択。

f:id:kato_robotics:20180815233435p:plain

VRCWorldをHierarchyへ

Assets -> VRCSDK -> Prefabs -> World -> VRCWorld をHierarchyへドラック&ドロップ

f:id:kato_robotics:20180815234744p:plain

最低限の地面を作成

Hierarchyで、 Create -> 3D Object -> Plane を選択(Plane以外のものでもOK)。

f:id:kato_robotics:20180815235215p:plain

ワールドをアップロード

VRChat SDK -> Settings でVRChatにログインします(一度ログインしたらもう大丈夫)。

f:id:kato_robotics:20180815235816p:plain

VRChat SDK -> Show Build Control Panel からアップロードを行います。

f:id:kato_robotics:20180816000216p:plain

Publish の "New Build" ボタンを押します。

f:id:kato_robotics:20180816000234p:plain

World Nameを入力して、チェックボックスにチェックを入れ、"Upload" ボタンを押すとアップロード完了です。

もし、画面のサイズが小さくてUploadボタンが見えなかったりしたら、 画面のサイズを大きくしたり、画像で示す"Maximize On Play"をONにしてから、もう一度やり直してみてください。

f:id:kato_robotics:20180816001128p:plain

以上で完了です。

VRChatで確認

これで無事にアップロードできているはずです。

VRChatにいって自分が作ったワールドを確認してみてください。

自分が作成したワールドは、ワールド選択画面の一番下"Mine"のところにあります。

f:id:kato_robotics:20180816002724p:plain

今回作成したワールドに行ってみました。何もないです。

f:id:kato_robotics:20180816002800p:plain

おわりに

簡単にワールドが作成できました。

VRChatすごい。楽しい。

このあとは、好きな3Dモデルを置いたり、Particle Systemやアニメーション、シェーダーなどを利用してみたり、 色々やっていきましょう!

参考

以下の記事を参考にさせていただきました。

qiita.com