Калибровка проводится для компенсации «ухода» гироскопов шлема.
Результат калибровки: скорости смещения гироскопов по 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)