WorldViz User Forum  

Go Back   WorldViz User Forum > Precision Position Tracker (PPT)

Reply
 
Thread Tools Rating: Thread Rating: 3 votes, 2.33 average. Display Modes
  #1  
Old 07-26-2004, 05:00 PM
tavaksai tavaksai is offline
Member
 
Join Date: Jul 2004
Posts: 22
cameras get confused by many LEDs

Hello,

I have noticed that the PPT trackers get confused by multiple LEDs (lights) when two lights get too close to each other or one gets right on top of another.
I have a total of three lights right now one for the HMD and one for each glove. If I put one hand on top of another there is a high probability that from that point the trackers think that the right hand is left and the left hand is right. I get a similar problem with a glove LED and a HMD LED when for example I try to adjust the HMD with one of my hands while the lights are being tracked.

Is it possible to maybe use different colors for the three LEDS (they are all bright blue right now) so that even if two or more cross paths trackers don't get confused? Can you program the trackers to distinguish colors or maybe brightness somehow.

Max
Reply With Quote
  #2  
Old 07-26-2004, 05:45 PM
mspusch mspusch is offline
WorldViz Team Member
 
Join Date: Feb 2003
Posts: 223
Hi Max, this is a very good question - thanks for bringing it up. The PPT tracker does not distinguish the identity of the up to 4 LEDs it tracks, just reports their position. Identity switches can occur, but usually they do not occur if the speed of the movement is below a certain threshold (which you can define yourself as one of the parameters in PPT 1.4).

Depending on the application, it is possible to distinguish very robustly which marker is which, just by using simple criteria like height (see for example a movie from a recent setup we had with Stanford University at Wired Magazine's NextFest in San Francisco: http://www.worldviz.com/products/ppt...ps/fighter.wmv ). In this fighting application, the higher marker is always the head, the lower marker the hand.

In your case, that would do the job for making sure the hands and the head do not get mixed up (for example after you bring your hand up to the HMD for adjustments). For distinguishing left and right hand, you can implement this in your Vizard script. Please contact me directly at pusch@worldviz.com about this.
Reply With Quote
  #3  
Old 07-29-2004, 12:20 AM
tobin tobin is offline
WorldViz Team Member
 
Join Date: Feb 2003
Posts: 251
Thanks for the inquiry. You are right that there are many possible methods to determine the identity of a marker. Intensity and color are not possible with our hardware. In fact, the PPT hardware does not ever inform you of the lights’ absolute identity. What we do provide is tracking of multiple points but whose identity may be swapping in a manner that you’ve experienced. We are finalizing the release of a free PPT upgrade that will greatly reduce the incidence of swapping, but even then it is still up to the application engineer to determine absolute identity. For you particular application, our suggest right now is to apply the constraint that the users hands must always be below the head. This then reduces the problem to identity which of two lights is the left and right hand. If again you apply a constraint that the left handle is always to the left of the right hand, then this determination too becomes almost trivial.

Below I show some code that solves the identification for the scenario described above. I first show a snippet which I expect replicates what I guess to be your current programming method in which you automatically engage automatic head tracking of the first of 3 lights. The problem with method is that you’re always stuck with the light always updating the head even when that light changes identity and becomes the hand.



PHP Code:
leftHand =  viz.add('thehand.wrl')     # model of a hand
rightHand viz.add('thehand.wrl')  # model of a hand

ori viz.add('intersense.dls')
pos viz.add('vizppt.dls')

# Turn on automatic head tracking / Vizard will use any sensor
# devices added prior to this call, which here means both 
# orientation and position tracking will be turned on for the 
# main viewpoint.
viz.tracker()

# Get handles to lights #2 and #3
light2 viz.add('vizppt.dls')  # Left hand
light3 viz.add('vizppt.dls')  # Right hand


def ontimer(num):
    
data handL.get()
    
leftHand.translate(data[0], data[1], data[2])

    
data handR.get()
    
rightHand.translate(data[0], data[1], data[2])


viz.callback(viz.TIMER_EVENT,ontimer)
viz.starttimer(1.01viz.FOREVER

Now, the next snippet of code shows how to manually update the head position (orientation tracking is still engaged in automatic mode but even this can be done manually if you prefer). You see a big if-then-else statement that checks for which light is highest and then which light is most left and then assigns the light’s accordingly. This should be all it takes to make the light identities 100% robust.

PHP Code:
leftHand =  viz.add('thehand.wrl')     # model of a hand
rightHand viz.add('thehand.wrl')  # model of a hand

view viz.get(viz.MAIN_VIEWPOINT)

ori viz.add('intersense.dls')
# Turn on automatic head tracking but now only for orientation
# tracking since the position sensor is added after the
# viz.tracker() call
viz.tracker()

# Get handles to all lights 
light1 viz.add('vizppt.dls')  # Head
light2 viz.add('vizppt.dls')  # Left hand
light3 viz.add('vizppt.dls')  # Right hand

# Don't turn on automatic head tracking for position

data = []
def ontimer(num):
    
    
data1 light1.get()
    
data2 light2.get()
    
data3 light3.get()
    
    
# Head is light with highest Y value. Go through the three
    # light values and compare 1 & 2, and then the hightest of that 
    # pair with 3.  In each case, take the two that aren't the head
    # and check to see which is furthest left in the coordinate 
    # system (i.e., furthest in -X direction) and call this leftHand. 
    # The remaining light must be the right hand.
    
if data1[1] > data2[1]:
        if 
data1[1] > data3[1]:
            
headPos data1
            
            
if data2[0] < data3[0]:
                
leftPos data2
                rightPos 
data3    
            
else:
                
leftPos data3
                rightPos 
data2
                
        
else:
            
headPos data3
            
if data1[0] < data2[0]:
                
leftPos data1
                rightPos 
data2
            
else:
                
leftPos data2
                rightPos 
data1
                
    
else:
        if 
data2[1] > data3[1]:
            
headPos data2
            
if data1[0] < data3[0]:
                
leftPos data1
                rightPos 
data3
            
else:
                
leftPos data3
                rightPos 
data1
            
        
else:
            
headPos data3
            
if data1[0] < data2[0]:
                
leftPos data1
                rightPos 
data2
            
else:
                
leftPos data2
                rightPos 
data1
                
    
# Manually update the position of the main viewpoint (orientation 
    # is being handled automatically.
    
view.translate(headPos[0], headPos[1], headPos[2])
    
    
# Update position of left and right hand
    
leftHand.translate(leftPos[0], leftPos[1], leftPos[2])
    
rightHand.translate(rightPos[0], rightPos[1], rightPos[2])


viz.callback(viz.TIMER_EVENT,ontimer)
viz.starttimer(1.01viz.FOREVER

Let me know if this solution makes sense and if you find it acceptable.
Reply With Quote
  #4  
Old 08-01-2004, 05:46 PM
tavaksai tavaksai is offline
Member
 
Join Date: Jul 2004
Posts: 22
method works

Hi guys,

I implemented the method you came up with
and it worked pretty well.
The only minor issue is that if the user violates
the constraints, there will be some "weirdness"
going on in the virtual environment. For instance,
if you DO happen to raise a hand above the head,
the view position will temporarily be controlled by
the hand. But, it works ok.

Thanks,
Max
Reply With Quote
  #5  
Old 10-06-2004, 05:44 PM
vadrian vadrian is offline
Member
 
Join Date: Sep 2004
Posts: 32
Lightbulb

Just a thought... (from a not-so-experienced programmer)

couldn't one take care of the "wierd jumps" by seeing if there is a switch in lights and adjusting where your PPT data goes depending on which lights crossed over? That is, once we determined that the left hand went above the head, we store that info somewhere and essentially use the "head" light (highest light in PPT) for the left hand?

I think this could be accomplished by storing the last point(s) a light was at, and when the PPT system thinks the lights suddenly "jumped" to different places, you compare the "history" and adjust properly.


I'm not sure how one would code this, but it seems like its computationally possible and would not be too cpu expensive.

extremely sudo code:

# so before any objects are moved/rotated
if (hand and head jump farther than threashhold value)
compute distance between handL.prev() and head.pos()
if distance < jump distance
#hand now higher than head
swap head and hand inputs

the only problem with this is when the hand is close to the head in all coords (x,y,z). then the code might err when the expected distance >= to the jump distance.

*i have no idea if this makes sense or is full of mistakes
Reply With Quote
  #6  
Old 10-20-2004, 06:29 PM
mspusch mspusch is offline
WorldViz Team Member
 
Join Date: Feb 2003
Posts: 223
Hi, this is a good concept overall, and in fact this is what we are doing in some Vizard applications, where it can be very easily implemented: just define a threshold for 'position jump' and check for proximity with all LED positions.

We are currently working on an update of the PPT software which is significantly more robust than the old version in this respect. We expect it to be available before the end of this year.

Thanks again for your suggestions which make a lot of sense and are highly appreciated.

Have fun!

Matthias
Reply With Quote
  #7  
Old 05-15-2007, 10:04 PM
TunTun TunTun is offline
Member
 
Join Date: May 2007
Posts: 16
follow up

Hello,

I'm wondering whether the update of the PPT software that mspusch mentioned is available now? And from which version we can deal with identification of multiple LEDs?

Thanks a lot.
Reply With Quote
  #8  
Old 05-18-2007, 10:12 AM
mspusch mspusch is offline
WorldViz Team Member
 
Join Date: Feb 2003
Posts: 223
the update mentioned in my post from summer 2004 came out in Oct. 2004. there have been several other updates since. the PPT is now available as a version with 2 cams, one with 4 cams and one with 8 cams.

since March 2007, there is also a new system available called PPT-H which trackes with 175Hz and is even more stable with holding onto individual markers. this system can chain up to 32 cams and track up to 35 markers.

the PPT is now reasonably good at following markers around, i.e. holding on to a marker's ID.

however, to make sure markers are distinguished reliably, it is necessary to introduce some constraints (i.e. marker configurations). We usually use marker distance for this, as it is the most simple way of doing it.
Reply With Quote
  #9  
Old 05-18-2007, 01:08 PM
TunTun TunTun is offline
Member
 
Join Date: May 2007
Posts: 16
Hi, mspusch

Our PPT is Version 2.17 with 4 cams, but I'm not sure how old it is. Do you think it support multiple markers well?

Could you please post an example of how to set marker configurations? And I don't know what do you mean "use marker distance".

Thanks for help.
Reply With Quote
  #10  
Old 05-19-2007, 05:52 PM
mspusch mspusch is offline
WorldViz Team Member
 
Join Date: Feb 2003
Posts: 223
version 2.17 is a recent version and you should be able to track up to 8 LEDs. in the interface on the left side, simply change the number of LEDs the PPT searches for from 1 to 8, depending on how many you need.

the positions of the LEDs that the PPT finds will be sent out over serial/VRPN or your own interface if you interface directly over the PPT API.

now, in whatever program you use, you can take the x,y,z coordinates that the PPT delivers and do with it whatever you want.

if you use Vizard, you can use a logic just like the one that's on top of this thread to extrapolate information.

if you work with Vizard and need a code example of how to use a certain distance between markers to extrapolate their identities, please post this request on the Vizard part of this forum.
Reply With Quote
Reply

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 09:06 PM.


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