Wheels traveling over bumps

If you combine the track-to constraint (chassis tipping) with
Moonboots' answer, the shrinkwrapped planes, this should remove the need to keyframe the wheels, albeit with some sinking into the road surface.
For the method below some experience with the Graph Editor, it's handles, and also the Dope sheet, is recommended.
Normally, a vehicle following a "path" constraint would do this job but in those instances where we have to see the front and rear wheels going over sharply uneven ground and tipping the vehicle's body with it, it's probably easier to keyframe the whole thing, particularly when stability and predictability are required.
Shadows
Shadow masks (planes) were used because of the OpenGL rendering. The van's shadow is actually a semmi transparent plane which is Shrinkwrapped to be a whisker above the road and parented to the van's "Navigation Empty". Consequently the wheels need to treat the shadow plane as the road surface to avoid them sinking into it and appearing somewhat under-inflated.
The vehicle as a whole will be moved forward and turned left & right using a 'Navigation' Empty. (the large vertical circle. It's there to avoid forming a 'parent loop')
The vehicle body is parented to the front wheels, and it's pivot point also set at the axle.
This will take the chassis up and down as the front wheels encounter the road's rises and falls.
Parent both front and rear wheels to the Nav Empty. (parent = Nav Empty)
Animate the Empty forward as far and at the speed required. The entire vehicle should follow but at this stage ghost right through the road humps.
The front wheels and the bumps
The front wheels are only to be animated in the Z axis for this step in order to follow the road surface.
Hint: In the Dopesheet, click on the ghost and arrow icons at the bottom of the window. This will unclutter the display and show only those objects selected in the 3D window.
(That's already done in the attached Blend file)
The humps
It's best be in Ortho View mode and looking directly from the side. Tilt the view a fraction so you can see the road. (or shadow) or work in wireframe mode.
Insert a keyframe at frame 1 for the front wheel at the starting location for ALL 3 AXIS.This gives all axis' an appearance in the Dope sheet. Lock out (padlock) the X & Y strips so these can't be inadvertently accessed.
From frame 1, step through the frames and at the contact point between the first bump and the forward wheels, insert a keyframe. Only the Z axis will register a keyframe which is what we want.
Advance the timeline to the frame where the wheels' center will be at the peak of the bump. Drag the wheels up in the Z axis so they're sitting on the road surface. Insert another keyframe there.
Don't worry about the intermediate frames between the bottom and peak of the bump yet.
Move onto the other bumps and do the same at the high and low extremities
Intermediate Frames
When all bumps are keyframed, we turn our attention to the intermediate frames and use the Graph editor's keyframe-handles to adjust the curves so the wheels stay at the road's surface at all times, unless otherwise required such as a bounce. Intermediate keyframes may be necessary but avoid these where possible.
The keyframe handles are easiest to use when set to "Free" movement. This ensures one handle won't be affecting it's counterpart. (Select the handle, press V and choose "Free") Select the handle again and press G to drag it around. Observe the effect is has on both the curve and the wheel in the inset 3D window.
Real Wheels
If you're uncomfortable with dopesheet copy/paste, the rear wheel keyframes can be added manually as you did with the front. Skip this section.
With the front wheels following the road surface correctly, you can copy paste it's Z axis keyframes (only Z) into the rear wheels' Z axis strip in the Dopesheet.
Make sure the timeline cursor is at frame 1 when doing this.
Be clever here and lock out all but the rear wheels' Z axis. (padlocks)
The rear wheels will now rise and fall in sync with the front so all it's keyframes, except frame 1 will need to be slid back to allow for the distance (and delay) between them.
The vehicle's forward motion is set to Bezier so all rises and falls will need to be adjusted back or forward to accommodate the vehicle's variable speed. Block select them and slide left or right.
This is not a difficult task but familiarity with the Dopesheet and Graph editor will be more than a little useful.
Vehicle Body
Once the wheel rises and falls are right, it's time to force the vehicle's body to tip forward and back.
We need a target for the van's body to aim at (pivot towards) each time the rear wheels move up and down.
Place a Track to constraint on the body and set the rear wheels as the 'target'.
The vehicle's chassis should now tip forward and back as the wheels negotiate the road.
Wheel Turning
Turning is only a matter of rotating the Nav Empty in it's z axis.
If the front wheels need to be turned whilst steering, that will require the existing wheels to made invisible and a new set of 'turnable' ones set in place. Parent those to the (invisible) front wheels and rotate them in the Z axis when making turns.
Fixing Constraints
Just when you think it's safe to have a break, sit back and enjoy the video you've just produced, you'll notice the rear wheels seem to be sliding back and forth along the chassis! Oh great!
This is a side effect because we can't parent the rear wheels to the chassis itself without upsetting the 'track-to'' constraint.
You'll notice an empty called 'Rear alignment' at the back of the body. It's there to use as a marker.
Unlock the X axis strip in the Dopesheet, view the vehicle from the side and simply keyframe and drag the rear wheels so they maintain alignment to that empty whilst keeping the wheel on the road (or shadow plane).
