銀の弾丸、はじめました

Unityとかガジェットとか

モーションキャプチャ Perception Neuronについて

ガジェ獣 Advent Calendar 2015 10日目の投稿です.

www.adventar.org


Perception Neuron

どこのご家庭にもある,割りと一般的なモーションキャプチャです.

neuronmocap.com

リアルタイムにUDPなどでデータを飛ばしたり,ワイヤレス駆動,単独起動も可能でSDカードとバッテリーを別途用意すれば何処でもモーションキャプチャデータが収集できます.
値段は身体全体と手指の基本セットの一般ユーザー向けので
184,000円くらい…安いッ!

f:id:japanetfutan:20150826003312j:plain

手指も取れる

各種モーションキャプチャデータはfbxやbvhなどにファイル出力が可能.

Unity上の3Dキャラクターへ,リアルタイムにモーションデータを反映させる事もできます.
dvorak.hatenablog.com

スマフォのGPSとデータ連動させれば,いつ,何処で,どのような状態(体勢)だったのかがライフログとして残せます.

f:id:japanetfutan:20150826203140j:plain

モーションキャプチャは最強のライフログツール

欠点

着脱がクソ面倒www
ボッチ(独り身)は特に着る時凄い時間掛かる.(5分くらい?)

今年のベストバイです(多分)

何だかんだ凄いです,やっぱ.
あと,これだけ言わせて…

モーションキャプチャウェアラブル!!

f:id:japanetfutan:20151210081345j:plain

色々あって,俺がプロ生ちゃんになるよ

この投稿は【プロ生ちゃん Advent Calendar 2015】2日目です

qiita.com


用意するもの

neuronmocap.com

f:id:japanetfutan:20150826203140j:plain

  • VR HMD(ヘッドマウントディスプレイ)Oculus Rift DK2(現在販売終了)

www.oculus.com

f:id:japanetfutan:20140319165239j:plain

f:id:japanetfutan:20151203090636p:plain

完成したモノ

画面下が プロ生ちゃん(プレイヤー)視点を単眼出力しているモノです.
ユニティちゃん にも同じモーションを流しています.

Perception NeuronはKinectと違って寝っ転がったりPCから離れてもリアルタイムにモーションキャプチャーできるのが良いです.
個人でもVR内に入り込めた感がより強まりました.

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています

CloudPebbleショートカットキー

最近のバージョンアップで色々な動作ができるようになった.
コードの画面以外でも(SETTINGSとか)でも機能する.
これで.ログ見たり実行したりが容易になった.
github.com

Command (ctrl) + Shift + P

f:id:japanetfutan:20151109094712p:plain

「r」を押すと絞られる.
この時,「Run」にフォーカスが当たっているので,そのまま Enter で実行できる.

f:id:japanetfutan:20151109094709p:plain

Pebble.js だと Chalkエミュレータが正常に動かないけど(2015/11/06現在)

一段とCloudPebbleが使い易くなった!

* 注意

私の環境だけかもしれませんが,OS XGoogle Chrome
Pocket(後で読む系サービス)のExtensionが入っていたせいで,
このショートカットキーが使えませんでした.
ショートカットキーを変更してもダメだったので無効にしました.
現状で しばらく様子みています.

chrome.google.com

TimeText の使い方

使い方が分かったのと,凄い便利だったので.

Documentを見ていたら文字列のフォーマット形式の類だと思っていたのですが,
どうにも上手くいかず,日時表示は生のJavaScriptでやっていました.

しかし,どうやら,このTimeTextはオブジェクト的なモノみたいです.
以下の Pebble.js コードだけで,WatchFace アプリの完成です.

凄い便利なのが,勝手に秒単位,分単位で時間が更新されること!

こんな便利なのがあったなんて知りませんでした.

第0回 関西Pebbleアプリ勉強会 開いて本当に良かった.)

JavaScriptで今までやってたやり方…(例)

var UI = require('ui');
var Vector2 = require('vector2');
var window = new UI.Window();
window.fullscreen(true);

var textField = new UI.Text({
  position: new Vector2(0,25),
  size: new Vector2(144, 168),
  font: 'leco-20-bold-numbers',
  backgroundColor: 'black',
  color: 'vividCerulean',
  textOverflow:'wrap',
  textAlign:'center',
  text: ''
});

window.add(textField);
window.show();

function padZero(s){
  return s < 10?'0'+s:s;
}

function itsTime(){
  var date = new Date();
  var y = date.getFullYear();
  var m = date.getMonth()+1;
  var d = date.getDate();
  var hh = date.getHours();
  var mm = date.getMinutes();
  var ss = date.getSeconds();
  m = padZero(m);
  d = padZero(d);
  hh = padZero(hh);
  mm = padZero(mm);
  ss = padZero(ss);
  return y + '/' + m + '/' + d + ' ' + hh + ':' + mm + ':' + ss;
}

setInterval(function(){
  textField.text(itsTime());
}, 1000);

TimeText ならこれだけで勝手に更新される!
(分単位,秒単位などそれぞれ勝手に更新してくれる!!)

var UI = require('ui');
var Vector2 = require('vector2');
var window = new UI.Window();
window.fullscreen(true);

var timeText = new UI.TimeText({
  position: new Vector2(0, 25),
  size: new Vector2(144, 30),
  //text: "%H:%M:%S",
  text: "%Y-%m-%d\n%X",
  font: 'leco-20-bold-numbers',
  color: 'vividCerulean',
  textAlign: 'center'
});

 window.add(timeText);
 window.show();

結果は同じ
f:id:japanetfutan:20151106205828p:plain

Pebbleアプリ勉強会を開催しました

以前からやりたいと思っていたPebbleアプリ勉強会.

突発で10/26(月)に決めて10/31(土)に決行.

さいあく,もう1人の主催者 @itosue ともくもくと何かやれればいいか程度に考えていましたが,計4人集まりました.

e7d8f6d046c4e47266982cdc44.doorkeeper.jp

初級者向けと言う事もあり,スライドもそれなりに作りこんだつもりです. 内容は CloudPebblePebble.js を使っています.( 公式チュートリアルの一部 をそのまま使っています)

参加者は全員エンジニアだと思っていたのですが,営業の方が1名おりました

(HtmlもJavaScriptも分からない方だったので,どの程度吸収できたのか…自分がいたらないばかりに色々中途半端になってしまったかも…)

このスライドをなぞるだけで,のべ90分は使ったと思います(色々と不具合でたり回線繋がらなかったり…)
ハンズオンは絶対予定より押してしまいますね…

時間は13〜18時まで(スライド,その他で半分づつくらいの割合だったかと思います)

スライドとは別に団欒

  • オススメのWatchFaceやApp
  • 普段どのような使い方をしているか?
  • ストラップ(ベルト),保護フィルムの話.
  • TIME LINEについて
  • 日本語パック(日本語化してない方のPTを日本語化しました!)
  • Voiceについて
  • Pebble社の今後の噂

ベストなWatchFace,ベストなApp,ベストな使い方

そんなモノはなくて,皆色々な自分流のベストな使い方をしている印象でした.
(当然,人気アプリなどは使われてるケースが多いですが)
個人的に驚いた使い方は,iPhoneを持っておらず,普段iPadで通知がないからPebble Timeは使える.って方がおりました.
iPadでもPebble Timeアプリを使える事に驚きですが,凄い使い方だと思いました.
iPadでも日本語化できました!!)

CloudPebble

現在はスライドの通り,バグがあるのであれですが,ボクが伝えたかったのが,CloudPebble凄いよ!って事でした.
気になっていた「同一Wi-Fi環境下のCloudPebbleで実機デバッグできるのか?」を2台で検証したところ,ちゃんと機能しました!
回線が遅かった印象を受けましたので,やはりワークショップ・勉強会では各位Wi-Fi環境は用意する方が良さそうです.

反省点

実は今回初めて勉強会を開いたのですが,本当に反省点ばかりです.
スライドも誤字脱字,冗長なコードだらけですし,営業の参加者の方のフォローが中途半端でした.
参加人数が少ないとは言え,もっと参加者サイドに立った考え方で進行するべきでした.
(アンケート機能とかも使わなかったのでレベル感とか当日になるまで分からなかった)
伝達ミスもあり,当日の集合時間も1時間程ズレてしまった(開催が突発過ぎた)

CloudPebbleで実機実行時にメモリエラー
(コンソール青文字)→ Pebble Timeアプリ再起動,Pebble Time再起動で通りました.
(ハンズオンやる場合,直前に再起動させた方が良さそうです.)

次回

次回は前もって募ってもう少し規模感のある勉強会が開ければと思っております.
(やって欲しいネタとかあればコメントなり Twitter なりで連絡ください.)
LTなどを交えながらBLEコンパニオンアプリ連携やTIME LINE使ったサービス・アプリなど,内容の濃いモノや,
初級者向けのPebble.js,CloudPebbleの良さも引き続き伝えられたらと思っています.

お住まい大阪近辺で興味があればメンバー登録だけでも,ボチっとよろしくお願いします.

関西Pebbleアプリ勉強会 | Doorkeeper

都内近郊でもやってくれとお声がけを頂くのですが,ボクがやらなくても東京近郊でなら直ぐに人が集まりそうですよ!!

It's Time!!

f:id:japanetfutan:20151031184426j:plain

Xcode7.1と6.4を共存させると6.4が起動直後に落ちる問題と回避策

Xcode.appをリネームしてXcode6.4とXcode7.1をいつも通り共存させる.

で,普段通りにXcode6.4でPJを開くといきなりXcodeが落ちる. キャッシュ等を削除しても一向に変わらず…でも他のPJは開ける.

で,思ったのが Storyboard

この落ちてしまうPJはデフォルト(Xcode開いてすぐ表示される部分)で Storyboardが表示されるようになってる事を思い出した.

そこで,1度Xcode7.1でPJを開き,Storyboardがデフォルト開かれるので MainViewController.m などの他のファイルを開きXcode7.1を終了(特に保存などはしない)

その後,Xcode6.4でPJを開くとXcodeが落ちずに MainViewController.m が開く.

ここで,Storyboardを開くと

やっぱXcodeが落ちる.

回避策

Storyboardの編集はXcode7.1で行う. あるいはAppCodeとか…

Storyboardに何かあるんだろうけど特にエラーとか出ずに落ちるしなんだかなぁ…

追記

他の環境Mac OS Xでも確認. storyboardだけでなくxibファイルでも落ちる

環境違っても起きたしあちこちで同じような人多そうなんだけどなぁ

2015/10/28 更に追記

と,思ったら似たような事象があちこちで起こっているみたいです.

dev.classmethod.jp

本当に困ったもんです…

2015/11/11 追記

同様の事象が他の方でも起こっているのを確認.
色々とヤバそう…そして7.1.1を入れてもダメだった.
色々キャッシュ消してもダメだったので以下の方法でもう1度やってみたところ,

dev.classmethod.jp

↑このやり方で取り敢えずXcode6.4のみインストールでStoryboadが機能しました.
試していませんが,Xcode7.1.xと共存される場合は以下の方法しかないかもしれません.
怖くて7.1.xインストールできません…

qiita.com

BLEデバイス(Peripheral)のUUID一覧を取得する

iOS Objective-C のメモ

// セントラル
@property (nonatomic, strong) CBCentralManager *centralManager;
// ペリフェラル
@property (nonatomic, strong) CBPeripheral *peripheral;
@property (nonatomic) NSMutableArray *peripherals;
@end

NSMutableArray *a_peripheral;
NSString * const ServiceUUID = @"XXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX";

@implementation PeripheralTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"PeripheralTableViewController - viwDidLoad");

    self.peripherals = [NSMutableArray array];  // データ用
    a_peripheral = [NSMutableArray array];      // 文字列用

    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self
                                                               queue:nil];
    self.serviceUUID = [CBUUID UUIDWithString:ServiceUUID];
    self.characteristicUUID = [CBUUID UUIDWithString:CharacteristicUUIDHeartRateMeasurement];
}


// セントラルマネージャ状態が変化
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {

    NSLog(@"Updated state: %ld", (long)central.state);

    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
        {
            // スキャン開始
            NSArray *services = @[self.serviceUUID];
            [self.centralManager scanForPeripheralsWithServices:services
                                                        options:nil];
            break;
        }
        default:
            break;
    }
}

// ペリフェラル発見
- (void)   centralManager:(CBCentralManager *)central
    didDiscoverPeripheral:(CBPeripheral *)peripheral
        advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"peripheral:%@, advertisementData:%@, RSSI:%@",
          peripheral, advertisementData, RSSI);

    // 単数の場合は以下で良いが,
    //self.peripheral = peripheral;
    // 複数のPeripheral取得には配列に格納する必要がある
    // strong属性の配列(NSMutableArray)に保持
    if (![self.peripherals containsObject:peripheral]) {
        NSLog(@"peripheral.identifier : %@", peripheral.identifier);

        [self.peripherals addObject:peripheral.identifier];

        // <__NSConcreteUUID 0x15e85410> 1174BF05-3D9A-2AD4-40D8-8A35E4D74A4A
        // <__NSConcreteUUID 0x15e8a1c0> 20B403AA-24E0-C70A-48A6-62BD9F40A1E3
        NSString *source = [NSString stringWithFormat:@"%@", peripheral.identifier];

        NSString *pattern = @"(^<.*> )";
        NSString *replacement = @"";

        NSRegularExpression *regexp = [NSRegularExpression
                                       regularExpressionWithPattern:pattern
                                       options:NSRegularExpressionCaseInsensitive
                                       error:nil
                                       ];

        NSString *str = [regexp
                         stringByReplacingMatchesInString:source
                         options:NSMatchingReportProgress
                         range:NSMakeRange(0, source.length)
                         withTemplate:replacement
                         ];
        NSLog(@"これがPeripheralのUUIDだ!!! : %@",  str);

        [a_peripheral addObject:str];

        NSLog(@"self.peripherals -> %@", self.peripherals);
        NSLog(@"a_peripheral -> %@", a_peripheral);
        NSLog(@"self.peripherals count : %d", [self.peripherals count]);
        NSLog(@"a_peripheral count : %d", [a_peripheral count]);
    }

    // スキャン停止
    //[self.centralManager stopScan];

    // 接続開始
    //[central connectPeripheral:peripheral options:nil];
}

加工した文字列用の配列を用意したのは,生のまま出力すると以下の用になってしまうため

(結果1)

self.peripherals -> (
    "<__NSConcreteUUID 0x15e85410> 1174BF05-3D9A-2AD4-40D8-8A35E4D74A4A",
    "<__NSConcreteUUID 0x15e8a1c0> 20B403AA-24E0-C70A-48A6-62BD9F40A1E3"
)

<__NSConcreteUUID 0x15e8a1c0>  の部分が不要で,気持ち悪いので
別途文字列にして加工してUUIDのみ配列に入れてる.

(結果2)

a_peripheral -> (
    "1174BF05-3D9A-2AD4-40D8-8A35E4D74A4A",
    "20B403AA-24E0-C70A-48A6-62BD9F40A1E3"
)

追記(2015/12/04)

どうやら,文字列操作しなくてもUUIDのNSStringを取得できるらしい…

[peripheral.identifier UUIDString]

stackoverflow.com

参考文献

iOS×BLE Core Bluetoothプログラミング

iOS×BLE Core Bluetoothプログラミング