WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   Avatar mimicking after (https://forum.worldviz.com/showthread.php?t=4210)

Frank Verberne 04-19-2012 05:28 AM

Avatar mimicking after
 
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
Code:

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:
Code:

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())



All times are GMT -7. The time now is 10:51 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC