Мы пытаемся сгенерировать 2D срезы мозга из 3D модели мозга, используя VR-контроллер (HTC Vive).Мы хотим контролировать ориентацию мозга, используя вращение контроллера, и иметь возможность генерировать срезы во всех возможных направлениях, перемещая контроллер.Наш текущий код способен извлекать срезы, но их прохождение и изменение ориентации мозга затруднены, потому что элементы управления нестабильны.Ломтики случайным образом переворачиваются при небольшом изменении положения контроллера.Код не считывает срез в правильной ориентации позы контроллера.Это должно быть исправлено.
Мы написали код на python и извлекаем фрагмент мозга, используя IDL, соединенный с python.Чтобы отследить движение контроллера и связать его с трехмерной моделью мозга, мы используем библиотеку python triad_openvr.Чтобы получить координаты и поворот контроллера, мы используем get_euler_pose () [].Мы устанавливаем начальные координаты и вращение на 0, чтобы контроллер устанавливал начало координат на место, где он был изначально сохранен.
Обнаружено, что код работает со следующими ограничениями
- Код не создает желаемое окно все время.Насколько я понимаю, это происходит, когда код IDL не может найти срез в заданной позиции контроллера.
Код не считывает срез в правильной ориентации позы контроллера,Это необходимо исправить.
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)
Ломтики выглядят, как и ожидалось, большую часть времени.Это обход, который вызывает проблему.Движение контроллера заставляет срезы вести себя по-разному в разы.Срезы имеют тенденцию переворачиваться на определенное вращение контроллера, и движение не является плавным.Стало трудно синхронизировать оси мозга с осями реальной жизни.