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ってとこなのでそのように組むとしよう。