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」を選択
ちなみに、ARCamera の Vuforia Behaviour にある World Center Mode が「Device Tracking」になります。
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
Octaveの使い方(Ubuntu16.04)
はじめに
最近、数値計算用の言語Octaveを使ったので、使い方をまとめておく。
環境
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を用意してください。
手順
- Unityインストール
- Xcodeインストール
- AppleIDを開発者として登録
- XCodeの設定
- Unity起動、ARKit Pluginをインポート
- Unityビルド設定
- Build & Run、iOS端末へ送信
1. Unityインストール
公式サイトからUnityをインストール
2. 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」を選択
- 「Add Open Scenes」を押す
- Scenes In Buildの中で一番上のシーンにチェックを入れる(ARKitScene)
- Platformで「iOS」を選択後、左下の「Switch Platform」ボタンを押す
次に「Player Settings」ボタンを押すとUnityエディタの右側に設定項目が出てくる
- 一番上の「Company Name」と「Product Name」を適当に入力
- Other Settingsの「Bundle Identifier」に「com.Company Name.Product Name」となるように入力
以上で設定終了
7. Build & Run、iOS端末へ送信
「Build Settings」ウインドウの右下にある「Build And Run」を押す
(Xcodeが立ち上がっていなくても自動で立ち上がるので大丈夫)
Xcodeでビルドが完了したら、Xcode左上の再生ボタン(三角のやつ)を押すとiOS端末へ送信される
Xcodeでエラーが起こった場合
基本的にエラー内容を読めばどう対処すればいいか分かります。
また、ググれば解決方法が分かります。
Xcodeのバージョンが~と言われたらおそらく現在のバージョンが古いのでアップデートする
iPad is busy: ~と言われたらiOS端末を再起動する
iOSアプリが信頼されていないと言われたら
iOS端末上で作成したアプリを開こうとしたら「このアプリ(開発元)は信頼されていない」みたいなことを言われるかもしれません。
この場合は「設定」> 「デバイス管理」から自分を選択して信頼します。
動いたときの様子
まとめ
UnityでiOSアプリを開発しました。ARKitのサンプルを動かしました。
Unity と ROS の通信 ( rosbridge, websocket_sharp )
追記(2018/10/24)
この記事では websocket-sharp をそのまま使用して通信を行っていますが、 ROS# (ros-sharp) というライブラリを使った方が楽です
使い方を簡単にまとめてみました
はじめに
だいぶ前にUnityアプリからTurtleBotを動かしたときのことをまとめます。
(ざっと流れを書いていくので参考程度に)
目的
UnityアプリからTurtleBotを操作
環境
- Ubuntu16.04
- ROS Kinetic Kame
- Unity
手順
Unity側
- websocket-sharpライブラリの準備
- TurtleBotへ命令を出すコードを用意
TurtleBot側
- TurtleBotが動かせるように準備
- rosbridge_serverを起動
websocket-sharpの準備(Unity側)
以下を参考。ありがたい。
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へデータを送る方法を書きました。
おわりに
あまり確認作業をせずに書いたので間違ってたらすみません。