- Tape measure.
- First milestone.
- Route finding is part of this milestone only so that you can do things that show your calibration to be correct. For milestone 2 you will have to do route finding on track graphs with edges missing, so choose an approach to route finding that generalizes.
- In the demo you can use your preferred train from among the working ones. But, your favourite train may not be working. In that case we expect you to run your demo using another train. Be prepared!

- Measurement is costly.
- The most congested resource, the train, generates at best one measurement every few seconds.
- If your fellow students, not to mention the TAs and me, can tolerate five minutes of calibration you still get only about 100 measurements per train. (It's actually rare for students to calibrate more than one train at a time.)

Therefore, you should never throw any data away.

- You make measurement whenever you are driving trains on the track, regardless of the purpose of driving.
- Note that, for milestone 1, we require you to have on the console screen, the estimate of the time when the most recent sensor would be triggered compared to the actual time that it was triggered. (This could just as easily, and probably more usefully

- You are likely to use floating point.
- However, it's not necessary. E.g.
- Make distance measurements in 0.1 millimetre units. 2^32 times 0.1 mm = 400,000 metres.
- Make time measurements in 10 millisecond units. 2^32 times 10 milliseconds = 40,000,000 seconds = 600,000 minutes = 10,000 hours = 400 days = 1 year.

- There is a floating point co-processor, but
- compiler maybes
- context switch costs versus inter-task communication costs

- Floating point is provided by the math library you were given using
software
- How does its speed compare to the speed of the co-processor?

- However, it's not necessary. E.g.
- Each landmark requires a well-defined origin and clearances with
respect to that origin. E.g.
- Turn-out.

At the core is a relation, (x, t), which is a space-time point. The relation says that as time passes a train takes up successive positions x(t).

The first thing that we rule out is teleportation.

- Why?

A train having infinite velocity is impossible in practice

- Leave to the physicists whether or not it is possible for a train to have infinite velocity in theory.

No teleportation means that x(t) must be continuous.

Suppose you have a train at (x1, t1) and you have to get it to (x2, t2).

Two questions:

- Is it possible? If the maximum velocity is vmax, and vmax < (x2 - x1) / (t2 - t1), then it's impossible.
- How do you do it? If vmax > (x2 - x1) / (t2 - t1) then you might try
- Set v = (x2 - x1) / (t2 - t1) at t1
- Use your velocity calibration for this!

- Set v = 0 at t2.

Doesn't quite work.

- Because of acceleration you arrive at x2 after t2.
- Because of deceleration you don't stop until the stopping distance beyond x2.

You could

- curse the inadequate train dynamics
- put xmax down very slow
- only accept requests for long in the future
- and be successful because the acceleration and deceleration times are negligible.

But

- It's against the rules, because
- Your project would only be interesting to trees, and
- You would be unsuccessful because of stalling on curves.

- Set v = (x2 - x1) / (t2 - t1) at t1

Infinite acceleration is impossible because the train would be crushed, if not vaporized!

This is true both in theory and in practice.

Intuitively a good idea to minimize acceleration

- Accelerate at a from t1 to (t2 + t1) / 2
- Velocity is a*(t-t1)
Position is x1 + (1/2)*a*(t-t1)^2

- Velocity is a*(t-t1)
- Decelerate at -a from (t2 + t1) / 2 to t2
- Velocity is a*(t2-t1) / 2 - a*(t - (t2+t1)/2 )
Position is ...

- Velocity is a*(t2-t1) / 2 - a*(t - (t2+t1)/2 )
- At t2
- Velocity is 0
- Position is x1 + (1/8)*a*(t2 - t1) ^2, which should be x2.
- Therefore choose a = (8 * (x2 - x1)) / (t2 - t1)^2

But, what happens at t = t1, (t2 + t1) / 2, t2?

- discontinuities in acceleration
- experienced as jerk, in fact, infinite jerk
- And you know from experience that when you jerk things hard enough they
break. E.g.,
- tooth
- knuckle

Third order curve for position, second order for velocity, linear acceleration. We usually go one better, and try to minimize jerk over the whole journey.

Acceleration/Deceleration is continuous

The result is a fourth order curve in position, third order in velocity, which is what you try to achieve when you drive.

- You can calculate position explicitly without having to do numerical
integration.
- Euler integration is unstable because of accumulating error.

- You can calculate the parameters of a function with less measurement.
How?
- Start at x = t = 0, which assumes that you get the same function regrardless of position on the track and time of day.
- Check deceleration inverse of acceleration?
- &c.

The idea is that the person who programmed acceleration/deceleration into the train was lazy, so there's probably one basic function used over and over again

- You need to check that the functional form you have is the right one, or a right-enough one.
- For practical purposes small look-up tables may be perfectly adequate.

Return to: