GPS et OpenStreetMap

Global Positioning System

Pour ceux de ma génération qui ne sont pas assez vieux, une petite perspective historique. Le GPS est une technologie de positionnement mondiale à l’aide de plus de 24 satellites (3 satellites “visibles” nécessaires pour obtenir un “fix” de latitude et longitude, et un autre de plus si on veut savoir son altitude). C’est une technologie américaine, d’abord développée à des fins militaires (comme toujours), puis ouverte au public par Ronald Reagan en 1983 (visiblement, il a au moins fait un truc bien), lorsqu’un avion civil fut abattu par des chasseurs soviétiques. En somme, faut que ça fasse boum avec des grosses explosions comme au cinéma pour que le cowboy fasse bouger les choses. Le maintien du système GPS coûte aux États-Unis 75 millions de dollars par année insignifiant quand on voit leur budget de “défense”, ou le fait qu’ils sont plus de 300 millions en population.
Donc. Je me suis progressivement intéressé au GPS pour la navigation en voiture, et j’ai déniché un récepteur usagé (en fait c’est un truc sur port série, totalement noname, aucun moyen de savoir le fabricant ou le modèle de ce truc, avec un adapteur USB) et je me suis posé la question obligatoire: yeah, but does it run Linux IN SOVIET RUSSIA, does Linux run it? En fait oui ça marche, mais il m’a fallu du temps pour comprendre qu’il fallait que j’utilise le “broken device mode”, avec l’option -b de gpsd en ligne de commande. Ha ha. (voir aussi: un autre site qui pourrait aider)

Et aussi, attendre 3 minutes (oui o_o) pour que ce GPS obtienne son fix (un peu moins sur le pont ou l’autoroute). xgps (logiciel graphique inclus dans le paquet gpsd-clients) est le meilleur moyen d’avoir une idée claire du nombre de satellites que le GPS arrive à voir, et de si on a un fix ou pas:

Mon intérêt pour la procuration de ce récepteur USB avait notamment été augmenté par mes quelques recherches éparses sur l’Internet. En effet, j’ai rapidement découvert le projet Navit, logiciel libre multiplateforme qui cherche à accomplir les mêmes tâches que les appareils de navigation dédiés.
La lecture du Wiki de Navit m’a, à son tour, amené à découvrir OpenStreetMap. Et c’est là que je m’interromps et que je me dois de vous en faire l’évangile. Ce truc est génial. En gros: cartographie routière libre (open source, sous licence Creative Commons), wiki-style.

OpenStreetMap

Chacun peut modifier la carte du monde, et chacun peut contribuer son bout de planete. Et c’est amusant. Il faut l’avoir essayé pour comprendre 🙂

Mais pourquoi ça alors qu’on a Google/Yahoo/Live Maps (toutes des cartes routières fournies par Navteq)?

Bon. Y’a évidemment le point de vue du radicaliste du libre (“google/yahoo/whatever maps ça pue c’est pas libre”).
Ensuite, y’a moi qui n’aime pas tout à fait que les cartes soient contrôlées par des compagnies; quand quelque chose n’est pas sur la carte (une nouvelle route par exemple), pas moyen de l’ajouter soi-même.
Bon, évidemment OpenStreetMap étant jeune et communautaire, c’est pas encore au point d’être aussi complet que Navteq, mais au moins, on sait qu’on peut faire son petit bout de chemin individuel pour l’améliorer. Par exemple, à en croire OpenStreetMap, Brossard est officiellement plus trou que La Prairie. Prenez ça dans la gueule!

Néanmoins, dans certains cas, OpenStreetMap est plus complet et “juste” que les cartes de Navteq
Aussi, les cartes de Navteq ne pourront jamais être aussi détaillés (à petite échelle) que des cartes soigneusement conçues par des habitants de la région. OpenStreetMap va jusqu’à me permettre de préciser l’emplacement de boîtes aux lettres, bureaux de poste et de feux de circulation!

Ceci a des implications tout à fait intéressantes. Un logiciel de navigation tel que navit pourrait carrément me dire “au panneau d’arrêt, tournez à gauche”, ou “au feu de circulation, égorgez un poulet”, ou “vous êtes présentement au-delà de la limite de vitesse, qui est 80 km/h” ou “attention, les caribous sont pas toujours sur les panneaux icitte, coudonc”.
Qui plus est: c’est gratuit. Je peux donc (avec une séquence assez tordue de commandes de wget), télécharger et combiner des portions de la planète pour pouvoir voyager à l’aide de navit, sans payer un sou.
Évidemment, pour que ce projet fonctionne bien pour un usage de routage, il faut que chacun y mette du sien, et cartographie son petit bout de planète (ou plus). Personnellement, j’ai complété mon quartier (c’est à peu près tout ce qui manquait à ma ville), réparé trois ou quatres échangeurs d’autoroutes (les sorties étaient mal connectées), prolongé la piste cyclable, ajouté des points d’intérêt, réparé environ 200 km de route de Montréal à Ottawa, etc.
Par exemple, ma région avant (et après) que je soit passé par là (ça ne m’a pris que quelques minutes):

Potlatch

Pour ce faire, j’ai utilisé Potlatch, l’éditeur en flash sur openstreetmap.org, et quelques fois JOSM (l’éditeur en java, qui est plus rapide et ne nécessite pas d’être tout le temps connecté, mais qui est bien plus moche). JOSM rend aussi le travail à partir de tracés GPS plutôt aisé.
Je dois mentionner que lorsqu’on cartographie, il faut s’assurer de le faire correctement. C’est-à-dire, relier les rues par des noeuds aux intersections et s’assurer que le tout est bien connecté, pas “ça a l’air correct et superposé”. De plus, il faut s’assurer que les routes à sens uniques (ex: la moitié des rues de Montréal, les grandes autoroutes à deux chaussées séparées, ou encore les bretelles).
Sans ça, les logiciels de routage tels que Navit vont s’emmêler les pattes. Alors, comment faire ça correctement? Je vais vous lister mes trucs et astuces pour Potlatch afin de vous épargner des ennuis:

  1. utilisez le mode “Practice” au début. Vous allez inévitablement faire des erreurs loufoques en apprenant à utiliser potlatch.
  2. on ne peut pas sélectionner plus d’un objet à la fois
  3. pour déplacer un noeud, sélectionnez une voie et cliquez sur le noeud ensuite.
  4. pour connecter un noeud à un autre (si vous êtes à l’extrémité d’une voie), cliquez sur le premier noeud et cliquez sur le deuxième.
  5. pour désélectionner, appuyez sur entrée et cliquez dans le vide.
  6. désactivez le curseur personnalisé, c’est inutile et ça ramme pour rien
  7. utilisez “Yahoo! Aerial imagery” comme fond d’écran pour vous guider lors du tracé. En effet, Yahoo! a pris une entente avec openstreetmap pour nous simplifier la vie. Les tracés qui en résultent sont libres.
  8. pour ajouter un point d’intérêt, double-cliquez
  9. pour enlever un noeud, appuyez sur la touche Suppr/Del.
  10. n’appuyez jamais sur la touche Échap/Esc, à moins de vouloir réellement annuler tous les changements que vous venez de faire sur un segment.
  11. pour commencer le tracé d’une ligne, ou en prolonger une, cliquez où vous voulez mettre un noeud. Les noeuds sont automatiquement liés entre eux.
  12. la direction avec laquelle vous tracez une ligne est importante dans le cas où vous mettez le tag “oneway” = “yes”. Si vous avez commencé du mauvais côté, il y a un bouton pour inverser la direction; dans potlatch, ce bouton est une flèche dans un cercle, qui a également pour fonction de vous indiquer la direction d’une voie.
  13. lorsque votre voie est terminée, appuyez sur entrée, et utilisez le bouton “+” pour ajouter des tags.
  14. le reste, si nécessaire, peut être appris à l’aide de la documentation de Potlatch ou une démonstration vidéo.

Quelques notions pour “réparer” du travail incorrect

  • pour ajouter un noeud entre deux noeuds (pour créer une intersection par exemple), faites shift-clic.
  • si deux voies se superposent sans être connectées, sélectionnez la voie du dessus et faites shift-clic (il faut être assez précis) et un noeud apparaîtra et connectera automatiquement les deux voies. C’est une fonctionnalité qui a été implantée dans potlatch après que je me soit plaint que c’était pratiquement impossible de corriger toutes les erreurs dans ma ville sans recommencer la moitié des voies à partir de zéro 🙂
  • l’outil “ciseaux” a pour effet de séparer une voie en deux au noeud sélectionné. Ceci sert à deux choses:
    • créer une voie qui se divise
    • créer des tronçons d’une même voie. Par exemple, certaines rues changent de nom à un certain point, ou encore de vitesse, ou encore vous pourriez vouloir indiquer qu’un certain tronçon est sur un pont ou dans un tunnel.
  • tout doit être connecté. J’utilise des voies highway=”motorway_link” à profusion pour les sorties d’autoroute. Il est important de jeter un coup d’oeil rapidement à la page des “features” d’OpenStreetMap, c’est-à-dire le type d’objets que l’on peut mettre sur la carte. Cette page indique quels types de tags utiliser (mais de toutes façons, quand vous ajoutez des tags, potlatch ou josm vous offrent de les compléter automatiquement, donc pas besoin de mémoriser).

Navit: logiciel de routage libre et qui fonctionne

Voilà. Maintenant, la partie joyeuse: navit est facile à compiler (y’a des instructions sur les dépendances pour diverses distributions), mais j’ai jamais réussi à l’installer avec checkinstall, alors je l’utilise à même son dossier CVS, en me déplaçant dans le dossier src/ et en exécutant navit. Notez que cette méthode a également l’avantage de ne pas avoir à chercher comment créer “navit.xml”, il est déjà dans le dossier. Navit.xml est le fichier de préférences, assez chiant à comprendre initialement. Il faut mettre des coordonnées de départ (sauf si vous habitez à Munchen, ou si vous avez toujours un GPS actif et fixé au lancement de navit), spécifier une commande correcte si vous voulez que la synthèse vocale vous dicte votre route, et spécifier un fichier de carte que navit pourra interpréter. Tout ceci est documenté sur le wiki (mais au pire, y’a qu’à demander de l’aide sur IRC dans le canal #navit de freenode).
Maintenant on s’amuse: OpenStreetMap ne compile sa carte qu’une fois par semaine, le mercredi matin (la planète pèse plus de 1.5 GiO après tout).
Navit download vous permet de télécharger une portion de la planète dans un format compatible avec navit, mais leur version de la carte n’est mise à jour que le chatmedi. Au final, on se retrouve à attendre une semaine pour voir ses changements et les tester dans navit. Pas top.
Le wiki de navit a cependant une autre solution: wgetter et convertir soi-même une portion de l’OpenStreetMap. Tel qu’on m’a expliqué, le truc tout-cuit de navit n’est mis à jour que le chatmedi, mais un wget directement sur les serveurs OSM récupère toujours les données les plus fraîches dans la base de données (même si leur carte “visible par le public” n’est pas à jour). Le hic: ne pas télécharger une carte trop grande, sinon le serveur de l’osm refuse.
Bref, pour savoir comment wgetter plusieurs cartes et les joindre (j’utilise josm pour déterminer les coordonnées correctes qu’il me faut), faut lire la doc sur cette même page, parce que en fait ce billet est déjà bien trop long, probablement que tout le monde s’en tape, et puis j’ai trop écrit déjà. Je résume l’astuce: coller le permalink (coin en bas à droite de la carte osm) dans le dialogue “download” de JOSM (faisant ainsi apparaître les coordonnées), et placer, dans la commande wget, les coordonnées dans l’ordre suivant: min lon, min lat, max lon, max lat.
Dans ma copie locale de navit, j’ai fait quelques modifications: une traduction française “décente” (notamment, pour que ça se comporte mieux avec la synthèse vocale de speechd), et je vais tenter de leur proposer, dans les temps à venir une revue complète de l’utilisabilité de leur interface graphique, et divers bugs que j’ai découverts.
Je vous laisse sur l’image de navit qui me dit la route à emprunter sur plus de 200 kilomètres entre Montréal et une ville dans les environs d’Ottawa:

Un truc intéressant qui n’est pas montré dans l’image: Navit estimait automatiquement l’heure d’arrivée, comme dans un avion de ligne! Aussi, ne vous surprenez pas que la carte semble pratiquement vierge. En dehors de Montréal, Ottawa et la route séparant les deux, je n’ai rien téléchargé d’autre (le strict nécessaire, quoi).

Traces GPS

Oh, pour les intéressés: j’ai également créé une “trace” GPS de tout le trajet hier soir (le fichier XML au final pèse 4 MiO!) en faisant gpxlogger >foo.gpx (vous avez besoin de python-gps). Ça m’a permis de l’importer dans JOSM et corriger les défauts de la route à partir du tracé (parce que l’imagerie satellite de Yahoo dans la région est nettement (ou floutement) insuffisante.

Vus : 37
Publié par Kiddo : 87