PSVR Калибровка

Калибровка проводится для компенсации «ухода» гироскопов шлема.

Результат калибровки: скорости смещения гироскопов по 3 осям: вертикальной (движение вправо-влево), боковая (вверх-вниз) и поворот самого шлема (наклон вправо-влево).

Скорости записываются в конфигурационный файл (обычно ~/.config/psvrplayer.cfg) в поля right, top, clock. Единицы измерения: в миллиардных долях градуса за миллисекунду (или микроградус/с).

Сама калибровка представляет собой замер ухода показаний за интервал времени (5-10-20 и т.д. секунд).

Точность калибровки:

Для определения точностных характеристик проводился замер разброса 10 калибровок: проводится калибровка, вычитываются найденные скорости. Так делается 10 раз и смотрится разброс этих скоростей.

Примерные замеры разброса (для калибровок 10-15-20-25-30 секунд):

10 s: Delta: right / top / clock 22220 12252 4909
15 s: Delta: right / top / clock 16784 17344 5543
20 s: Delta: right / top / clock 15039 7090 3940
25 s: Delta: right / top / clock 9870 5038 5551
30 s: Delta: right / top / clock 7295 7061 3681
30 s: Delta: right / top / clock 6570 6514 3580

Видно, что сначала разброс падает быстро, потом на границе 25-30 секунд разброс меняется не сильно.

При разбросе 7300 (движение вправо-влево) оценочный уход датчиков будет окло 13 градусов за 30 минут. Это является вполне приемлимым результатом.

Скрипт по прогону 10 калибровок на питоне:

# Calibration statistics

import configparser
import subprocess

# appfile = "/home/ekislov/programm/psvr-player/build-001/psvrplayer/psvrplayer"
appfile = "psvrplayer"
configfile = "/home/ekislov/.config/psvrplayer.cfg"

def ini_value_to_int(v):
    if len(v) < 2:
        return 0
    if v[0] == '"':
        v = v[1:]
    if v[-1] == '"':
        v = v[:-1]
    return int(v)


# Overvalue bounds
minb = 1000000000
maxb = -1000000000

# Minimal and maximal values of sensors velocity. Units: microdegrees per second
min_right = minb
max_right = maxb
min_top = minb
max_top = maxb
min_clock = minb
max_clock = maxb


for i in range (10):
    # Run calibration
    rs = subprocess.run(["psvrplayer", "--calibration"], input = b"\n")
    res = rs.returncode
    if res != 0:
        print("psvrplayer returns error")
        exit
    # Read calibration values
    config = configparser.ConfigParser()
    config.read(configfile)
    r = ini_value_to_int(config["calibration"]["right"])
    t = ini_value_to_int(config["calibration"]["top"])
    c = ini_value_to_int(config["calibration"]["clock"])
    # right velocity
    if r < min_right:
        min_right = r
    if r > max_right:
        max_right = r
    # top velocity
    if t < min_top:
        min_top = t
    if t > max_top:
        max_top = t
    # clockwork velocity
    if c < min_clock:
        min_clock = c
    if c > max_clock:
        max_clock = c

    print("****************************")
    print("Delta: right / top / clock ", max_right - min_right, max_top - min_top, max_clock - min_clock)