コンピュータ

...now browsing by category

 

Pepper 開発体験 ワークショップ に行って来た

木曜日, 9月 25th, 2014

IMG_2076

ソフトバンクが発表したロボット、Pepper。その開発体験ワークショップが行われたので行って来ました。

場所は東京都千代田区にある元学校の建物を利用した3331 Arts Chiyodaという施設です。その3Fに設置されたPepper開発者向けのスペース「アルデバラン・アトリエ秋葉原 with SoftBank」で行われました。

6人くらいで1チームとなり、1台のPepperが割り当てられ、合計3チームで行われました。SDKがインストールされたMacBookが無線で接続されて用意されており、それを使って開発します。

IMG_2082

今回のワークショップで使われたPepperの機能は、話す、体を動かす、触られたのを認識する、音声を認識するです。

プログラムはテキストではなくGUIで、SDK上で各動作のブロックをキャンバスに置き、直列や並列で接続していきます。各ブロックのプロパティに話す言葉やポーズなどを設定していきます。

話すブロックでは、プロパティにて言語を指定し、言葉をテキストで入力していきます。日本語は漢字も使えます。また発声の高低やスピードも変えられます。この時はテキスト全てが変化したのですが、インストラクターさんの話では音ごとに変えることも可能だそうです。

タイムラインというブロックで体の動きを指定します。タイムラインではプロパティにて時間軸上に複数のポーズを設定します。ポーズは静止状態なのですが、タイムラインを実行すると時間軸に合わせて次々とポーズを変えて行くことにより動きを表現しています。動かせる体の部分は頭を前後、腕を各関節ごとでした。腰や前後移動も出来るとのことですが、ワークショップでは行われませんでした。動きの指定は2種類あり、SDK上で画面に表示されたPepperの部分を見ながらスライダで角度を指定する方法と、Pepper自体の腕や頭を人間がむ動かしてポーズを決めて行く方法の2通りです。またセンサーにより近くに障害物があると動かないように安全策がとられています。

触られたのを認識する部分は、頭の上、両手の甲、足の3つの突起です。それぞれにブロックが用意されていて、ブロックを並列に接続すると、触られた部位によりそれに続く動作を変えることが出来ます。これらのブロックでは触られるまで待ち状態になります。

音声認識ブロックでは、プロパティにて一つのブロックに複数のテキストを設定できます。テキストごとに別々に次のブロックを接続できるようになっていて、異なる動作をさせることができます。言語も変えられるようですが、複数言語のテキスト指定は出来ないようです。このブロックでも音声認識されるまで待ち状態になります。また指定のテキスト意外の音声が入力された場合の動作をつなぐ接続先もありました。

他にもブロックはたくさんあり、移動したり、胸のタプレットに写真を表示したりと色々出来るようです。

今回の開発体験で感じたのは、ロボットのプログラム開発ってScratchみたいな感覚だなということ。でも動くのは物理的なロボットなので、ポーズの感覚が短いとポーズが決まる前に次に行ってしまったり、慣性があったり、セーフ機能で止まったりといろいろと考慮すべき点はありますね。

今後のイベント開催予定はアルデバラン・アトリエ秋葉原 with SoftBankを見てください。

Raspberry Pi B+

日曜日, 8月 10th, 2014

IMG_2002

子どもの誕生日プレゼントにRaspberry Pi B+を買いました。
子ども自身が本を読みながら悪戦苦闘してセットアップしています。

本体はRS Onlineで買いました。
Amazonや秋葉原だとまだ高いので、RS Onlineが割安です。
出荷未定となっていましたが、翌営業日には発送されていました。
ディスプレイ、キーボード、マウス、USB ACアダプタは家にあった物を使用しています。
PC自作とかしないので、そんなに持って無いですけどね。
本、Micro SDHCカード、無線LANモジュールはAmazonで買いました。
ケースは良いのが無かったので、子どもがレゴブロックで自作したのですが、これがぴったりとはまります。

AutoLayoutでUIScrollViewのPagingを画面の回転に対応させる

金曜日, 7月 18th, 2014

UIScrollViewでPagingをONに設定している場合、制約のかけかたによっては、画面を回転させてUIScrollViewの大きさが変化すると、Paging時の移動量も変化してしまいます。そのため、中のコンテンツのページの幅が固定されていると、ページの区切り位置が合わなくなってしまいます。

縦画面だと2ページ目の位置が正しいけど・・・

iOSシミュレータのスクリーンショット 2014.07.18 21.32.03

iOSシミュレータのスクリーンショット 2014.07.18 21.32.14

横画面にすると2ページ目の位置がずれてしまう
iOSシミュレータのスクリーンショット 2014.07.18 21.46.15

iOSシミュレータのスクリーンショット 2014.07.18 21.46.22

この場合の解決方法としては、以下の2通りの方法が考えられます。

  1. 中のコンテンツのページの幅を、UIScrollViewの幅に連動して変化させる。
  2. UIScrollViewの幅を固定する。

今回は中身を変えずに済む2番の方法で考えてみました。

UIScrollViewに対して、幅を固定する制約、Y座標を画面の真ん中に固定する制約を付けます。
スクリーンショット 2014-07-18 21.51.32

スクリーンショット 2014-07-18 21.51.12

横画面にしても2ページ目がちゃんと画面の真ん中に表示されました。
iOSシミュレータのスクリーンショット 2014.07.18 21.32.24

iOSシミュレータのスクリーンショット 2014.07.18 21.32.29

サンプルコードはこちら

MagicalRecord : Attributeの名前とimportする時の名前が違うときの設定

土曜日, 7月 5th, 2014

Core Data ModelでAttributeに付ける名前ですが、NSManagedObjectのメソッドやプロパティと同じ名前は付けることが出来ません。例えばdescriptionやcopyなどですね。でもそれだとWeb APIなどから読み込んだデータをimportする場合に、使えない名前と同じだと困ります。

何かしら方法がないかなと調べた所、Attributeには別の名前を付けておいて、userInfoにimportする時の名前を設定しておく方法を見つけました。設定するのはKeyが”mappedKeyName”で、Valueにimportする時の名前です。例えばAttributeは”catchcopy”、importする名前が”copy”だとすると以下のように設定します。

スクリーンショット 2014-07-05 23.13.07

これを設定しておくと、NSObject+MagicalDataImport.mのMR_lookupKeyForAttribute:で”mappedKeyName”に設定した名前が取得されます(設定されていないとAttributeの名前が取得されます)。

試しに以下のコードで試してみると、

    Entity *entity = [Entity MR_createEntity];
    
    NSDictionary *dict = @{@"copy": @"Hey, Jack!"};
    
    [entity MR_importValuesForKeysWithObject:dict];

無事に取得出来ました。

entry=<Entity: 0x8c5a450> (entity: Entity; id: 0x8c5a480 <x-coredata:///Entity/t3EC7B28C-474E-44E0-9836-F59A4DDDF34E2> ; data: {
    catchcopy = "Hey, Jack!";
})

MagicalRecord : Core Data の Attribute が NSArray の場合の書き方

土曜日, 7月 5th, 2014

AFNetworkingで読み込んだWeb APIデータなどを取り込む処理で、要素が配列だった場合にどうすればいいか調べました。

Core Data ModelでAttributeを設定する時に、Typeを”Transformable”に設定する。この時、Nameは空欄にする。NSArray、NSDictionary、NSString、NSDate、NSNumber、NSDataなどNSCoding Protocolを実装しているものに変換する場合はこのように空欄でOKらしい。

スクリーンショット 2014-07-05 20.51.31

試しに要素をNSArrayにして読み込ませてみます。

    Item *item = [Item MR_createEntity];
    
    NSDictionary *dict = @{@"names": @[
                                   @"aaa",
                                   @"bbb",
                                   @"ccc",
                                   ],
                           };
    
    [item MR_importValuesForKeysWithObject:dict];
    
    NSLog(@"item=%@", item);

ちゃんとNSArryとして取り込まれているようです。

(lldb) po item
<Item: 0x8f23d80> (entity: Item; id: 0x8f23db0 <x-coredata:///Item/tBCCB18AF-3F30-45E8-A59C-B3E77196FB9A2> ; data: {
    names = "(\n    aaa,\n    bbb,\n    ccc\n)";
})

(lldb) po item.names
<__NSArrayI 0x8f20a90>(
aaa,
bbb,
ccc
)


(lldb) po item.names[0]
aaa

(lldb) po item.names[1]
bbb

(lldb) po item.names[2]
ccc

(lldb)