Ett fordon på röda linjen mot Ropsten rapporterades hoppa fram och tillbaka istället för att glida jämnt. Orsaken visade sig vara en grundläggande brist i hur kartan avgör vilken riktning ett fordon färdas.

Problemet

Varje spårbundet fordon har en bearing — en kompassriktning från GPS:en. Kartan jämför denna bearing med spårets riktning vid den aktuella positionen för att avgöra om fordonet åker "framåt" eller "bakåt" längs spåret.

Vid Ropsten gör tunnelbanespåret en skarp sväng där riktningen svänger från 30° (nordost) via 325° (nordväst) tillbaka till 58° (nordost). När ett fordon var mitt i kurvan kunde dess GPS-bearing peka i en helt annan riktning än det lokala spårsegmentet — och koden tolkade det som att fordonet åkte bakåt.

Schematisk bild av U-kurvan vid Ropsten där spårriktningen svänger från 30° via 325° till 58°

Konsekvensen

När riktningen sätts fel ignoreras alla framåtförflyttningar (de ser ut som "bakåt" ur kodens perspektiv). Fordonet står stilla. Efter ett antal ignorerade uppdateringar godkänns till sist en riktningsväxling — och fordonet hoppar fram hela den ackumulerade sträckan på en gång.

16 kurvor i spårnätet

En genomsökning av hela spårnätet hittade 16 platser med skarpa kurvor (>120° riktningsändring) som kunde utlösa samma problem:

Dessutom påverkades flera pendeltåg (linje 40 och 48) av liknande problem.

Lösningen

Riktningsdetekteringen har nu en dead zone: om vinkeln mellan fordonets bearing och spårets riktning ligger mellan 45° och 135° klassas riktningen som tvetydig och fordonet antas åka framåt. Bara tydliga matchningar (<45°) eller tydliga motsatser (>135°) ger ett aktivt riktningsbeslut.

Diagram som visar dead zone mellan 45° och 135° där riktningen klassas som tvetydig

Gränsen för att godkänna en äkta riktningsväxling (som vid en ändhållplats) sänktes också från 5 till 3 på varandra följande bakåtuppdateringar — så att fordon vid terminus vänder snabbare.