"snake-like" trail of gameobjects following a leader

I am trying to implement a “snake” of vehicle objects which follow a leader vehicle.
My initial idea was to use hinge joints however this causes some issues when turning - the following objects have too much swing around corners. My current implementation is as follows:

Quaternion wantDir = Quaternion.LookRotation(toFollowing);
transform.rotation = Quaternion.RotateTowards(transform.rotation, wantDir, 360*Time.deltaTime);
tmpPos = toFollow.position - toFollow.forward * distance;//transform.forward * distance;
rigidbody.MovePosition(tmpPos);

which works to a degree except the following vehicles don’t always maintain position correctly and act similar to a hinge joint - they can “fly” around the leader car occasionally, especially if it is going downhill…

I was thinking that I could possibly implement a system where the leader car drops its state every frame as a waypoint? Following cars can move to the waypoint position and adjust themselves to the state of the waypoint? I am not sure how to implement this…

Does anyone have any implementation advice for how this can be achieved?

EDIT

I’ve made it so that they won’t jerk into life:

How about this:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class FollowedObject : MonoBehaviour {

	// Use this for initialization
	void Start()
	{
	
	}
	
	public class Frame
	{
		public Vector3 position;
		public Quaternion rotation;
	}
	
	public List<Frame> formerPositions = new List<Frame>();
	public int frameDelay = 30;
            public float minimumDistance = 1;
	Vector3 formerPosition = Vector3.zero;
	
	// Update is called once per frame
	void Update()
	{
		if (formerPosition != transform.position)
		{
			formerPositions.Insert(0, new Frame { position=  transform.position, rotation =  transform.rotation});
			if (formerPositions.Count > frameDelay + 2)
				formerPositions.RemoveAt(formerPositions.Count - 1);
		}
		formerPosition = transform.position;
	}
	
	public void MoveFollower(Transform target, float maxSpeed = 1f, float maxAngleSpeed = 180f)
   {
		if (formerPositions.Count > frameDelay )
		{
			var frame = formerPositions[frameDelay];
                            //You could project for the minimum distance here, I will just check
                            if((target.position - frame.position).magnitude < minimumDistance)
                                   return;
			target.position = Vector3.MoveTowards(target.position, frame.position, maxSpeed * Time.deltaTime);
			target.rotation = Quaternion.RotateTowards(target.rotation, frame.rotation, maxAngleSpeed * Time.deltaTime);
		}
	}
	
	
	
}

public class FollowingObject : MonoBehaviour
{
	public FollowedObject target;
    public float maxSpeed = 2;
    public float maxAngleSpeed = 180f;
	
	void Update()
	{
		if (target != null)
		{
			target.MoveFollower(transform, maxSpeed, maxAngleSpeed);
		}
	}
}

You put FollowedObject and FollowingObject on all of the cars and then setup the FollowingObject.target properties. The delay between their positions is controlled in frameDelay. The maximum speed and angle rotation can be set in the following object.