2015年9月11日金曜日

拾い食いはVRか?



今日ふとしたことで、大北さんとIVRC(http://ivrc.net)の話をする機会があって、


VRの研究だとさらに人の感覚を細かく突き詰めていて「ぬるぬる感の本質」とか追い詰めてたりする。Daily Portal-Zさんでもそういうのやりますよね~。という話をしてたときに


「拾い食いは楽しい」というのを発見したんですがこれはVRですか?


http://portal.nifty.com/kiji/150609193761_1.htm


という質問をされて、答えを出せずに適当にごまかした。


元ネタを読んでもらうといいのだが、一言でいうと


「道に食べ物を(安全に)置いてもらって拾い食いをする。」


という企画である。実際には安全には不可能な拾い食いの「楽しさ」に繋がる部分を


抽出して体験させたという意味で広い意味でのVRだとは思うけど、なんか違う。


多分IVRCのようなVRコンテストに出したとしたら以下のように辛辣な質疑の嵐だろう。




  • 「本当に隠れる必要あるの?」

  • 「屋内ではだめなのか?」

  • 「姿勢だけの問題ではないのか?」

  • 「本当に食べるまでする必要はあるの?」

  • 「身内が仕掛けてるから楽しいのではないの?」

  • 「個人性は関係しないのか?」

  • 「その楽しさは本当に、拾い食いの楽しさと同一なの?」

  • 「単なるリアルじゃん」

  • 「普段拾い食いしている人にとっても、楽しいのか?」


色々でてくるけど、質問者の立場は大きく2つに分けられる。


一つは人間を知る科学としてのVR学すなわち拾い食いの楽しさのエッセンスは何か?


もう一つは人間の性質からVR体験を設計する工学(設計論)としてのVR学、つまり「拾い食いの楽しさを感じる手段として良い方法なのか?」


そういった、突き詰めが記事中には無いので大北さんの拾い食いは、「VR的な事例ではあるけれども、VRシステムとしてはちゃんと作られているか怪しい」となんとなく私は感じて、拾い食いは「VR」なのか?という質問に答えられなかった気がする。


 「VR的な体験だけどVRシステムじゃなさそうですね。」


と言う答えでとりあえずはいい気はする。


しかしまだ引っかかるものがあるのです。


最近VR学会の重鎮の人も草の根的な研究活動について気にしている。


大北さんの「拾い食い=楽しい」に対して、研究として体系的な実験で地道に上の質問に答えをだして突き詰める人は出ないだろう。


ただ、草の根活動として「拾い食い体験」が拡がる可能性はある。そうしたとときに、「寿司を拾い食いするのじゃなくて、回転ずしを拾い食いしたい」とか普通の実験設計ではやらないような事をする人が現れたりもする。かなりの数が無駄な実験に終わるかもしれないが、変な条件でやった例が沢山貯まると、研究者が真面目に実験設計した少数の実験を超える「拾い食いと楽しさの関係」に関する知見が得られるかもしれない。(知見をまとめるのは本業研究者かもしれないが)


何を絵空事をと思うかもしれないが、「初音ミクにそれを見た。」と言うと拾い食いのVRもブームにさえ乗れれば不可能じゃない気がしないだろうか?


そこまで考慮すると、安易にそんな奴らVRじゃねぇーよといって軽く見るのは危険な気もする。逆に拾い過ぎても薄まりすぎて一瞬のブームで忘れ去れる戯れ事となる気もする。


しょうじき、私はVR研究者ではないし、VRの学位も持たない。たんなるVR好きのオッサンだし、このモヤモヤに答えを出せる気がしない。でも世の中の色んな事に「VRかもしんない」と思ってちょっと立ち止まって見るのはいい所を付いているきがする。








注:IVRCとは関係ない個人の私見ですよ。「それは違う」と怒られる気はするけど、まぁ怒られてみないと解らないので、記事として書きました。怒るときは優しくお願いします>各位





2015年6月13日土曜日

Raspberry Pi2でws2812bを使う






この人のライブラリを使えば動くけど、レジスタアクセスは多分volatileを追加したほうが将来コンパイラが変わっても安心。


https://github.com/richardghirst/rpi_ws281x#


C-cで終了すると終了処理が走らないのでmain.cにSIGINTを追加。ついでにSIGTERMも。


ほかにもmailbox.cにおいてレジスタをmmapでマッピングするのは正しく動くけどunmapにバグがあるので修正して使っています。


差分はこんな感じ。


RPi2からWS2812Bへの接続は直接接続でやってます。安全のため100Ωの抵抗を直列に挟んでいます。(抵抗による電圧降下はなかったです)



diff rpi_ws281x-master/dma.h rpi_ws281x-master_new/dma.h
42,48c42,48
< uint32_t ti;
< uint32_t source_ad;
< uint32_t dest_ad;
< uint32_t txfr_len;
< uint32_t stride;
< uint32_t nextconbk;
< uint32_t resvd_0x18[2];
---
> volatile uint32_t ti;
> volatile uint32_t source_ad;
> volatile uint32_t dest_ad;
> volatile uint32_t txfr_len;
> volatile uint32_t stride;
> volatile uint32_t nextconbk;
> volatile uint32_t resvd_0x18[2];
55,56c55,56
< {
< uint32_t cs;
---
> {
> volatile uint32_t cs;
71,72c71,72
< uint32_t conblk_ad;
< uint32_t ti;
---
> volatile uint32_t conblk_ad;
> volatile uint32_t ti;
88,90c88,90
< uint32_t source_ad;
< uint32_t dest_ad;
< uint32_t txfr_len;
---
> volatile uint32_t source_ad;
> volatile uint32_t dest_ad;
> volatile uint32_t txfr_len;
93c93
< uint32_t stride;
---
> volatile uint32_t stride;
96,97c96,97
< uint32_t nextconbk;
< uint32_t debug;
---
> volatile uint32_t nextconbk;
> volatile uint32_t debug;
rpi_ws281x-master_new/だけに発見: dma.h~
rpi_ws281x-master_new/だけに発見: dma.o
diff rpi_ws281x-master/gpio.h rpi_ws281x-master_new/gpio.h
36,61c36,61
< uint32_t fsel[6]; // GPIO Function Select
< uint32_t resvd_0x18;
< uint32_t set[2]; // GPIO Pin Output Set
< uint32_t resvd_0x24;
< uint32_t clr[2]; // GPIO Pin Output Clear
< uint32_t resvd_0x30;
< uint32_t lev[2]; // GPIO Pin Level
< uint32_t resvd_0x3c;
< uint32_t eds[2]; // GPIO Pin Event Detect Status
< uint32_t resvd_0x48;
< uint32_t ren[2]; // GPIO Pin Rising Edge Detect Enable
< uint32_t resvd_0x54;
< uint32_t fen[2]; // GPIO Pin Falling Edge Detect Enable
< uint32_t resvd_0x60;
< uint32_t hen[2]; // GPIO Pin High Detect Enable
< uint32_t resvd_0x6c;
< uint32_t len[2]; // GPIO Pin Low Detect Enable
< uint32_t resvd_0x78;
< uint32_t aren[2]; // GPIO Pin Async Rising Edge Detect
< uint32_t resvd_0x84;
< uint32_t afen[2]; // GPIO Pin Async Falling Edge Detect
< uint32_t resvd_0x90;
< uint32_t pud; // GPIO Pin Pull up/down Enable
< uint32_t pudclk[2]; // GPIO Pin Pull up/down Enable Clock
< uint32_t resvd_0xa0[4];
< uint32_t test;
---
> volatile uint32_t fsel[6]; // GPIO Function Select
> volatile uint32_t resvd_0x18;
> volatile uint32_t set[2]; // GPIO Pin Output Set
> volatile uint32_t resvd_0x24;
> volatile uint32_t clr[2]; // GPIO Pin Output Clear
> volatile uint32_t resvd_0x30;
> volatile uint32_t lev[2]; // GPIO Pin Level
> volatile uint32_t resvd_0x3c;
> volatile uint32_t eds[2]; // GPIO Pin Event Detect Status
> volatile uint32_t resvd_0x48;
> volatile uint32_t ren[2]; // GPIO Pin Rising Edge Detect Enable
> volatile uint32_t resvd_0x54;
> volatile uint32_t fen[2]; // GPIO Pin Falling Edge Detect Enable
> volatile uint32_t resvd_0x60;
> volatile uint32_t hen[2]; // GPIO Pin High Detect Enable
> volatile uint32_t resvd_0x6c;
> volatile uint32_t len[2]; // GPIO Pin Low Detect Enable
> volatile uint32_t resvd_0x78;
> volatile uint32_t aren[2]; // GPIO Pin Async Rising Edge Detect
> volatile uint32_t resvd_0x84;
> volatile uint32_t afen[2]; // GPIO Pin Async Falling Edge Detect
> volatile uint32_t resvd_0x90;
> volatile uint32_t pud; // GPIO Pin Pull up/down Enable
> volatile uint32_t pudclk[2]; // GPIO Pin Pull up/down Enable Clock
> volatile uint32_t resvd_0xa0[4];
> volatile uint32_t test;
rpi_ws281x-master_new/だけに発見: gpio.h~
rpi_ws281x-master_new/だけに発見: libws2811.a
rpi_ws281x-master_new/だけに発見: linux.pyc
diff rpi_ws281x-master/mailbox.c rpi_ws281x-master_new/mailbox.c
76a77,78
> unsigned offset = (unsigned)addr % PAGE_SIZE;
> addr-=offset;size+=offset;
rpi_ws281x-master_new/だけに発見: mailbox.c~
rpi_ws281x-master_new/だけに発見: mailbox.o
diff rpi_ws281x-master/main.c rpi_ws281x-master_new/main.c
150a151,152
> sigaction(SIGINT , &sa, NULL);
> sigaction(SIGTERM, &sa, NULL);
194c196
< usleep(500000);
---
> usleep(1000*1000/15);






2015年1月19日月曜日

fmath.hppでexpを高速化するときにハマる事。



以下を使うだけなのですが、ちょっと工夫が必要です。


http://www.slideshare.net/herumi/exp-9499790


https://raw.githubusercontent.com/herumi/fmath/master/fmath.hpp


fmath.hppではSSEを使った高速なexpの実装がなされています。


gccやclangはもちろんVCでも2008移行なら通るみたいです。(VC2010で通るのは確認)


erf等の超越関数も多くはexp(区分近似多項式)の形で実装されているので


boostなどヘッダファイルとして与えられている実装なら高速化できます。






#include<fmath.h>
#define exp(...) fmath::expd((__VA_ARGS__))
#define expf(...) fmath::exp((__VA_ARGS__))
#include<boost/math/special_functions/erf.hpp>
#define erf(...) boost::math::erf((__VA_ARGS__))


気を付けなければいけないのはc++の場合関数マクロの引数がXじゃなくて...になる事。


特にboostはコレにしておかないとコケます。


マクロ展開はコンパイラに先立って行うので、「,」を見つけると機械的に複数の引数として検知します。なのでexp( TemplateFunction<a,b>(1)); というようなテンプレート関数を引数に取るときに誤った処理をしてしまうのです。


あと細かい話しだとexpをdouble型としていますが、expはfloat型もあります。なので本当は型によってfmath::expdとfmath::expを呼び分けるようにしてあげる必要がありますが、私自身はfloatをめったに使わないので、上のように手抜きしています。





上の方法で全てのソースコードにexpの入れ替えができるというわけではないですが、あらかたうまくいきます。





2015年1月18日日曜日

FreeBSDのfetchでHTTPSのサイトに繋いでエラーが出るとき



以下のようにして、「インターネット全体」の証明書を自分のシステムデフォルトの証明書として設定すればよい。



pkg install ca_root_nss


ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem



(イントラネットなどでは、別の証明書を使うように指示されてるかもしれないので。


 その時はあきらめて、 --ca-cert=オプションでca-root-nssを指定する)