PDA

View Full Version : Avatar mimicking after


Frank Verberne
04-19-2012, 05:28 AM
Hi all,

I'm trying to make an avatar mimic the head movements of a participant with a delay of 4 seconds. In the code below, I'm writing the euler information of the viz.MainView to a file (1.log) and after 4 seconds, I'm trying to read from the beginning of that same file (thus creating a delay of 4 seconds). But after 4 seconds, I get an error message (IOError: [Errno 0] Error) and I think that's because I'm reading from the same file I'm writing to. I understand this could be problematic, but I don't know an other approach for my problem. Any help is greatly appreciated!

Regards,
Frank
import viz
import vizact
import viztask
import time

viz.go()

#CONSTANTS
PATH = '.\\'
PARTICIPANT = 1
TRACKING_DATA = open(PATH+str(PARTICIPANT)+".log", 'w+')
TIMER_SPEED = 0.1
SEC_DELAY = 4

def logTrackingData():
orientation = viz.MainView.getEuler()
data = str(orientation[0])+' '+str(orientation[1])+' '+str(orientation[2])+'\n'
TRACKING_DATA.write(data)

def readTrackingData():
rotation = TRACKING_DATA.readline()
print rotation

def readWithDelay():
#Wait 4 seconds
yield viztask.waitTime(SEC_DELAY)
vizact.ontimer(TIMER_SPEED, readTrackingData)

vizact.ontimer(TIMER_SPEED, logTrackingData)
viztask.schedule(readWithDelay())

Jeff
04-19-2012, 07:03 PM
Would it work for you to save the data in a list and read it from there?

Frank Verberne
04-20-2012, 01:32 AM
Works like a charm, thanks Jeff! My solution consists of using three lists (one for yaw, pitch, and roll) which I append the current yaw, pitch, and roll to and start reading from the beginning after waiting 4 seconds. My only 'concern' now is that each list is growing with 10 floats/second, so they will get pretty big after a few minutes (my experiment will last around 10 to 15 minutes of mimicking I guess). Of course I could delete the information from the list after it has been read, but will the size of the lists pose any problem at all?

Frank Verberne
04-20-2012, 06:17 AM
For anyone with the same problem, here's my solution I eventually used:
import viz
import vizact
import viztask

viz.go()

#CONSTANTS
TIMER_SPEED = 0.1
SEC_DELAY = 4

yaw_list = []
pitch_list = []
roll_list = []

def logTrackingData():
orientation = viz.MainView.getEuler()
yaw_list.append(orientation[0])
pitch_list.append(orientation[1])
roll_list.append(orientation[2])

def readTrackingData():
global yaw, pitch, roll
#Read information
yaw = yaw_list[0]
pitch = pitch_list[0]
roll = roll_list[0]
#Delete information already read
yaw_list.pop(0)
pitch_list.pop(0)
roll_list.pop(0)

def readWithDelay():
#Wait 4 seconds
yield viztask.waitTime(SEC_DELAY)
vizact.ontimer(TIMER_SPEED, readTrackingData)

vizact.ontimer(TIMER_SPEED, logTrackingData)
viztask.schedule(readWithDelay())