The easiest thing to do is not even handle the geometry inside the simulation, but to just keep track of the variables that we need to put our geometry where it ought to be:

Which gives us:

I'm only using the simulation nodes to calculate what I need. I need the direction that the empty is travelling, given by my deltaPos output. I need the total length of the path that the empty has travelled, given by pathLength. And of course, I need to know where the empty actually is.
After that, I can rotate about my object origin, first rotating the wheel appropriately to the length of the path travelled, then rotating about object Z to align object +Y with the direction that the empty is travelling. After I do all that, I can set the position of the wheel appropriately. If I did it before, I couldn't rotate about object axes. That's why it's convenient to just use the simulation group to handle the variables.
There are a few things to take note of here:
At our first frame, the direction of travel is undefined. Notice the location initialization to the simulation nodes: I'm using that to say, hey, before we start, I was over in -Y a bit, so that the wheel knows which way to face on the first frame. The same thing will happen if the wheel ever stops: if we need it to be able to do that, we should output our input deltaPos if the length of our simulated deltaPos is 0.
Your cylinder has a radius of 1, so it rotates 1 radian every time it travels 1 unit. If you use a wheel with a different radius, divide your path length by your radius to get the rotation. A bigger wheel rotates more slowly.
Notice the second transition, where the wheel completely reverses direction. I'm handling this in the simplest way: the wheel rotates to face the new direction it is travelling, and continues rolling. This is not the same thing as rolling backwards, as you can see from the fins I modelled onto your wheel so I could keep track of its rotation. If we wanted to reverse our direction of travel, rather than steer and continue, we'd need to subtract from our path length and reverse our outputted delta pos, as well as keep track of if we were travelling forwards or backwards.
