YKpages

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

Vuforia7 + Unity デバイストラッキング

はじめに

UnityにVuforiaが統合されてから、Vuforiaがすごく使いやすくなったのでありがたいです。

今回はVuforiaでデバイスラッキングをするための設定方法を書いていきます。

環境

  • Unity : 2018.1.6.f1
  • Vuforia : 7

バイスラッキングとは何か

VuforiaのデバイスラッキングをONにすると、 デバイスのセンサを使って、デバイス本体がどのくらい移動回転をしたか計算で求めてくれます。

アプリ起動時のデバイスの位置姿勢がワールド座標系の原点を決定します。

その原点からデバイスがどのくらい移動回転したかが自動で分かります。

バイスラッキングの設定

まず、Vuforiaをインポート。

そして、ARCameraを作成。

Projectビューの Resources > VuforiaConfiguration

Device Tracker の Track Device Pose にチェック

さらに Tracking mode は 「ROTATIONAL」「POSITIONAL」を選択

f:id:kato_robotics:20180721134304p:plain

ちなみに、ARCamera の Vuforia Behaviour にある World Center Mode が「Device Tracking」になります。

f:id:kato_robotics:20180721134318p:plain

openFrameworks を Ubuntu16.04 にインストール(コンパイル時のエラーについて)

はじめに

openFrameworksを使ってみようかなと思ってインストールしてみました。

色々あって無駄に手間がかかってしまったので、 その時のメモを残しておきます。

目的

Ubuntu16.04にopenFrameworksをインストール

環境

  • Ubuntu16.04(仮想環境:VirtualBox)
  • openFrameworks0.10.0

参考

参考にした記事の内容とはバージョンが違います。

openFrameworks のインストールから新規プロジェクトの作成まで | ざきのメモ

インストール方法

wgetを使ってインストールしたかったけどエラーが出たのでwebサイトからダウンロード

https://openframeworks.cc/download/

展開したディレクトリはホーム直下におく

あとはそのディレクトリ内で作業

/scripts/linux/ubuntu で以下のコマンドを実行

sudo ./install_dependencies.sh
sudo ./install_codecs.sh

次にこのコマンドを実行して二つインストール(実行する場所はどこでもいい)

sudo apt install -y qtcreator eclipse

/scripts/linux/で以下のコマンドを実行してコンパイル

./compileOF.sh -j3
./compilePG.sh

以上でインストールは終了

コンパイル時のエラー対応

以下のコマンドを実行したときにパッケージが足りないことでエラーがでました。

./compileOF.sh -j3

パッケージが見つからないというエラーを出されたときの、追加するパッケージを列挙していきます。

もしかすると私がつづりを間違えているかもしれないので確認してください。

一括でインストールするコマンド

sudo apt install gstreamer0.10-plugin-base-apps libsndfile1-dev libopenal-dev libpulse-dev libglew-dev liburiparser-dev libglfw3-dev librtaudio-dev libpugixml-dev

一つずつインストール

エラー:gstreamer0.10~.pcが見つからない

sudo apt install gstreamer0.10-plugin-base-apps

エラー:sndfile.pcが見つからない

sudo apt install libsndfile1-dev

エラー:openalが見つからない

sudo apt install libopenal-dev

エラー:libpulse-simpleが見つからない

sudo apt install libpulse-dev

エラー:glewが見つからない

sudo apt install libglew-dev

エラー:uriparser/Uri.hが見つからない

sudo apt install liburiparser-dev

エラー:GLFW/flfw3.hが見つからない

sudo apt install libglfw3-dev

エラー:RtAudio.hが見つからない

sudo apt install librtaudio-dev

これで警告は出てきますが、コンパイルは通りました。

さらに以下のコマンドでもエラーが出たので追加するパッケージを書いておきます。

./compilePG.sh

エラー内容を読むとpugiクラスでエラーが出ているのでそのパッケージをインストール

sudo apt install libpugixml-dev

プロジェクトの作成と実行

/projectGenerator-linux64/で以下のコマンドを実行

./projectGenerator

GUI上でウィンドウが出てきます

そこで好きなプロジェクト名を決めて、Generateボタンを押すと作成できます

そして、/apps/myApps/に自分が作成したプロジェクトが追加されています

自分のプロジェクト内の/src/にcppファイルやhファイルがあります

おわりに

インストールするだけで思ったよりも時間を使ってしまったけど、 無事インストールできてよかったです

Unityで録音アプリを作成

はじめに

Unityで録音アプリを作成してみました。

今回は録音して再生する機能を持ったアプリです。

目的

Unityで録音アプリを作成

環境

  • Unity : 2018.1.6f1
  • OS : Windows10

ソースコード

MITライセンス

UIのボタンを3つ作成して関数を関連付けしてください。

(StartButton, EndButton, PlayButton)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyRecording : MonoBehaviour
{
    AudioClip myclip;
    AudioSource audioSource;
    string micName = "null"; //マイクデバイスの名前
    const int samplingFrequency = 44100; //サンプリング周波数
    const int maxTime_s = 300; //最大録音時間[s]

    void Start()
    {
        //マイクデバイスを探す
        foreach (string device in Microphone.devices)
        {
            Debug.Log("Name: " + device);
            micName = device;
        }
    }

    public void StartButton()
    {
        Debug.Log("recording start");
        // deviceName: "null" -> デフォルトのマイクを指定
        myclip = Microphone.Start(deviceName: micName, loop: false, lengthSec: maxTime_s, frequency: samplingFrequency);
    }

    public void EndButton()
    {
        if (Microphone.IsRecording(deviceName: micName) == true)
        {
            Debug.Log("recording stoped");
            Microphone.End(deviceName: micName);
        }
        else
        {
            Debug.Log("not recording");
        }
    }

    public void PlayButton()
    {
        Debug.Log("play");
        audioSource = gameObject.GetComponent<AudioSource>();
        audioSource.clip = myclip;
        audioSource.Play();
    }
}

コード解説

ソースコードを簡単に解説します。

まず、使用するマイクデバイスを探します。

ここでmicNameにnullを入れると、 その端末でデフォルトのマイクを使用します。

foreach (string device in Microphone.devices)
{
    Debug.Log("Name: " + device);
    micName = device;
}

Microphone.Startで録音を開始します。

引数は、マイクデバイスの名前、ループするかどうか、録音時間[s]、サンプリング周波数です。

Unity公式のリファレンスを読むと分かりやすいです。

録音データはAudioClip変数に保存されます。

myclip = Microphone.Start(deviceName: micName, loop: false, lengthSec: maxTime_s, frequency: samplingFrequency);

Microphone.Endで録音を停止します。

また、ループをfalseにしていると、録音時間を過ぎれば録音は終了します。

Microphone.End(deviceName: micName);

録音したデータを再生します。

audioSource.Play();

おわりに

Unityで録音機能を持ったアプリを作成しました。

あとは、録音データをセーブしたり、 音声ファイルとして書き出せたりすると、便利になりそうです。

UnityでARKit1.5

はじめに

ARKit1.5から画像認識の機能が追加されたらしい。

ARライブラリでマーカーの認識ができるものを探していたので使ってみた。

使ってみた感想として、自分が期待していた程の精度ではなかったので残念。

YoutubeでARKit2.0のデモをみたところ良い感じだったので期待。

www.youtube.com

導入方法

以下、bitbucketのUnity公式アカウント

bitbucket.org

ここからUnity-ARKit-Pluginをダウンロード

このプロジェクトを開いて、中のARKit1.5からサンプルを開けば使える。

参考

以下を参考

UnityやXcodeのバージョンも以下を参考に

blogs.unity3d.com

Octaveの使い方(Ubuntu16.04)

はじめに

最近、数値計算用の言語Octaveを使ったので、使い方をまとめておく。

OctaveMatlabと互換性がある。

環境

Ubuntu16.04

導入

以下のコマンドを実行

sudo apt install octave

Octaveはパッケージの追加を行える。

(例)controlというパッケージを追加

sudo apt install octave-control

また、パッケージはロードする必要がある。

以下のコマンドはOctaveコマンドライン上か、 mファイルに記述する。

pkg load control

Octaveの起動

ターミナルで以下のコマンドを実行

octave

mファイルを記述

vimなどのエディタを用いてfilename.mというファイルに記述

mファイルの実行

octaveを起動している状態で以下のコマンドを実行

octave filename.m

また、グラフなどを描画する場合

octave --persist filename.m

mファイル内でのインデントはスペース4つ分

Octaveの使い方

% 変数の宣言
x = 0
y = 1

% 行列の宣言
A = [1 2; 3 4]
B = [0; 1]
C = [1 0]

inv(A)    %逆行列
A'          %転置
det(A)   %行列式

基本的にMatlabと同じ書き方ができるのでググれば大丈夫

UnityでiOSアプリ開発(+ARKit)

はじめに

ARKitを使用したアプリを作成したときのメモです。

目的

UnityでiOSアプリを作成、ARKitのサンプルを動かす

環境

iOSアプリのビルドにはXcodeが必要なので、Mac PCを用意してください。

手順

  1. Unityインストール
  2. Xcodeインストール
  3. AppleIDを開発者として登録
  4. XCodeの設定
  5. Unity起動、ARKit Pluginをインポート
  6. Unityビルド設定
  7. Build & Run、iOS端末へ送信

1. Unityインストール

公式サイトからUnityをインストール

unity3d.com

2. Xcodeインストール

App StoreからXcodeをインストール

3. AppleIDを開発者として登録

アプリ開発するためにAppleIDを開発者として登録する必要があります。

AppleIDとパスワードを入力するだけです。

Sign in with your Apple ID - Apple Developer

(「AppleID 開発者」と検索すると公式サイトが引っ掛かります)

4. Xcodeの設定

まず、AppleIDを設定

Xcode > Preferences... > Accountsでアカウントを登録

左下にある「+」ボタンを押すと登録できます。

次にXcodeエディタの真ん中のエリアで、「General」タブの「Signing」で「Team」に自分を登録

5. Unityを起動してARKit Pluginをインポート

Unityを起動

新しいプロジェクトを作成します(プロジェクト名などは適当に)

Unityエディタが開いたらAsset Storeを開きます。

上部の「Window」タブの中から「Asset Store」を選択

Asset Store内で「ARKit」と検索すると「Unity ARKit Plugin」が見つかります

これをインポートします

6. Unityのビルド設定

Unityエディタの「File」タブから「Build Settings」を選択

  1. 「Add Open Scenes」を押す
  2. Scenes In Buildの中で一番上のシーンにチェックを入れる(ARKitScene)
  3. Platformで「iOS」を選択後、左下の「Switch Platform」ボタンを押す

次に「Player Settings」ボタンを押すとUnityエディタの右側に設定項目が出てくる

  1. 一番上の「Company Name」と「Product Name」を適当に入力
  2. Other Settingsの「Bundle Identifier」に「com.Company Name.Product Name」となるように入力

以上で設定終了

7. Build & Run、iOS端末へ送信

iOS端末をMac PCと有線で接続

「Build Settings」ウインドウの右下にある「Build And Run」を押す

Xcodeが立ち上がっていなくても自動で立ち上がるので大丈夫)

Xcodeでビルドが完了したら、Xcode左上の再生ボタン(三角のやつ)を押すとiOS端末へ送信される

Xcodeでエラーが起こった場合

基本的にエラー内容を読めばどう対処すればいいか分かります。

また、ググれば解決方法が分かります。

Xcodeのバージョンが~と言われたらおそらく現在のバージョンが古いのでアップデートする

iPad is busy: ~と言われたらiOS端末を再起動する

iOSアプリが信頼されていないと言われたら

iOS端末上で作成したアプリを開こうとしたら「このアプリ(開発元)は信頼されていない」みたいなことを言われるかもしれません。

この場合は「設定」> 「デバイス管理」から自分を選択して信頼します。

動いたときの様子

f:id:kato_robotics:20180627164941p:plain

まとめ

UnityでiOSアプリを開発しました。ARKitのサンプルを動かしました。

Unity と ROS の通信 ( rosbridge, websocket_sharp )

追記(2018/10/24)

この記事では websocket-sharp をそのまま使用して通信を行っていますが、 ROS# (ros-sharp) というライブラリを使った方が楽です

github.com

使い方を簡単にまとめてみました

kato-robotics.hatenablog.com

はじめに

だいぶ前にUnityアプリからTurtleBotを動かしたときのことをまとめます。

(ざっと流れを書いていくので参考程度に)

目的

UnityアプリからTurtleBotを操作

環境

  • Ubuntu16.04
  • ROS Kinetic Kame
  • Unity

手順

  • Unity側

    • websocket-sharpライブラリの準備
    • TurtleBotへ命令を出すコードを用意
  • TurtleBot側

    • TurtleBotが動かせるように準備
    • rosbridge_serverを起動

websocket-sharpの準備(Unity側)

以下を参考。ありがたい。

qiita.com

rosbridgeの準備(ROS側)

以下のコマンドでインストール

sudo apt install ros-kinetic-rosbridge-server

以下のコマンドで実行

roslaunch rosbridge_server rosbridge_websocket.launch

rosbridge_serverを立てている間は、 外部からトピックへアクセスできる。

TurtleBotの準備(ROS側)

すでにTurtleBotを動かすために必要なものは揃っている前提。

以下のコマンドを実行

roslaunch turtlebot_bringup minimal.launch
roslaunch turtlebot_teleop keyboard_teleop.launch

これでTurtleBotが動くはず。

TurtleBotを動かすためのコード(Unity側)

以下がサンプルコード

きれいではないけど動くとは思います。

(websocketよく分からん)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WebSocketSharp;
using WebSocketSharp.Net;

public class TurtleBot_Script : MonoBehaviour
{
    [System.Serializable]
    public class RosData1
    {
        public string op;
        public string topic;
        public string type;
    }

    [System.Serializable]
    public class RosData2
    {
        public string op;
        public string topic;
        public Msg msg;
    }

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


    WebSocket ws;
    public float linear_val = 1.0;
    public float angular_val = 1.0;

    void Start()
    {
        string ipaddress = "xxx.xxx.xxx.xxx"; //自分のIPアドレス
        ws = new WebSocket("ws://" + ipaddress + ":9090/");

        ws.OnOpen += (sender, e) =>
        {
            Debug.Log("WebSocket Open");
            RosData1 data = new RosData1();
            data.op = "advertise";
            data.topic = "/mobile_base/commands/velocity";
            data.type = "geometry_msgs/Twist";
            string json = JsonUtility.ToJson(data);
            ws.Send(json);
        };

        ws.OnError += (sender, e) =>
        {
            Debug.Log("WebSocket Error Message: " + e.Message);
        };

        ws.OnClose += (sender, e) =>
        {
            Debug.Log("WebSocket Close");
        };

        ws.Connect();
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 lin = new Vector3(linear_val ,0,0);
        Vector3 ang = new Vector3(0,0,angular_val);

        Msg msg = new Msg();
        msg.linear = lin;
        msg.angular = ang;

        RosData2 data = new RosData2();
        data.op = "publish";
        data.topic = "/mobile_base/commands/velocity";
        data.msg = msg;
        string json = JsonUtility.ToJson(data);
        ws.Send(json);
    }
}

まとめ

UnityアプリからROSへデータを送る方法を書きました。

おわりに

あまり確認作業をせずに書いたので間違ってたらすみません。

他に参考にしたもの

oohito.com

oohito.com