def execute_path(path,controller,speed=1.0,smoothing=None,activeDofs=None):
	"""Sends an untimed trajectory on a controller.
	
	Arguments:
	- path: a list of milestones
	- controller: a SimRobotController
	- smoothing: any smoothing applied to the path.  Valid values are:
	  * None: starts / stops at each milestone, moves in linear joint-space paths
	  * 'spline': interpolates milestones smoothly with some differenced velocity
	  * 'ramp': starts / stops at each milestone, moves in minimum-time / minimum-
	    acceleration paths.
	- activeDofs: if not None, a list of dofs that are moved by the trajectory.  Each
	  entry may be an integer or a string.
	"""
	if activeDofs is not None:
		indices = [controller.model().link(d).getIndex for d in activeDofs]
		q0 = controller.getCommandedConfig()
		liftedMilestones = []
		for m in path:
			assert(len(m)==len(indices))
			q = q0[:]
			for i,v in zip(indices,m):
				q[i] = v
			liftedMilestones.append(q)
		return execute_path(liftedMilestones,controller,speed,smoothing)

	if smoothing == None:
		controller.setMilestone(path[0])
		for i in range(1,len(path)):
			controller.addMilestoneLinear(path[i])
	elif smoothing == 'spline':
		raise NotImplementedError("Spline interpolation")
	elif smoothing == 'ramp':
		controller.setMilestone(path[0])
		for i in range(1,len(path)):
			controller.addMilestone(path[i])
	else:
		raise ValueError("Invalid smoothing method specified")