Как управлять нестационарным вращением и нежелательными переворотами срезов мозга, генерируемых с помощью IDL, соединенных с питоном с помощью контроллера HTC Vive? - PullRequest
0 голосов
/ 21 июня 2019

Мы пытаемся сгенерировать 2D срезы мозга из 3D модели мозга, используя VR-контроллер (HTC Vive).Мы хотим контролировать ориентацию мозга, используя вращение контроллера, и иметь возможность генерировать срезы во всех возможных направлениях, перемещая контроллер.Наш текущий код способен извлекать срезы, но их прохождение и изменение ориентации мозга затруднены, потому что элементы управления нестабильны.Ломтики случайным образом переворачиваются при небольшом изменении положения контроллера.Код не считывает срез в правильной ориентации позы контроллера.Это должно быть исправлено.

Мы написали код на python и извлекаем фрагмент мозга, используя IDL, соединенный с python.Чтобы отследить движение контроллера и связать его с трехмерной моделью мозга, мы используем библиотеку python triad_openvr.Чтобы получить координаты и поворот контроллера, мы используем get_euler_pose () [].Мы устанавливаем начальные координаты и вращение на 0, чтобы контроллер устанавливал начало координат на место, где он был изначально сохранен.

Обнаружено, что код работает со следующими ограничениями

  1. Код не создает желаемое окно все время.Насколько я понимаю, это происходит, когда код IDL не может найти срез в заданной позиции контроллера.
  2. Код не считывает срез в правильной ориентации позы контроллера,Это необходимо исправить.

    import triad_openvr время импорта import sys из idlpy import *

    x = 0,0 y = 0,0 z = 0,0 xrot = 0,0 yrot = 0,0 zrot = 0.0 sign = ""v = triad_openvr.triad_openvr () v.print_discovered_objects ()

Получение начальной позы контроллера, чтобы все можно было сбросить до этой позы как источника

initX=100*v.devices["controller_1"].get_pose_euler()[0]
initY=100*v.devices["controller_1"].get_pose_euler()[1]
initZ=100*v.devices["controller_1"].get_pose_euler()[2]
initXRot=v.devices["controller_1"].get_pose_euler()[3]
initYRot=v.devices["controller_1"].get_pose_euler()[4]
initZRot=v.devices["controller_1"].get_pose_euler()[5]


if len(sys.argv) == 1:
    interval = 1/10.0 # originally 1/250
    print("1")
elif len(sys.argv) == 2:
    interval = 1/float(sys.argv[0])
    print("2")
else:
    print("Invalid number of arguments")
    interval = False
print(interval)
if interval:
    IDL.run("file = 'C:\Program Files\Exelis\IDL85\examples\data\head.dat'")
    IDL.run("vol = READ_BINARY(file, DATA_DIMS = [80, 100, 57])")
    IDL.run("LOADCT, 5")
    IDL.run("DEVICE, DECOMPOSED = 0, RETAIN = 2")
    while(True):
        start = time.time()
        x=100*v.devices["controller_1"].get_pose_euler()[0]
        y=100*v.devices["controller_1"].get_pose_euler()[1]
        z=100*v.devices["controller_1"].get_pose_euler()[2]
        newx = x - initX + 40
        newy = y - initY + 50
        newz = z - initZ + 28
        xrot=v.devices["controller_1"].get_pose_euler()[3]
        yrot=v.devices["controller_1"].get_pose_euler()[4]
        zrot=v.devices["controller_1"].get_pose_euler()[5]

        newXRot = xrot - initXRot 
        newYRot = yrot - initYRot
        newZRot = zrot - initZRot


        commandToRun = "slice = EXTRACT_SLICE(vol, 110, 110,"+ str(newx) + "," + str(newy)+","+str(newz)+","+ str(newXRot) + "," +str(newYRot) + "," + str(newZRot) + ", OUT_VAL=0B)"

        #print(str(newXRot) + "," + str(newYRot) + "," + str(newZRot))

        IDL.run(commandToRun)
        IDL.run("TVSCL, CONGRID(slice, 800, 800,/INTERP)")
        sleep_time = interval-(time.time()-start)
        sleep_time = interval-(time.time()-start)
        if sleep_time>0:
            time.sleep(sleep_time)

Ломтики выглядят, как и ожидалось, большую часть времени.Это обход, который вызывает проблему.Движение контроллера заставляет срезы вести себя по-разному в разы.Срезы имеют тенденцию переворачиваться на определенное вращение контроллера, и движение не является плавным.Стало трудно синхронизировать оси мозга с осями реальной жизни.

...