Steering is unusable in Crit Cade

The TL;DR is that steering is too slow and it makes hitting boosts and avoiding hazards very difficult and very frustrating in the context of Repack Rush and Crit Cade.

Note: This has been adapted from a support email I sent, although the analysis of race results is new.

This has been a longterm issue with Repack Rush for me, but it was only when I discovered that Zwift Games Stage 6b was a boost and hazards race that this became important enough for me to bring up. The game response is so slow that (unlike most electronics that I use or design) you can actually kind of see what’s happening instead of just inferring that there’s lag somewhere in the system from perceived response not quite lining up with when you think you applied an input. In this case, I think there’s probably about 0.5 to 0.75 s of straight up command delay plus probably a 1 Hz to 0.6 Hz second order filter on the input. Coupled with large-amplitude rate limits in how fast I can move my arms, the net effect is that I get rider induced oscillation if I try to close the loop with much more than about 0.5 Hz of bandwidth. I was finding about 0.2 to 0.25 Hz bandwidth on the feedback kind of gave the best results. However, because of the architectural decision to keep superimposing the feedforward steering to stay on course, the rider is often needing to fight signals with dominant frequency content on the order of 1 Hz which just doesn’t work with a 0.2 Hz control loop. Further, there are situations where you physically don’t have enough time to avoid or hit bonuses after rounding a corner because inputs literally don’t start applying until after you’ve hit or missed the hitbox. There were many instances in the Stage 6b race where I saw something that I needed to do, made a quick input, didn’t actually get the response I needed, hit of missed the thing I was trying to miss or hit, and then went through several cycles of oscillation before I managed to detune myself back down to a stable set of gains. Needless to say, this was immensely frustrating and I found myself yelling at the computer several times.

I’ve typically heard humans being quoted as having about 2 Hz of bandwidth. I don’t actually remember if there’s typically one dominant pole, two dominant poles, or if the behavior is best modeled as a pure delay. It probably depends on the situation and is a blend of factors. However, if we just take a first order system as an example, 2 Hz corresponds to a time constant of about 80 ms. In order for the software to be mostly out of the way, it needs to be responding significantly faster than that, e.g. about 20 ms or about 1 frame at 50 to 60 Hz. This is a bike racing game - not Super Smash Bros or a modern first person shooter where players are expecting to be able nail a 180 headshot before hitting the ground - so you can probably sacrifice a bit on the latency requirement, but you should definitely be aiming for less than 50 ms and it absolutely needs to be below 200 ms.

As I have already mentioned, I was extremely frustrated with this behavior and I was not alone. After the race, there were many negative comments from other riders including “absolutely terrible” and “never again.” If you’re wanting the Crit Cade genre of race to be successful in the future, you really need to address this with urgency (although I suppose most of the damage is already done since Zwift Games ends today). After this experience, I’m personally just going to quick out of any race that has boosts and hazards.

For completeness, I’m running an Elite Sterzo Smart, although I also tried Zwift Plays (Model Z003), and I’m also using an old laptop with a Intel Xeon E3-1505M v5 CPU and an NVIDIA Quadro M2000M GPU.

I’m kind of suspicious that the terribleness of the experience is somewhat related to the hardware. In the race I did, things were pretty fractured by the end of lap 1 and basically everyone was by themselves by the end of lap 2. There were 3 riders that more or less finished as a group, but they were separated by 20 s at lap 5, so I think this was mostly just a coincidence. As a result, how well someone did largely depended on power, how many boosts they got, and how many hazards they hit.

Here’s what power and specific power vs finish time looked like:

I’ve excluded #12 because he just stopped trying and makes the rest of the data hard to see. I was #11 and probably represent a worst case for “steering unusable.” #1 and #2 were big blokes who were just dumping a lot of Watts and probably deserved the win, but power and specific power are basically uncorrelated with finish times of #3 through #11. There’s also an absolutely enormous spread of solo riders (3:59 between #1 and #11 on an 18:17 race), so some people were clearly able to actually hit the boosts while others were having a much harder time.

I wrote a little Python script this afternoon to plot my Sterzo’s output signal. It looks like there’s an 8 Hz, 16 Hz, and 32 Hz configurable sample rate. Using the 32 Hz sample rate plus a 60 Hz refresh rate on the plotter results in latency that’s just barely on the edge of perceptible, so probably around or a little below 50 ms. This isn’t fantastic, but it’s close to 2 orders of magnitude better than what zwift is doing, so it’s clearly not the hardware itself that’s the issue (with the caveat that that I did my development on a Linux machine, so only the Sterzo and not my Zwift laptop was in the loop).

Example signal of me playing with my Sterzo:

Interestingly, there are a couple issues with the Sterzo’s signal itself that I probably should contact Elite about.

  1. It will glitch in the wrong direction if I hit it with a very fast step change. You can see this in the first and last ~0° to ~-35° steps at t = ~-15 s and ~-9 s. This only seems to occur during very fast slews, so probably won’t come up much during actual riding.
  2. Not shown here, but I’ve seen some weirdness in the signal when I apply a high frequency jiggle near 0°. The 0° measurement seems to be favored much more heavily than it should.

I also feel like noting that there’s no deadzone in the signal, despite there being a deadzone in the spring force used to push the wheel back to center. Don’t pay attention to the first constant rate ramp; I was bending my elbow to move the Sterzo and running into steps in force from the spring. The second rail-to-rail ramp used a straight arm + full body motion and had much more consistent physical motion. This means that the deadzone that we experience in-game is coming from Zwift instead of the sensor. It’s not game breaking (unlike the latency thing), but we’ll have to direct feature requests to Zwift in order to get rid of it or make it adaptive so that we can gently veer (or ideally steer) from one side of a long stretch of road to another.

As I have already mentioned, I was extremely frustrated with this behavior and I was not alone. After the race, there were many negative comments from other riders including “absolutely terrible” and “never again.”

I recorded the race. There were 17 people. Comments were “Darn that was hard”, “awful, never again”. These are typical after every race because the effort is hard.

I liked the race and steering was responsive (unless a rider was in my way, which is sensible).

This is a lot of detail in your comments but it seems like it’s a device issue rather than a game issue