![]() |
#7
|
|||
|
|||
Hello Jeff,
thanks for your reply and the time you invest in helping me. As far as I can tell, there are no framerate drops during the scene. I am using the info-panel to assess framerate and it looks constant. Also, the problem is persistent in every run and only if I am moving via keyboard or joystick. If there is a problem with dropping framerates, shouldn't it be also while moving automatically? Also, we tested it on 3 quite capable machines - all showed the error. I have stripped down the code a little and uploaded it here: https://www.dropbox.com/s/d3b4rpfw9u...minExample.rar Also, I will post my code here. But without the example scene, it won't reproduce the error. Please enable the collision, run the trial with my arena supplied in the .rar. Afterwards, you should see that it takes exactly 10 seconds to move 100m automatically. If I do it manually with the keyboard, it takes me 10.453 seconds. Here are the relevant lines from my log-file: Automatic movement: 13:57:31:410,0:00:10.015,[0.000,1.800,99.913],[-0.000] 13:57:31:425,0:00:10.030,[0.000,1.800,100.000],[-0.000] ---> 10.015 seconds for 100m Keyboard movement: 13:57:43:890,0:00:10.468,[0.000,1.820,99.997],[-0.000] 13:57:43:905,0:00:10.483,[0.000,1.820,100.156],[-0.000] ---> 10.47 seconds for 100m If I disable collision OR run the program with a standard scene (e.g. ground_grass.osgb), the time need will both times be 10seconds. Finally the code: Code:
# ---------------------------------------------------------- # Preamble # # # # # # # ---------------------------------------------------------- # -------- # Librarys # -------- from __future__ import division import viz import vizact import vizinput import vizshape import vizproximity import vizdlg import viztask import random import vizjoy import os import datetime import math # ------- # Options # ------- fs = 50 joyMovSpeed = 10 autoMovSpeed = 10 buttonMap = {'left': '1', 'right': '2', 'forward': '3', 'backward':'4'} # button map startPoint = 0 desiredEndpoint = 100 view = viz.MainView view.collision(viz.ON) arena = viz.addChild('arena_dm250_urban.osgb') #court = viz.addChild('ground_grass.osgb') #court.setScale([5,1,5]) # --------------------------- # Joystick & Movement related # --------------------------- joystick = vizjoy.add() # add joystick variable def updateMovement(inputDevice = 'joystick'): if inputDevice == 'joystick': # subject movement related [jx,jy,jz] = joystick.getPosition() # continously get joystick axis position if math.fabs(jy) > joyDeadzone: if jy > 0: # backward view.move(0,0,viz.elapsed()*-joyMovSpeed) # viz. elapsed() allows movement, as long as joystick axes are moved if jy < 0: # forward view.move(0,0,viz.elapsed()*joyMovSpeed) if math.fabs(jx) > joyDeadzone: # rotation if jx < 0: # left view.setEuler([joyRotSpeed*jx*viz.elapsed(),0,0],viz.HEAD_ORI,viz.REL_PARENT) if jx > 0: # right view.setEuler([joyRotSpeed*jx*viz.elapsed(),0,0],viz.HEAD_ORI,viz.REL_PARENT) if inputDevice == 'keyboard': if viz.key.isDown(buttonMap['left']): view.setEuler([-joyRotSpeed*viz.elapsed(),0,0],viz.HEAD_ORI,viz.REL_PARENT) if viz.key.isDown(buttonMap['right']): view.setEuler([joyRotSpeed*viz.elapsed(),0,0],viz.HEAD_ORI,viz.REL_PARENT) if viz.key.isDown(buttonMap['forward']): view.move(0,0,viz.elapsed()*joyMovSpeed) if viz.key.isDown(buttonMap['backward']): view.move(0,0,viz.elapsed()*-joyMovSpeed) # ------ # Timing # ------ class myTimer(): def __init__(self,number,dateFormat,timeFormat): self.nr = number self.dateFormat = dateFormat self.timeFormat = timeFormat # timer methods to calculate time differences def start(self): self.startTime = datetime.datetime.now() def end(self): self.endTime = datetime.datetime.now() def deltaNow(self): self.curDeltaNowTime = datetime.datetime.now() - self.startTime self.curDeltaNowTime= str(self.curDeltaNowTime)[:-3] return self.curDeltaNowTime # timer methods to get current date or time def date(self): self.curDateTime = datetime.datetime.now() self.curDate = self.curDateTime.strftime(self.dateFormat) return self.curDate def time(self): self.curDateTime = datetime.datetime.now() self.curTime = self.curDateTime.strftime(self.timeFormat) if self.timeFormat == '%H:%M:%S:%f': self.curTime = self.curTime[:-3] return self.curTime # ----------------- # Globals & Statics # ----------------- # timer classes logTime = myTimer(1,'%d.%m.%Y','%H:%M:%S:%f') # init log timer instance # open output log file file = open('movementTest.txt', 'w') # open log file file.write('Timestamp,Time since restart of timer,Position [x,y,y],View angle [Euler]\n') # ------------------- # Procedual functions # ------------------- def autoMovement(): view.setEuler(0,0,0) view.setPosition(0,1.8,startPoint) logTime.start() logTimer = vizact.ontimer((1/fs),posLogger) # start the logging of position and view angle at frequency specified by fs yield viztask.waitTime(1) logTime.start() yield viztask.addAction(view, vizact.moveTo([0,1.8,desiredEndpoint],speed = autoMovSpeed)) yield viztask.waitTime(0.5) writeLog('Auto movement ended') viztask.schedule(manualMovement) def manualMovement(): global movementTimer # set start position and view angle view.setEuler(0,0,0) view.setPosition(0,1.8,startPoint) logTime.start() yield viztask.waitTime(1) #yield viztask.waitAny([waitJoyAxis]) yield viztask.waitKeyDown('3') movementTimer = vizact.ontimer(0,updateMovement,inputDevice = 'keyboard') logTime.start() # ----------------------------------------- # Resource Functions & Classes during trial # ----------------------------------------- # logging position and view angle def posLogger(): global movementTimer timestamp = logTime.time() timeDelta = logTime.deltaNow() curAngle = view.getEuler() curPos = view.getPosition() curJoyPos = joystick.getPosition() file.write('%s,%s,[%0.3f,%0.3f,%0.3f],[%0.3f]\n' % (timestamp,timeDelta,curPos[0],curPos[1],curPos[2],curAngle[0])) if curPos[2] > desiredEndpoint: # halt movement movementTimer.remove() def writeLog(text): file.write(logTime.time() + ',EVENT: ' + text + '\n') print(text) # ----- # Start # ----- viz.mouse.setOverride(viz.ON) viz.window.setSize(1280, 960) viz.go() viz.window.setFrameRate(viz.NICE) viztask.schedule(autoMovement()) |
|
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Temporal delay on movement | westbyb | Vizard | 5 | 05-23-2013 06:06 PM |
Varying rotation speed with spinTo | mape2k | Vizard | 2 | 03-22-2013 07:48 AM |
Object + InteriaCube + Viewport problem | Gekitatsu | Vizard | 1 | 02-22-2012 10:55 AM |
random speed and associated coding | Saz | Vizard | 1 | 05-20-2010 04:03 AM |
Calculating Speed with sensor | durf | Vizard | 1 | 03-13-2009 10:25 AM |