Informal description of the UT Austin Villa state tracking method as of 2018, courtesy of Jake Menashe. Although we used to use a particle filter, we've been using an Unscented Kalman Filter since before 2012. The high-level organization hasn't changed much since then, but the implementation has been updated quite a bit to process data more efficiently and produce more accurate state estimations. Right now, the player's state vector consists of x/y position, orientation, ball x/y position and x/y velocity. So this is a 7-dimensional vector for the player's/ball's global state. What we do is best described as a multi-modal UKF. We maintain a handful of player models, and at each timestep we process the entire set of observations once for each model, i.e. each model is updated as if it were the "true" model when the observations were made. The model with the greatest likelihood is then selected as the true model, and that is used by the rest of the code as our best estimate of the player's state. We also enforce some hysteresis to avoid chatter.  The number of models changes based on the observations. If there is just one model and all of the observations are likely given the current model, then we continue to stick with one model. If we start getting too many "bad" observations that are unlikely given the model, then we may create copies of the model with altered position/orientation to attempt to make sense of the observations. There are varying heuristics in place that decide when and how to spawn new models. Every time an observation is considered unlikely for a given model, that model's confidence score is degraded. Eventually, incorrect models either degrade away completely (we throw them out when their confidence is too low), or merge with the true model (we merge models together when their state vectors are within a given distance of one another). We also use a secondary UKF that only tracks the ball's relative position and velocity. This UKF is only used for lining up shots, kicking, etc. - situations where relative positioning must be as precise as possible. As of 2016 we weren't doing any opponent tracking because we had no reliable way of detecting opponents after the jersey changes. Back when the jerseys were blue/pink we used third UKF system for that purpose, which was designed very similarly to the player-state UKF.