2014/04/23

滑走面の拡散反射色によるセンシング性能への影響について

rafa氏が非常に面白い記事を発表されていて、気になることがあったので検証しました。

rafalog: QPAD CT Collector Editions Team Dignitas紹介
http://utmalesoldiers.blogspot.jp/2014/04/qpad-ct-collector-editions-team-dignitas.html
記事の後半のトラッキング性能の試験が素晴らしいですね。この試験により滑走面の拡散反射色が位置によって異なる(つまり柄のある)マウスパッドだとトラッキング性能が落ちる可能性を指摘できます。

そもそもマウスパッドに柄があるとトラッキングに悪影響があるような気はしていて、大半のマウスパッドが無地であるのもこういった理由なのかと思っていましたが、今回はもう少しだけ低レベルの部分まで調べてみましょう。

・試験マウスパッド
使用するのは、いつぞやに営業に来てくださった方に貰ったZOTACの販促用プラ製マウスパッドです。[ アサシンクリード ZOTAC マウスパッド ]等で検索するとちらほら引っかかるのでそれなりに数は出ているようです。摩擦係数が低く、滑走性は良いのですが、弊センサでは高速域でのトラッキングエラーが頻発してお蔵入りになっていました。やはり性能的には販促品なのでしょうか。そもそも"商品"ではなく景品なのでレビューは省略。

もともと柄物は好みではないので、手元にはこれしかありませんでした。本当はそれなりの柄付きのゲーミングマウスパッドがあると良いのですが・・・
手元にあるマウスパッドにもロゴ等の色違いの部分は存在しているのですが、滑走面の上にペイントされているタイプなので滑走面の状態自体大きく異なり、よい比較ではありません。そもそもそういった部分は摩擦係数も異なるので、使用するべきではないのというのが個人的な意見です。


このマウスパッドの上図のGray(色的には白~ライトグレー位)の部分と、Blackの部分についてログを取りました。
販促用の極めて安価なパッドを試験に使用していますし、全ての柄物のマウスパッドについて本記事の記載事項が当てはまる訳ではないと思うので、その点をご留意下さい。

・試験環境
環境 : PSoC Creator 3.0 SP7
センサ : ADNS-5090
MCU : PSoC 4 Pioneer Kit

Registerの設定 : 分かる範囲でパフォーマンス重視にしました。
RUN_DOWNSHIFT = 0xFF
REST1_DOWNSHIFT = 0xFF
REST2_DOWNSHIFT = 0xFF
AUTO_LED_CTRL = 0b00001110
MOUSE_CTRL = 0b00100100
MOUSE_CTRL_EN = 0x10

・出力データ
まずセットアップのdescriptionが出力、その後PixelGrabbeで現在のピクセルアレイの様子を出力をします。その後はループに入り、以下のデータを出力し続けます。頻度は毎秒10回程度。
データの並び順 :
⊿X、⊿Y、SQUAL、PIX_ACCUM、[PIX_MIN~PIX_MAX]、SHUT

SHUTに関しては、RegisterがSHUT_HIとSHUT_LOがありますので、
uint16 SHUT = (SHUT_HI << 8 ) + SHUT_LO;
とします。

・試験方法
1.センサのレンズ部がGrayの真上に来るように滑走面に接地し、MCUをリセットする。
2.センサ初期化と設定を行う。
3.PixGrabberを作動させピクセルアレイの輝度情報を得る。
4.マウスを数カウント動かしながらループデータを数十回記録する。
5.Blackの箇所についても同様の試験を行う。

・試験結果
1.Gray
Grayのログデータを以下に示します。

------------------------------------------------------------------
ADNS-5090 TEST Start
SPI Start
Sensor initialization finished
46 45 30 33 37 30 21 29 41 41 34 44 28 22 35 35 37 37 53
36 28 29 36 39 29 28 37 57 65 52 48 41 41 49 43 27 30 29
47 22 31 45 47 42 47 67 79 81 64 46 62 35 54 46 35 43 27
33 22 43 63 49 53 56 44 59 59 71 60 54 38 76 82 61 52 21
35 28 35 52 40 58 65 55 56 36 47 62 52 44 77 94 73 37 37
52 42 34 31 39 56 66 74 74 47 35 49 65 43 56 64 72 28 60
51 59 51 37 33 58 49 50 85 60 44 59 78 52 45 52 69 26 32
45 56 47 35 35 40 38 46 56 42 69 49 47 76 58 39 56 36 30
46 46 40 38 39 36 41 57 61 40 64 44 55 71 52 36 68 67 36
60 51 44 40 36 35 56 50 67 47 34 50 81 64 44 36 72 79 36
63 62 50 51 65 70 81 59 50 33 21 35 51 49 37 53 104 86 44
52 58 52 44 63 73 73 72 58 33 30 40 70 56 40 62 102 65 56
55 57 51 38 48 52 68 72 81 64 43 54 85 61 55 38 71 89 64
66 62 58 37 51 69 80 85 73 54 39 41 57 49 50 36 37 92 54
72 57 55 43 63 65 66 88 65 50 45 49 55 50 40 36 40 57 42
66 53 45 47 70 63 55 70 75 57 48 42 43 38 32 43 64 40 36
57 45 42 47 55 60 39 48 60 51 50 62 59 70 43 79 93 51 37
62 46 43 43 49 65 45 61 70 57 78 70 57 59 41 92 91 64 49
61 58 40 42 64 88 75 83 74 59 95 82 51 42 43 89 77 56 79
X 0 Y 0 SQUAL : 90 ACCUM : 74 [ 21~104 ] SHUT : 159
X 0 Y 0 SQUAL : 91 ACCUM : 74 [ 21~104 ] SHUT : 159
X 0 Y 0 SQUAL : 96 ACCUM : 74 [ 21~104 ] SHUT : 159
X 0 Y 0 SQUAL : 89 ACCUM : 74 [ 21~106 ] SHUT : 159
X 0 Y 0 SQUAL : 92 ACCUM : 74 [ 21~103 ] SHUT : 159
X 0 Y 0 SQUAL : 95 ACCUM : 74 [ 21~104 ] SHUT : 159
X 0 Y 0 SQUAL : 93 ACCUM : 74 [ 21~103 ] SHUT : 159
X 0 Y 0 SQUAL : 93 ACCUM : 74 [ 21~104 ] SHUT : 159
X 0 Y 0 SQUAL : 89 ACCUM : 74 [ 21~106 ] SHUT : 159
X 0 Y 0 SQUAL : 91 ACCUM : 74 [ 21~105 ] SHUT : 159
X 0 Y 0 SQUAL : 92 ACCUM : 74 [ 21~107 ] SHUT : 159
X 0 Y 0 SQUAL : 95 ACCUM : 70 [ 19~111 ] SHUT : 149
X -5 Y 0 SQUAL : 87 ACCUM : 70 [ 17~103 ] SHUT : 148
X -2 Y -1 SQUAL : 92 ACCUM : 66 [ 11~108 ] SHUT : 137
X 0 Y -2 SQUAL : 85 ACCUM : 63 [ 14~95 ] SHUT : 127
X 1 Y -4 SQUAL : 87 ACCUM : 86 [ 22~102 ] SHUT : 151
X 1 Y 0 SQUAL : 97 ACCUM : 86 [ 20~98 ] SHUT : 161
X 2 Y 7 SQUAL : 92 ACCUM : 69 [ 15~103 ] SHUT : 147
X -1 Y 2 SQUAL : 93 ACCUM : 68 [ 13~100 ] SHUT : 147
X -4 Y -3 SQUAL : 83 ACCUM : 65 [ 14~108 ] SHUT : 136
X -5 Y -10 SQUAL : 85 ACCUM : 79 [ 25~102 ] SHUT : 121
X 2 Y -1 SQUAL : 81 ACCUM : 80 [ 28~98 ] SHUT : 121
X 4 Y 0 SQUAL : 89 ACCUM : 86 [ 27~100 ] SHUT : 138
X 0 Y 5 SQUAL : 93 ACCUM : 79 [ 22~98 ] SHUT : 143
X -5 Y 0 SQUAL : 87 ACCUM : 82 [ 19~109 ] SHUT : 140
X -9 Y -6 SQUAL : 93 ACCUM : 80 [ 20~104 ] SHUT : 128
X -1 Y -5 SQUAL : 90 ACCUM : 75 [ 24~109 ] SHUT : 128
X 5 Y -1 SQUAL : 87 ACCUM : 82 [ 24~107 ] SHUT : 135
X 2 Y 0 SQUAL : 92 ACCUM : 81 [ 26~104 ] SHUT : 135
X 1 Y 7 SQUAL : 94 ACCUM : 82 [ 27~102 ] SHUT : 126
X -1 Y 3 SQUAL : 84 ACCUM : 84 [ 24~103 ] SHUT : 134
X -4 Y -1 SQUAL : 78 ACCUM : 69 [ 22~106 ] SHUT : 109
X -1 Y -6 SQUAL : 83 ACCUM : 82 [ 23~105 ] SHUT : 137
X 5 Y -3 SQUAL : 85 ACCUM : 77 [ 27~105 ] SHUT : 128
X 4 Y 4 SQUAL : 90 ACCUM : 82 [ 26~102 ] SHUT : 126
X 1 Y 5 SQUAL : 86 ACCUM : 85 [ 23~102 ] SHUT : 134
X -3 Y 5 SQUAL : 92 ACCUM : 82 [ 17~103 ] SHUT : 141
X -6 Y 0 SQUAL : 85 ACCUM : 78 [ 21~103 ] SHUT : 132
X -4 Y -7 SQUAL : 87 ACCUM : 86 [ 27~110 ] SHUT : 140
X 4 Y -4 SQUAL : 92 ACCUM : 86 [ 25~106 ] SHUT : 139
X 5 Y 0 SQUAL : 83 ACCUM : 85 [ 28~103 ] SHUT : 139
X 4 Y 3 SQUAL : 94 ACCUM : 83 [ 26~108 ] SHUT : 128
X 2 Y 7 SQUAL : 84 ACCUM : 76 [ 20~102 ] SHUT : 136
X -4 Y 3 SQUAL : 86 ACCUM : 72 [ 11~108 ] SHUT : 138
X -2 Y 1 SQUAL : 91 ACCUM : 73 [ 15~103 ] SHUT : 138
X -4 Y -6 SQUAL : 89 ACCUM : 82 [ 28~103 ] SHUT : 129
X 1 Y -6 SQUAL : 82 ACCUM : 80 [ 26~101 ] SHUT : 125
X 4 Y -2 SQUAL : 90 ACCUM : 78 [ 25~108 ] SHUT : 125
X 4 Y 1 SQUAL : 95 ACCUM : 85 [ 26~102 ] SHUT : 132
X 3 Y 7 SQUAL : 91 ACCUM : 87 [ 24~100 ] SHUT : 150
X -1 Y 5 SQUAL : 88 ACCUM : 63 [ 8~100 ] SHUT : 130
X -4 Y 2 SQUAL : 100 ACCUM : 69 [ 11~97 ] SHUT : 148
X -5 Y -3 SQUAL : 90 ACCUM : 74 [ 13~103 ] SHUT : 129
X 0 Y -7 SQUAL : 82 ACCUM : 77 [ 24~106 ] SHUT : 120
X 5 Y -3 SQUAL : 85 ACCUM : 79 [ 27~101 ] SHUT : 120
X 4 Y 3 SQUAL : 90 ACCUM : 85 [ 27~97 ] SHUT : 146
X 2 Y 7 SQUAL : 94 ACCUM : 72 [ 19~105 ] SHUT : 143
X 0 Y 6 SQUAL : 85 ACCUM : 69 [ 12~102 ] SHUT : 151
X 0 Y 2 SQUAL : 88 ACCUM : 72 [ 15~105 ] SHUT : 161
X -7 Y -2 SQUAL : 96 ACCUM : 76 [ 18~102 ] SHUT : 161
X 0 Y -10 SQUAL : 92 ACCUM : 89 [ 31~96 ] SHUT : 140
X 5 Y -5 SQUAL : 91 ACCUM : 84 [ 29~100 ] SHUT : 131
X 7 Y 3 SQUAL : 90 ACCUM : 83 [ 27~98 ] SHUT : 140
X 3 Y 6 SQUAL : 87 ACCUM : 68 [ 15~95 ] SHUT : 139
X -1 Y 5 SQUAL : 81 ACCUM : 63 [ 17~107 ] SHUT : 134
X -4 Y 2 SQUAL : 92 ACCUM : 67 [ 13~109 ] SHUT : 152
X -4 Y 0 SQUAL : 86 ACCUM : 69 [ 13~101 ] SHUT : 151
X -2 Y -7 SQUAL : 82 ACCUM : 68 [ 16~106 ] SHUT : 128
X 2 Y -5 SQUAL : 87 ACCUM : 91 [ 22~102 ] SHUT : 149
X 3 Y 0 SQUAL : 80 ACCUM : 82 [ 25~105 ] SHUT : 138
X 6 Y 5 SQUAL : 79 ACCUM : 68 [ 11~107 ] SHUT : 127
X 1 Y 7 SQUAL : 83 ACCUM : 66 [ 15~100 ] SHUT : 149
X -2 Y 8 SQUAL : 92 ACCUM : 72 [ 18~106 ] SHUT : 166
X -5 Y 0 SQUAL : 92 ACCUM : 71 [ 17~102 ] SHUT : 165
X -6 Y -6 SQUAL : 93 ACCUM : 75 [ 17~105 ] SHUT : 175
X 6 Y -9 SQUAL : 87 ACCUM : 84 [ 22~106 ] SHUT : 158
X 8 Y 3 SQUAL : 89 ACCUM : 60 [ 11~92 ] SHUT : 130
X -6 Y 10 SQUAL : 93 ACCUM : 71 [ 14~103 ] SHUT : 164
X 0 Y 0 SQUAL : 90 ACCUM : 70 [ 15~105 ] SHUT : 164
X 0 Y -1 SQUAL : 100 ACCUM : 74 [ 16~98 ] SHUT : 175
X 0 Y 0 SQUAL : 95 ACCUM : 74 [ 17~111 ] SHUT : 175
X 0 Y 0 SQUAL : 87 ACCUM : 70 [ 16~110 ] SHUT : 164
X 0 Y -1 SQUAL : 95 ACCUM : 74 [ 17~103 ] SHUT : 175
X -1 Y -1 SQUAL : 93 ACCUM : 74 [ 15~103 ] SHUT : 175
X 0 Y 0 SQUAL : 90 ACCUM : 74 [ 15~102 ] SHUT : 175
X 0 Y 0 SQUAL : 90 ACCUM : 74 [ 15~102 ] SHUT : 175
X 0 Y 0 SQUAL : 85 ACCUM : 74 [ 15~102 ] SHUT : 175
X 0 Y 0 SQUAL : 88 ACCUM : 75 [ 15~101 ] SHUT : 175
X 0 Y 0 SQUAL : 86 ACCUM : 75 [ 16~102 ] SHUT : 175
X 0 Y 0 SQUAL : 90 ACCUM : 75 [ 16~101 ] SHUT : 175
X 0 Y 0 SQUAL : 88 ACCUM : 75 [ 16~101 ] SHUT : 175
X 0 Y 0 SQUAL : 88 ACCUM : 75 [ 15~102 ] SHUT : 175
X 0 Y 0 SQUAL : 85 ACCUM : 75 [ 15~102 ] SHUT : 175
X 0 Y 0 SQUAL : 89 ACCUM : 75 [ 15~101 ] SHUT : 175
X 0 Y 0 SQUAL : 88 ACCUM : 75 [ 15~103 ] SHUT : 175
X 0 Y 0 SQUAL : 88 ACCUM : 75 [ 16~103 ] SHUT : 175
X 0 Y 0 SQUAL : 88 ACCUM : 75 [ 16~101 ] SHUT : 175
X 0 Y 0 SQUAL : 88 ACCUM : 75 [ 16~102 ] SHUT : 175
X 0 Y 0 SQUAL : 86 ACCUM : 75 [ 16~101 ] SHUT : 175

------------------------------------------------------------------

2.Black
Blackのログデータを以下に示します。

------------------------------------------------------------------
DNS-5090 TEST Start
SPI Start
Sensor initialization finished
28 48 34 34 26 39 34 18 41 43 11 13 27 24 23 17 22 7 5
13 26 25 26 24 36 45 22 13 12 7 7 5 8 11 58 35 7 28
20 34 25 30 28 18 31 33 16 19 20 8 4 7 5 30 20 47 97
27 34 25 38 29 31 34 23 15 37 32 10 6 13 13 8 7 52 54
29 21 13 19 24 34 28 14 17 76 85 27 29 19 16 8 53 64 42
20 15 17 31 51 58 22 11 16 74 100 67 15 13 8 10 31 53 49
12 15 23 68 74 36 27 26 23 25 78 90 31 15 8 34 23 8 15
13 15 24 72 71 27 36 77 60 9 60 70 38 8 5 38 51 13 16
24 24 29 48 60 51 23 32 29 12 23 44 63 14 3 17 83 51 34
21 23 40 27 28 33 12 22 24 23 34 34 81 34 7 8 44 91 32
12 18 51 34 13 14 26 46 20 44 43 15 65 55 62 31 22 92 11
7 18 57 39 11 16 36 30 39 40 22 8 44 55 78 52 20 32 12
10 22 32 26 10 15 33 47 53 72 15 14 108 59 59 72 12 13 80
30 42 40 35 28 18 35 62 29 27 6 11 48 22 46 55 10 8 78
38 40 25 29 48 23 55 44 27 21 6 36 23 8 23 41 20 16 40
19 19 15 25 23 30 54 56 26 20 30 71 33 9 21 41 44 38 23
16 22 32 41 34 56 53 66 35 13 55 62 21 9 37 33 20 29 19
22 27 31 31 44 53 68 57 41 18 78 82 19 6 29 20 13 30 22
42 24 19 31 39 35 45 70 67 27 57 74 40 44 54 19 8 21 14
X 0 Y 0 SQUAL : 96 ACCUM : 45 [ 3~108 ] SHUT : 239
X 0 Y 0 SQUAL : 95 ACCUM : 45 [ 3~108 ] SHUT : 239
X 0 Y 0 SQUAL : 96 ACCUM : 45 [ 3~108 ] SHUT : 239
X 0 Y 0 SQUAL : 98 ACCUM : 45 [ 3~108 ] SHUT : 239
X 0 Y 0 SQUAL : 97 ACCUM : 45 [ 3~106 ] SHUT : 239
X 0 Y 0 SQUAL : 98 ACCUM : 45 [ 3~106 ] SHUT : 239
X 0 Y 0 SQUAL : 95 ACCUM : 45 [ 3~106 ] SHUT : 239
X 0 Y 0 SQUAL : 98 ACCUM : 45 [ 3~107 ] SHUT : 239
X 0 Y 0 SQUAL : 98 ACCUM : 45 [ 3~104 ] SHUT : 239
X 0 Y 0 SQUAL : 100 ACCUM : 48 [ 4~108 ] SHUT : 254
X 0 Y 0 SQUAL : 95 ACCUM : 47 [ 4~106 ] SHUT : 254
X 0 Y 0 SQUAL : 95 ACCUM : 44 [ 3~110 ] SHUT : 247
X 0 Y 0 SQUAL : 99 ACCUM : 46 [ 3~115 ] SHUT : 224
X 2 Y -3 SQUAL : 101 ACCUM : 46 [ 2~93 ] SHUT : 236
X 3 Y -4 SQUAL : 101 ACCUM : 47 [ 2~108 ] SHUT : 239
X 4 Y 6 SQUAL : 106 ACCUM : 54 [ 4~105 ] SHUT : 257
X 0 Y 7 SQUAL : 89 ACCUM : 45 [ 2~122 ] SHUT : 232
X -8 Y -3 SQUAL : 101 ACCUM : 46 [ 2~110 ] SHUT : 239
X -3 Y -13 SQUAL : 103 ACCUM : 45 [ 2~109 ] SHUT : 222
X 4 Y -3 SQUAL : 104 ACCUM : 47 [ 1~122 ] SHUT : 239
X 4 Y 3 SQUAL : 99 ACCUM : 46 [ 1~109 ] SHUT : 223
X 1 Y 9 SQUAL : 104 ACCUM : 51 [ 3~104 ] SHUT : 244
X -5 Y 3 SQUAL : 99 ACCUM : 44 [ 2~119 ] SHUT : 235
X -1 Y -2 SQUAL : 105 ACCUM : 43 [ 2~115 ] SHUT : 239
X 0 Y -7 SQUAL : 101 ACCUM : 46 [ 2~111 ] SHUT : 209
X 7 Y -3 SQUAL : 105 ACCUM : 47 [ 1~125 ] SHUT : 224
X 4 Y 2 SQUAL : 99 ACCUM : 46 [ 3~108 ] SHUT : 235
X 1 Y 9 SQUAL : 105 ACCUM : 52 [ 2~102 ] SHUT : 273
X -2 Y 3 SQUAL : 102 ACCUM : 52 [ 2~103 ] SHUT : 271
X -3 Y -2 SQUAL : 98 ACCUM : 48 [ 1~111 ] SHUT : 239
X -2 Y -7 SQUAL : 99 ACCUM : 46 [ 2~117 ] SHUT : 209
X 11 Y -2 SQUAL : 103 ACCUM : 46 [ 3~111 ] SHUT : 242
X 6 Y 3 SQUAL : 97 ACCUM : 43 [ 4~114 ] SHUT : 224
X 0 Y 8 SQUAL : 102 ACCUM : 43 [ 3~115 ] SHUT : 259
X -5 Y 7 SQUAL : 104 ACCUM : 43 [ 2~108 ] SHUT : 239
X -5 Y -5 SQUAL : 107 ACCUM : 45 [ 2~115 ] SHUT : 237
X 0 Y -6 SQUAL : 104 ACCUM : 46 [ 2~111 ] SHUT : 233
X 4 Y -2 SQUAL : 104 ACCUM : 46 [ 2~107 ] SHUT : 239
X 6 Y 1 SQUAL : 105 ACCUM : 43 [ 1~124 ] SHUT : 224
X 4 Y 10 SQUAL : 103 ACCUM : 47 [ 4~111 ] SHUT : 267
X -2 Y 7 SQUAL : 94 ACCUM : 45 [ 2~109 ] SHUT : 239
X -6 Y 0 SQUAL : 97 ACCUM : 47 [ 2~111 ] SHUT : 238
X -3 Y -10 SQUAL : 97 ACCUM : 46 [ 2~127 ] SHUT : 245
X 3 Y -9 SQUAL : 96 ACCUM : 42 [ 1~105 ] SHUT : 240
X 8 Y -3 SQUAL : 101 ACCUM : 44 [ 2~114 ] SHUT : 239
X 5 Y 8 SQUAL : 99 ACCUM : 47 [ 2~105 ] SHUT : 271
X -4 Y 10 SQUAL : 98 ACCUM : 47 [ 3~116 ] SHUT : 229
X -5 Y 5 SQUAL : 95 ACCUM : 48 [ 3~111 ] SHUT : 239
X -6 Y -8 SQUAL : 97 ACCUM : 44 [ 2~112 ] SHUT : 224
X 0 Y -8 SQUAL : 104 ACCUM : 46 [ 1~106 ] SHUT : 239
X 8 Y -7 SQUAL : 99 ACCUM : 45 [ 3~115 ] SHUT : 224
X 13 Y 0 SQUAL : 94 ACCUM : 51 [ 4~101 ] SHUT : 247
X 3 Y 6 SQUAL : 95 ACCUM : 46 [ 4~109 ] SHUT : 226
X 0 Y 8 SQUAL : 97 ACCUM : 49 [ 5~104 ] SHUT : 282
X -3 Y 7 SQUAL : 96 ACCUM : 48 [ 2~113 ] SHUT : 273
X -3 Y 1 SQUAL : 104 ACCUM : 48 [ 2~112 ] SHUT : 252
X -5 Y -12 SQUAL : 101 ACCUM : 42 [ 2~113 ] SHUT : 270
X 1 Y -7 SQUAL : 102 ACCUM : 48 [ 2~112 ] SHUT : 254
X 9 Y -2 SQUAL : 98 ACCUM : 45 [ 4~107 ] SHUT : 212
X 6 Y 5 SQUAL : 100 ACCUM : 52 [ 5~99 ] SHUT : 276
X 2 Y 11 SQUAL : 91 ACCUM : 41 [ 2~107 ] SHUT : 265
X -2 Y 9 SQUAL : 95 ACCUM : 42 [ 4~112 ] SHUT : 267
X -3 Y 2 SQUAL : 94 ACCUM : 46 [ 4~107 ] SHUT : 262
X -9 Y -4 SQUAL : 102 ACCUM : 46 [ 1~116 ] SHUT : 224
X 0 Y -8 SQUAL : 98 ACCUM : 47 [ 1~124 ] SHUT : 232
X 4 Y -9 SQUAL : 106 ACCUM : 43 [ 2~117 ] SHUT : 223
X 5 Y 0 SQUAL : 100 ACCUM : 43 [ 2~108 ] SHUT : 223
X 6 Y 7 SQUAL : 90 ACCUM : 47 [ 2~101 ] SHUT : 267
X 2 Y 9 SQUAL : 93 ACCUM : 45 [ 4~109 ] SHUT : 253
X -1 Y 5 SQUAL : 94 ACCUM : 46 [ 3~106 ] SHUT : 261
X -2 Y 2 SQUAL : 102 ACCUM : 43 [ 2~121 ] SHUT : 251
X -2 Y -4 SQUAL : 98 ACCUM : 42 [ 2~127 ] SHUT : 237
X -1 Y -10 SQUAL : 104 ACCUM : 45 [ 1~105 ] SHUT : 224
X 6 Y -7 SQUAL : 88 ACCUM : 44 [ 2~127 ] SHUT : 239
X 7 Y 0 SQUAL : 97 ACCUM : 50 [ 3~104 ] SHUT : 270
X 5 Y 10 SQUAL : 87 ACCUM : 45 [ 4~109 ] SHUT : 275
X -3 Y 10 SQUAL : 92 ACCUM : 50 [ 5~103 ] SHUT : 261
X -3 Y 2 SQUAL : 102 ACCUM : 56 [ 5~108 ] SHUT : 295
X -4 Y -3 SQUAL : 103 ACCUM : 47 [ 1~114 ] SHUT : 253
X 0 Y -7 SQUAL : 100 ACCUM : 44 [ 2~116 ] SHUT : 209
X 3 Y -2 SQUAL : 97 ACCUM : 45 [ 2~104 ] SHUT : 223
X 4 Y 3 SQUAL : 93 ACCUM : 47 [ 4~117 ] SHUT : 273
X 2 Y 10 SQUAL : 99 ACCUM : 51 [ 5~108 ] SHUT : 261
X -6 Y 5 SQUAL : 85 ACCUM : 47 [ 3~104 ] SHUT : 210
X -3 Y 0 SQUAL : 93 ACCUM : 48 [ 3~104 ] SHUT : 207
X -6 Y -8 SQUAL : 99 ACCUM : 43 [ 2~111 ] SHUT : 249
X -2 Y -9 SQUAL : 99 ACCUM : 43 [ 2~115 ] SHUT : 241
X 0 Y -7 SQUAL : 102 ACCUM : 45 [ 1~117 ] SHUT : 226
X 5 Y -1 SQUAL : 102 ACCUM : 46 [ 2~111 ] SHUT : 239
X 8 Y 2 SQUAL : 97 ACCUM : 48 [ 2~106 ] SHUT : 258
X 1 Y 8 SQUAL : 96 ACCUM : 47 [ 4~100 ] SHUT : 256
X -7 Y 13 SQUAL : 92 ACCUM : 46 [ 2~108 ] SHUT : 189
X -4 Y 1 SQUAL : 103 ACCUM : 46 [ 1~104 ] SHUT : 241
X 0 Y -8 SQUAL : 101 ACCUM : 43 [ 3~127 ] SHUT : 251
X 5 Y -7 SQUAL : 103 ACCUM : 46 [ 2~123 ] SHUT : 208
X 1 Y 5 SQUAL : 100 ACCUM : 45 [ 3~100 ] SHUT : 239
X -4 Y -4 SQUAL : 93 ACCUM : 45 [ 3~117 ] SHUT : 261
X -5 Y -10 SQUAL : 102 ACCUM : 47 [ 2~108 ] SHUT : 252
X 0 Y 0 SQUAL : 106 ACCUM : 46 [ 2~109 ] SHUT : 252
X 0 Y 0 SQUAL : 102 ACCUM : 46 [ 2~108 ] SHUT : 252
X 0 Y 0 SQUAL : 104 ACCUM : 46 [ 2~108 ] SHUT : 252
X 0 Y 0 SQUAL : 99 ACCUM : 46 [ 3~106 ] SHUT : 252
X 0 Y 0 SQUAL : 102 ACCUM : 46 [ 2~107 ] SHUT : 252
X 0 Y 0 SQUAL : 102 ACCUM : 46 [ 3~108 ] SHUT : 252
X 0 Y 0 SQUAL : 101 ACCUM : 46 [ 2~107 ] SHUT : 252
X 0 Y 0 SQUAL : 103 ACCUM : 46 [ 3~107 ] SHUT : 252
X 0 Y 0 SQUAL : 101 ACCUM : 46 [ 2~108 ] SHUT : 252
X 0 Y 0 SQUAL : 100 ACCUM : 46 [ 3~107 ] SHUT : 252
X 0 Y 0 SQUAL : 101 ACCUM : 46 [ 2~107 ] SHUT : 252
X 0 Y 0 SQUAL : 101 ACCUM : 46 [ 2~107 ] SHUT : 252
X 0 Y 0 SQUAL : 101 ACCUM : 46 [ 3~107 ] SHUT : 252
X 0 Y 0 SQUAL : 103 ACCUM : 46 [ 3~106 ] SHUT : 252
X 0 Y 0 SQUAL : 100 ACCUM : 46 [ 2~108 ] SHUT : 252
X 0 Y 0 SQUAL : 100 ACCUM : 46 [ 3~107 ] SHUT : 252
------------------------------------------------------------------



・試験結果から分かること
各パラメタについてGrayとBlackを比較しましょう。

・ピクセルアレイの輝度
Grayのほうが明るい像がセンサに写っている事がわかります。Shut値は最も明るいピクセルに依って定められるので、Blackの方が明るい部分が際立っており目立つ、ということですね。トラッキングにどちらの色が向いているかどうかは断定しかねますが、コントラスト比の高い黒の方が向いているように直感的には思えますね。

・SQUAL
Blackの方が良い(高い)ですね。値的には普通か、それよりは良いくらいです(その他のマウスパッドと比較して)。弊センサではなぜTracking出来ないのか謎は深まりますね。

・ACUUM
ピクセルアレイと同じ傾向です。灰 / 黒の差がよく出ていますね。

・MIN、MAX
MAXは127で飽和するギリギリの100ちょいになるように調整されているのか、比較的一定値ですね。対してMINはACCUMと同様の傾向。

・SHUT
PIX_MAXは、滑走面の状態によりますが、センシング用LEDの光が滑走面に「拡散反射」ではなく「鏡面反射」した光が入射したピクセルになると思います。要するに鏡面ハイライトの部分です。なので、白→黒で思ったよりShutter値が大きくならないし、ACUUMも小さくなるのでしょうね。

・トラッキングエラーの原因の予想
なんというか、データが予想外でした。

滑走面のコーティングのせいで鏡面ハイライトが出やすくなり、Shutter値が過剰反応して、実質的に使用できるダイナミックレンジが狭くなったことで上手くTrackingできなくなる、とかでしょうか。当該パッドでSQUALとか測ってみるとちょっと分かるのかもしれません。 そもそも鏡面ハイライトが原因である可能性があるというだけで断定ではないですが。
ちょっとやっただけでは原因は判明しそうもないですね。

当該マウスパッドでもトラッキングエラーをあまり出さないマウス(G400)もあるわけでして。実に奥が深いですね。
光路を弄って鏡面ハイライトが出にくいレンズ・・・とかあったり?
G400は純正レンズですが。MCUのコードを書いた人が凄腕なのでしょうか。さすがLogi・・・

・まとめ
まとめます。

・マウスパッドの拡散反射色によってピクセルアレイの(平均)輝度は変化する。
・鏡面ハイライトのピクセルがShutter値に大きく影響していると思われる。
・各マウスのセッティングに関しては考慮することが多くて断定できない。
・全ての柄パッドにこれが当てはまるとは限らない(と思います)。
- 個人的にはゲーム用途で柄パッドはもう買わない。定量的な根拠はないですが、これからは基本的に黒い無地パッドを選びます。

以上になります。1時間で済むと思ったらMCUのコードを書き直す事になり、2時間半かかりました・・・

2014/04/22

srom2header

AVAGO製センサのハイエンド機種は、SROMと呼ばれるセンサー用のファームウェアがあります。このファームウェアは、マウスに電源が入ってMCUが所定のレジスタをWrite / Readしてスタートアップした後にMCUがアップロードしています。

Avago時代に提供されてい"た"形式のままではイマイチ使い勝手が良くありません。ちょっと探してみたら、.hファイルにコンバートするPythonスクリプトを書いている方がいらっしゃったので紹介します。

srom2header.py - robotter - Rob'Otter sources and wiki - Google Project Hosting https://code.google.com/p/robotter/source/browse/avrs/modules/hardware/srom2header.py?name=fpgas2010

車輪の再発明は面倒なので一手間省けそうですね。

2014/04/18

マウスのLoD調整

マウスを持ち上げて反応しなくなる高さはマウスの種類によって微妙に異なります。
要するにLoDと呼ばれるパラメータなのですが、今回はLoDを簡単に調整する方法を紹介します。

対象はセンシング用の発光装置がLEDであるマウスです。
レーザーセンサーの場合、レーザーの照射光がセンサーのパッケージに付いているので照射位置の差が無く、この方法は使用できません。


1.リフトオフ判定について
・Lift Detection Cutoff Algorithm(リフト判定のカットオフアルゴリズム)
Avago社はリフトオフ判定についてのExampleを用意していて、すごく大まかにいうと以下のような感じです。
 
「ピクセルアレイの平均光量÷シャッター時間 が一定値以下」かつ、「SQUAL(センサーが可視可能な特徴の数)が一定値以下」である場合には、USBで転送するXとYの移動量を0とする。

このアルゴリズムによってMCUがリフトオフ判定を行っているとすると、意図的にLoDを増減することが可能であることが分かりますね。実際の所、各社から発売されているマウスのMCUのアルゴリズムはもう少し高級かもしれませんが、大枠ではこのような感じでしょう。

2.ユーザーが意図的にLoDを調整する方法
原理的にはこんな感じの図になります。
(かなり省略した図。純正レンズでの詳細な光路の例はデータシートの"Design considerations for improving ESD Performance"に書いてあります。)

何もしていないDefaultの状態でマウスを持ち上げるとこんな感じの光路になります。
Default

ちょっとした小細工(後述)をするとこんな感じの光路になります。
Fixed

このように、センサーが監視している範囲のLED照射を無くし、意図的に暗くします。こうすることでセンサーに入射する光量を減らします。光量が減少したことにより、ピクセルアレイの平均光量とSQUALは減少、シャッター時間は増加します。これによってセンサーに「リフトオフした」と誤認させる事ができます。

単純に光量の少ないLEDを導入するのに比べると、この手法のメリットはリフトオフしてない場合の光量はあまり減らないことです。このことによって通常時のトラッキング性能のある程度の維持が期待できます。

3.光路を修正する方法
遮った光の反射がセンサーに入るのを避けるために出来るだけマット(粗い)な黒い物を遮蔽物として図のように貼付します。黒い画用紙などが良さそうです。

・貼付箇所について
塞ぐ面積が大きくなれば(レンズに近づければ)より光量は抑えられますが、トラッキング性能が低下したり、常時リフトオフの判定をされたりする可能性があるので、貼付位置をよく調整することが必要です。



2014/04/16

CS:GO の Overwatch機能

Overwatchというのは、CS:GOの機能でチートかノンチートかをユーザーのリソースを使って判定しようという試みです。

詳しくは下記リンクを参照下さい。
『Counter-Strike: Global Offensive』アップデート(2013-05-22)、コミュニティが不正等の審査を行なうOverwatchのベータテスト開始 | Negitaku.org e-Sports

今日突然通知が来たのでOverwatchを3回やりました。
通知は下図のような感じで来ます。

Distinguished Master Guardian(通称 : 警官バッジ、梅干し)になったのと、最近MMをよくプレイしているからでしょうか。
今見ると通知が来ているので、恐らく一度Overwatchの審査員に認定されるとエンドレスに来る感じですね。

1回目 :
なんだかCTが毎ラウンド3人自殺→2 on 5 の情況でプレイする初心者の方でした。Rank的にはSilverかNovaの前半でしょうかね。なぜOverwatch対象なのかよく分かりません。

2回目 :
AA、WH、マクロでバニホ。
チーターがD2のDDをG3で抜くのでCTはA-siteにしか展開できないという一方的な試合でしたね。飛ぼうがスモークを炊こうが通過しようとすると高い確率でキルしてきます。
ジャンプしながらUSPでHSを出したりとスーパープレイを連発していました。マクロでバニーホップするのって流行ってるんですかね。
敵のAWPerと睨み合った時に、スモークを炊いて「敵から」は不可視にして自分はWHでスモーク越しに撃つというプレイがWHな人以外に思いつかない斬新なプレイでちょっと面白かったです。

3回目 :
WH。隠そうという意思はみられました。ちょっとスペクトしただけなら凄く上手い人に見えなくもないですが、見る方向の思い切りの良さと大胆なリロード、通常ならあり得ないプッシュと隠そうとしている割にはバレバレだなという感じです。シフト判断が的確すぎますしね。FPS始めたばかりの初心者相手ならばれないかも・・・という程度。
人間臭い外し方をしているのでAAでは無さそうでした。(AAでは無いとしたら)AIMが良かったので「なんでそこそこ上手いのにチートするんだろうな?」という感じです。

ADNS系センサのRead / Write Operation

Avago製のADNS系センサーのレジスタへのRead Writeにちょっとつまずいたのでメモ的な感じで。
1から全部説明する時間が取れそうもないなので分かってる人向けです。要するにCypressの石を使って開発している方向けですが、そもそもそういう方は説明の必要もないのではとか思ったり。


環境 : PSoC Creator 3.0 SP7
センサ : ADNS-5090
MCU : PSoC 4 Pioneer Kit

PSoC 3 | 4 | 5 | 5LPだったら動くと思います。
PSoC CreatorのSPI ComponentはSPIMという名前にリネームして下さい。

Componentの設定は下図参照。ビットレート(1Mbps)とMode(Mode3 | CPHA=1、CPOL=1)に注意して下さい。
Avagoはデータシートにタイミングチャートだけポンと載せてModeを書かないのでちょっと混乱しました。

Write_Operation :
ターゲットのレジスタのアドレスと書き込む値を渡します。
e.g. Write_Operation(0x3A , 0x5A); //AVAGOセンサーは全部この値でRESETできます。

Read_Operation :
ターゲットのレジスタを渡すとuint8でレジスタの値を返します。
e.g. uint8 product_id = Read_Operation(0x00); //ProductID取得

SourceCode
------------------------------------------------------------------
// SPI Write Operation : detail -> Datasheet
void Write_Operation(uint8 address , uint8 value )
{

 CyDelayUs(14u);

 address = address | 0b10000000;

 SPIM_ClearRxBuffer();
 SPIM_ClearTxBuffer();
 SPIM_ClearFIFO();

 SPIM_WriteTxData(address);
 while(!(SPIM_ReadTxStatus() & SPIM_STS_TX_FIFO_EMPTY)){};

 SPIM_WriteTxData(value);
 while(!(SPIM_ReadTxStatus() & SPIM_STS_TX_FIFO_EMPTY)){};
}

// SPI Read Operation : detail -> Datasheet
uint8 Read_Operation(uint8 address)
{
 CyDelayUs(16u);

 address = address | 0b00000000;

 SPIM_ClearRxBuffer();
 SPIM_ClearTxBuffer();
 SPIM_ClearFIFO();

 SPIM_WriteTxData(address);
 while(!(SPIM_ReadTxStatus() & SPIM_STS_TX_FIFO_EMPTY)){};
 SPIM_WriteTxData(0x00);
 while(!(SPIM_ReadTxStatus() & SPIM_STS_TX_FIFO_EMPTY)){};

 while(!(SPIM_ReadRxStatus() & SPIM_STS_RX_FIFO_NOT_EMPTY )){};
 SPIM_ReadRxData();
 while(!(SPIM_ReadRxStatus() & SPIM_STS_RX_FIFO_NOT_EMPTY )){};
 return SPIM_ReadRxData();
}

------------------------------------------------------------------

Writeはあっさり実装できたのですが、ADNS-5090のRead Operationのタイミングチャートが間違っていて(文章は合っています)レジスタを読むのに結構手間取りました。他のデータシートも確認したのですが、タイミングチャートも大体あってると思います(若干怪しいのがあったような・・・)。

ポイントは、W/Rでアドレスのマスクが違うということ。これで送受信方向をセンサが判定しています。要するに、
Writeはaddress = address | 0b10000000;
Readはaddress = address | 0b00000000;
になるということですね。
加えて、Readの時はマスクしたアドレスを送った後に0x00をWriteTxしないとセンサから戻ってくるデータがReadFIFOに値が入らないということと、一回目のReadFIFOにはアドレスのTxした時のゴミデータ(0x00)が入っているので一度FIFOを読んで捨てる必要があります。

CyDelayUs(XXX)は連続でレジスタを操作しないためのディレイなのですが、センサによって値が異なるのでお手元のデータシートを参照下さい。


はじめはオシロスコープを使って実際のデータを見ながら試行錯誤していたのですが、なんだかんだデータシートを読めばオシロスコープ無しでも実装できました。


時間ができたらちゃんと記事にしたい(小声)

2014/04/13

壁との距離による有利不利

よく言いますよね。「頭隠して尻隠さず」と。
しかし、現在のシューターの場合は「尻」ではなく肩や銃が多そうです。
 
■壁との距離による有利不利
「自分と壁の距離」と「敵と壁の距離」によってキャラクターのスキンが先に見えたり見えなかったりして有利不利があります。
これはCSGOに限らず、FPS一般でポジショニングに関して基本的な事の1つです。

壁との距離による有利不利は幾何学的に示す事ができます、簡単な模式図を以下に示します。
壁を挟んで1 on 1 に挑むプレイヤーの図(右壁左壁は無視)

この図の場合、下のプレイヤーは相手を全く視認できていないのに、上のプレイヤーは下のプレイヤーの肩のスキンは視認しています。

実際の例を見てみましょう。

ロングを取られたCTのありがちなポジションとして、A siteのRamp側の箱の裏があります。


CT(A site のプレイヤー)視点


ロングから攻めてくるTからは下図のように見えます。
T(A Rampのプレイヤー)視点


どちらが撃ち合いに勝つかは言うまでもないでしょう。Tの場合、ロングの中盤から銃身が見えたりします。
このように、「自分と壁の距離」「敵と壁の距離」の差はかなり重要です。


右壁左壁を完全に無視して正面同士の撃ち合いを考えると、

自分と壁の距離  > 敵と壁の距離

を満たす場合に自分が先に敵のスキンを見ることが出来ます。

基本的にはこのルールにしたがって壁との距離を考えることになります。
逆に、あえて壁との距離を縮める必要があるシチュエーションもいくつかあります。

1. 武器の精度
武器の精度も考慮に入れる必要があります。レティクル通りに弾が飛ばない精度の低い武器を使用している場合は、その武器が「どのくらい不正確で」「目的の部位に確実にヒットさせるにはどこまで敵との距離を縮める必要があるか」を考慮する必要があります。

2. 威力制限のある武器
発射した弾体が拡散するために十分に距離を縮めないと十分なダメージを与えられないジャンルの武器です。いくら先にスキンが見えようが確実なダメージを与えられなければあまり意味はありません。
また、ナイフや火炎放射器などの当たり判定自体が短いタイプもこれにカテゴライズされるますので、リーチをよく把握して的確な距離を取る必要があります。ちなみに、CS:GOのショットガンの類は弾体が拡散するだけではなく、結構短い距離で当たり判定が消失します。
そして、多くのタイトルで、弾体の威力が飛行距離によって低下していく仕様ですので、効果的な交戦距離はある程度限定されます。

3.弾速の概念がある武器
すべての銃が即着武器(撃った瞬間にダメージを与えられる武器)であるCSGOにはありませんが(敢えて挙げるならMonotov)、特に差が出そうなのはBFシリーズのRPG等の弾速の遅い武器ですね。距離が離れると着弾前に殺される可能性がありますし、プレイヤーが行う偏差射撃の正確さも下がるので命中率自体も落ちます。

4.描画される敵スキンのサイズ
壁との距離を離しすぎた場合、先に見えることには見えますが「狙えないほどスキンが小さい」なんてことになったら元も子もないですよね。

また、網膜に映る像の変化範囲が小さいとプレイヤーの応答速度が下がりますので、ディスプレイ上には早めに描画されていてもプレイヤー自身が気が付かないというように効果薄だったりします。


■まとめ
ポジショニングの基本

・壁との距離
右壁左壁の特性(ゲームタイトルによっては存在しない)
・武器の精度
・武器の特性(リーチ、弾速)
・描画される敵スキンのサイズ

以上の点を考慮してポジションを取る必要があります。

これらをシチュエーションに応じて、各パラメータを調整しながら「最適な壁との距離」を高速に算出できる人がポジショニングが上手い人なのでしょう(自分は苦手です)。

WEBサイトを白黒反転して表示するChromeの拡張機能

白系の背景に文字が黒のWEBサイトって非常に眩しいですよね(1日に12時間ほどブラウジングする人の感想です)
特にBenQのゲーミングモニターを使っていると・・・
世の中のWEBサイトの大半がこういった眩しい感じのデザインなのは大変残念でもあります。

ではなぜこのサイトの背景が「残念な」白系(灰色)なのかというと、下のChromeエクステンションの設定をわざわざ変更しなくても黒基調になるようにしているためだったりします。

Deluminate
https://chrome.google.com/webstore/detail/deluminate/iebboopaeangfpceklajfohhbpkkfiaa


このエクステンションを使うと下図のような見た目になります。


長時間ブラウジングをされる方はぜひ検討をお勧めします。

問題はGoogle等の健全なサイトを見ていても、遠目からだとアングラなページを開いているように見えることですね。