PDA

View Full Version : updating positional data


Saz
01-05-2009, 03:38 AM
Hi,

hope you all had a good Christmas and New Year. I am trying to get the joystick position to update on the screen, however instead of updating it merely writes over the previous value resulting in a huge jumbled mess. Would I need to define this process as a separate function?


file = open( 'speed_.txt' + str(subject),'w' )
#Open file in path
#file = open( path + 'speed.txt', 'w' )

def mytimer (num):
joy_pos = str(joy.getPosition())
#speed = joy_pos*[0.0,5.0,0.0]
out = str(joy_pos + '\n')
file.write(out)
file.flush()
print out

#Add text to the screen.
speed = viz.addText(joy_pos, viz.SCREEN)
speed.setPosition(.05, .9 )
speed.fontSize (30)

speed.message(str(joy_pos))

viz.callback( viz.TIMER_EVENT, mytimer )
viz.starttimer( 0, 0.25, viz.FOREVER )


Also as its the joystick position it comes up as an [x, y, z] co-ordinate system whereas I'm only really interested in the y-axis, is there a way around this? Its coded as follows:


def UpdateJoystick():
#Get the joystick position
x,y,z = joy.getPosition()
#Get the twist of the joystick
twist = joy.getTwist()
#Move the viewpoint forward/backward based on y-axis value
if abs(y) > 0.001: #Make sure value is above a certain threshold
viz.MainView.move(0,0,-y*MOVE_SPEED,viz.BODY_ORI)
#Move the viewpoint left/right based on x-axis value
if abs(x) > 0.001: #Make sure value is above a certain threshold
viz.MainView.move(x*0.1,0,0,viz.BODY_ORI)
#Turn the viewpoint left/right based on twist value
if abs(twist) > 0.001: #Make sure value is above a certain threshold
viz.MainView.rotate(0,1,0,twist,viz.BODY_ORI,viz.R ELATIVE_WORLD)


The y position would also need to be multiplied by a value in order to make sense but I'm guessing that's a simple math function?
Any help - as usual will be greatly appreciated!!!

Jeff
01-05-2009, 09:02 AM
for your first question you could just add a textbox to your screen instead of text
speed = viz.addTextbox(parent = viz.SCREEN)
add the textbox and set its position outside of your timer function and then change the message in the timer function.

I not sure if I understand your second question. If you only want to move in the y direction then you could just remove the code that updates the x position and turns the viewpoint from UpdateJoystick()

def UpdateJoystick():
#Get the joystick position
x,y,z = joy.getPosition()

#Move the viewpoint forward/backward based on y-axis value
if abs(y) > 0.2: #Make sure value is above a certain threshold
viz.MainView.move(0,0,-y*0.1,viz.BODY_ORI)

you can multiply the y value by something else if you want it to update by a different amount.

Saz
01-08-2009, 01:44 AM
Hi Jeff,

thanks for that, the joystick position is updating fine now once I took the textbox out of the timer loop. No, for the second part the code for the joystick position is working fine but what I am getting up on the screen at the moment is obviously the raw data of the joystick output - which is pretty meaningless to the observer, additionally it appears in the co ordinate system format of [0.0 0.0 0.0], wheareas I'm only really interested in the y co ordinate.

Therefore I'm trying to multiply the raw data of the joystick that's already acquired so that it appears in a meaningful context on the screen, say as mph or kph - which is what I'm having difficulty with

Jeff
01-08-2009, 10:00 AM
this should update the speed in just the y direction every time the timer function is called

#add textbox and set position on screen
text_speed = viz.addTextbox(parent = viz.SCREEN)
text_speed.setPosition(.15, .9 )
text_speed.fontSize (30)

old_posY = 0
def showSpeed():

global old_posY

current_pos = viz.MainView.getPosition()
current_posY = current_pos[1]
distance = abs(current_posY - old_posY)

#get speed in meters/sec
speed = distance/viz.elapsed()
#get speed in km/hour
speed = speed/1000*3600

old_posY = current_posY

#enter speed in textbox rounded to 1 digit after decimal
text_speed.message(str(round(speed,1)) + 'km/hour')

vizact.ontimer(.25, showSpeed)

Saz
01-09-2009, 03:59 AM
Hi Jeff,

thanks for that - unfortunately it doesn't update and I constantly get 0.0km/hr on the screen - even though its moving along the road. I tried inserting joy.getPosition() in place of viz.MainView.getPosition() to see whether the code in principle functions and whilst that does produce a change in km/hr when either accelerating or deccelerating, because this piece of code is looking at a difference between outputs - when the joystick is held constant; there is no difference and so 0.0km/hr appears on the screen

Jeff
01-09-2009, 09:17 AM
That code should give you 0 km/hour if you are not moving along the y-axis which is the height. I think you may be wanting to get the speed along the z-axis. If that's the case then just dind the difference in z coordinates rather than the y coordinates.

Jeff
01-09-2009, 09:29 AM
just to clarify, in the joystick navigation code, when you move the joystick on its y-axis that moves Vizard's viewpoint forward or backward which is Vizard's z axis. So to get the current z position just do

current_posZ = current_pos[2]

Saz
01-12-2009, 02:20 AM
you're a star Jeff - thank you!! Is there any reason that I'm getting a continual drift of the viewpoint to the right though, even if I'm not using the joystick?

Saz
01-12-2009, 04:23 AM
Don't worry Jeff - its sorted! Cheers for your help!