private void followPath() {
			// try to clean up behind self
			MazeState curState = MazeLocalizer.fromWorldToMazeState(curPose);
			if (lastState != curState) {
				clearFakeWallsAround(lastState);
				lastState = curState;
			}
			
			final double Kp = 1;// switch between 1.2 and 2
			RealPose2D correctedPoseRelStart = new RealPose2D(perceptor.getCorrectedPose().getX() - CELL_RADIUS, perceptor.getCorrectedPose().getY() - CELL_RADIUS, perceptor.getCorrectedPose().getTh());
			RealPoint2D tmp = new RealPoint2D();
			int segment = Lookahead.findLookaheadPoint(pathSegments, correctedPoseRelStart.getPosition(), LOOKAHEAD_DISTANCE, tmp);
			lookaheadPointRelWorld = tmp;
			Point2D destPointRelCur = correctedPoseRelStart.inverseTransform(tmp, null);
			// transition to something if we're approaching the end of the path
			double distToEnd = destPointRelCur.distance(new Point2D.Double());
			double slopFactor = hasGold ? 1.25 : 1;
			if (stopping || pathSegments.size() == 0 || (segment == pathSegments.size() - 1
					&& distToEnd < slopFactor*0.80*perceptor.getSpeed() || distToEnd < slopFactor*0.05)) {
				//stopping = true;
				controller.stop();
				if (perceptor.getSpeed() == 0) {
					clearFakeWalls();
					stopping = false;
					// same conversation as MazeLocalizer.mazeStateToWorldPose
					destAngle = goalState.dir().ordinal() * PI/2;
					if (hasGold) {
						transitionTo(Subtask.TURNTO_DROP);
					}
					else {
						//speech.speak("searching");
						transitionTo(Subtask.TURNTO_GOLD);
					}
				}
			}
			else {
				double[] arcInfo = calculateArc(destPointRelCur);
				controller.setCurvVel(1.0/arcInfo[0], Kp*arcInfo[1]);
			}
		}