Oculus純正のコードでRiftを動かしたあとだと送ってくるパケットが雑になるのだけれど、これをどうにかできないものかとまずは何が起きているのか調査してた。とりあえず設定値を取得して比べてみることに...
まずはデフォルトの設定
distortion_k: 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 eye_to_screen_distance: 39620, 39620 lens_separation: 63500 vertical center: 30840 screen size: 119340 x 66300 resolution: 2160 x 1200 distortion_type: 1 command id: 0 display info:56 keep alive interval: 3 packet interval: 59392 sensor coordinates: 0 motion command keep alive: 1 motion keep alive: 0 auto calibration: 0 use calibration: 0 calibration test: 0 raw mode: 0 flags: 20 command id: 0 sensor config getconfig returns:7 mag scale:1300 rotate scale:2000 accel scale:4 getscale returns:8
そしてこれがデータが雑になってる時の設定
distortion_k: 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 eye_to_screen_distance: 39620, 39620 lens_separation: 63500 vertical center: 30840 screen size: 119340 x 66300 resolution: 2160 x 1200 distortion_type: 1 command id: 0 display info:56 keep alive interval: 3 packet interval: 59411 sensor coordinates: 0 motion command keep alive: 1 motion keep alive: 0 auto calibration: 0 use calibration: 0 calibration test: 0 raw mode: 0 flags: 20 command id: 0 sensor config:7 mag scale:1300 rotate scale:2000 accel scale:4 sensor scale:8
ログ順の関係で上が新しいので逆に読む。で、見ると異なるのはsensor config/packet intervalだけで、デフォルトが59392、雑データの時が59411になる。これは16進だとE800とE813になる。雑データはゲインが1/10になっているのかと思っていたがデータの名前から考えてΔtが10倍になっているようだ。まぁRiftの姿勢取得は2ms間隔と結構煩いので使ってない時は頻度を落とすとかしているんだろう。
おそらくこれは何らかのカウンタの値で上位を変えるとどうしようもない状態になるっぽい。もともとデフォルト値を設定することが目的なのでそこは深く考えないことにする。考えたところで誰かが勝手に決めた仕様に過ぎないし。
それにしてもdistortion_kに値が入ってないとか...これは光学系の歪み補正パラメタで、最初の3つは自乗項、四乗項、六乗項、あとの3つはRGBそれぞれの色収差補正値が入っているべきだったものだ。
ともかく、sensor configを取得してpacket intervalがデフォルトでなかったらデフォルト値にして設定すればおkってとこなのでそのように組むとしよう。