Artisan Numérique

/système/périphériques/matériel/ Système de navigation GPS

Il y a longtemps que j'avais envie d'un GPS pour palier à mon terrible sens de l'orientation et enfin cesser de me perdre. Il y a longtemps aussi que j'avais envie de coller ce type de dispositif sur le Zaurus sans jamais sauter le pas. Avec l'arrivée de l'U810 et les précieux conseils Orgoz, c'est maintenant chose faite. Reste maintenant à mettre tout cela en musique...

Matériel

Je cherchais un récepteur bluetooth 100% fonctionnel sous Linux et Orgoz m'avait conseillé le Globalsat BT-338. Il est donc arrivé, 60€ et 2 jours plus tard. Et rien qu'au déballage il y avait de quoi être satisfait. Il est fournit avec une batterie Lithium-ions, un chargeur mural ET un chargeur allume-cigares. Le look est un peu moche mais l'interface est ultra simple : trois diodes (charge, localisation et bluetooth) et un unique bouton pour l'allumer et l'éteindre.

Mais l'aspect le plus intéressant est qu'il localise ses satellites très rapidement. Guère plus de 5 secondes dans mon cas, et en intérieur... En bref une bonne impression. Ne restait plus qu'à tester sous GNU/Linux.

Teste de réception

La première chose à vérifier est bien évidement que le bluetooth fonctionne. Un simple /etc/init.d/bluetooth restart devrait faire l'affaire. Ensuite, allumez le BT-338 et lancez une détection :

roothcitools scan
Scanning ...
00:0D:B5:38:25:F3  BT-GPS-3825F3

Nous avons maintenant l'adresse de notre récepteur GPS. L'étape suivante consiste à lier ce receveur à un port de communication (rfcomm) qui est très semblable à un port série. Nous verrons plus tard comment automatiser tout cela mais pour l'instant il s'agit de test. Nous allons donc créer le lien à la main :

rootrfcomm connect 0 00:0D:B5:38:25:F3
Connected /dev/rfcomm0 to 00:0D:B5:38:25:F3 on channel 1
Press CTRL-C for hangup

Voilà, le récepteur est lié au device /dev/rfcomm0 (de par le paramètre 0), sur le canal 1 qui est le canal standard du rfcomm. Maintenant ouvrons une autre console en root, et commençons par installer le démon chargé de lire les données en provenance du gps, gpsd.

L'avantage de ce démon est qui va permettre à plusieurs applications d'accéder en même temps aux données GPS en passant par le réseau. Il convient d'abord de l'installer, puis de le lancer en mode "non-démon" (pour les tests une fois encore) :

rootgpsd -N -D 2 /dev/rfcomm0
gpsd: launching (Version 2.34)
gpsd: listening on port 2947
gpsd: successfully connected to the DBUS system bus
gpsd: running with effective group ID 0
gpsd: running with effective user ID 0
gpsd: opening GPS data source at '/dev/rfcomm0'
gpsd: speed 9600, 8N1
gpsd: garmin_gps not active.
gpsd: gpsd_activate(0): opened GPS (5)
gpsd: closing GPS=/dev/rfcomm0 (5)

le -N empêche le passage en mode démon, et le -D 2 nous permet de voir ce qui se passe.

Maintenant il s'agit de lire les coordonnées émises par le boîtier. Dans un premier temps, nous allons utilisez le très simple gpsdrive. Dans la mesure où il utilise en standard gpsd, il n'y rien à faire d'autre que de le lancer dans une console, mais en tant qu'utilisateur sans privilèges cette fois :

gpsdrive

Et là, si tout va bien, la console où vous avez lancé gpsd devrait se mettre à jacasser et sur l'écran de gpsdrive, vous devriez voir une croix à l'endroit où vous vous trouvez dans le monde ainsi que les coordonnées numériques dans la ligne de statut, en bas de l'écran.

Automatisation

Bon, étape suivante, automatiser tout cela. Pour commencer, nous allons paramétrer la pile bluetooth de sorte à ce que le device /dev/rfcomm0 soit systématiquement associé au récepteur GPS et qu'il soit ainsi créé automatiquement. Pour cela, il faut éditer le fichier /etc/bluetooth/rfcomm.conf :

rfcomm0 {
        # Automatically bind the device at startup
        bind yes;

        # Bluetooth address of the device
        device 00:0D:B5:38:25:F3

        # RFCOMM channel for the connection
        channel 1;

        # Description of the connection
        comment "Récepteur GPS"
}
/etc/bluetooth/rfcomm.conf

Ceci fait, un redémarrage du service bluetooth s'impose (/etc/init.d/bluetooth restart).

Maintenant vous devriez avoir un device /dev/rfcomm0 même quant le récepteur est éteint. La tentative de connexion sera automatique lorsqu'un logiciel tenter d'y accéder.

Pour gpsd, étrangement il n'y a pas, du moins pour Mandriva, de script de démarrage. L'option prise par cette distribution semble être d'utiliser udev. Je n'ai rien contre cela sauf que cela se base sur le postulat que le kernel est au courrant de tout ce qui est connecté dynamiquement au système. C'est nickel pour un récepteur USB, mais pour un bluetooth, ça marche beaucoup moins bien vu qu'il n'y a pas de découverte dynamique. Ce n'est pas non plus très malin pour ceux qui utilisent un récepteur via le port RS232C.

Bref, nous en sommes donc quite à créer un petit script de lancement à la mano : /etc/init.d/gpsd

#!/bin/bash
#
# chkconfig: 2345 15 15
# description: GPSD
# processname: gpsd
# pidfile: /var/run/gpsd.pid
# confid /etc/sysconfig/gpsd
#
### BEGIN INIT INFO
# Provides: gps
# Should-Start:
# Default-Start: 2 3 4 5
# Short-Description: gpsd
# Description: gpsd
### END INIT INFO

# source function library
. /etc/rc.d/init.d/functions

GPSDCFG=/etc/sysconfig/gpsd
GPSDDEVICE=/dev/rfcomm0

RETVAL=0

case "$1" in
  start)
        gprintf "Starting gpsd services: "
        if [ -f "$GPSDCFG" ]; then
                . "$GPSDCFG"
        fi

        if [ -n "$device" ];then
            GPSDDEVICE=/dev/$device
        fi

        if [ ! -e $GPSDDEVICE ];then
            gprintf "%s don't exist\n" "$GPSDDEVICE"
            exit 0
        fi

        daemon gpsd $GPSDDEVICE
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/gpsd
        ;;
  stop)
        gprintf "Shutting down gpsd services: "
        killproc gpsd
        RETVAL=$?

        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/gpsd
        ;;
  restart|reload)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
  status)
        status gpm
        RETVAL=$?
        ;;
  *)
        gprintf "Usage: gpsd {start|stop|status|restart|reload}\n"
        exit 1
esac
exit $RETVAL

Pour que le tout soit lancé au démarrage, rendez le script exécutable (chmod +x /etc/init.d/gpsd) et lancez ensuite un chkconfig --add gpsd.

vous pouvez déjà tester en lançant à la main /etc/init.d/gpsd start et vérifier par un ps -edaf | grep gpsd que le process est bien là. Il suffit ensuite de démarrer gpsdrive pour vérifier que tout fonctionne. Normalement gpsd ne s'offusque pas que le récepteur soit arrêté puis rallumé.

Applications

Maintenant que tout fonctionne, il faudrait quelque chose de plus "velu" que gpsdrive. J'ai testé un certain nombre d'application mais deux projets m'ont semblés plus aboutis que les autres : Viking et NavIt.

Le premier est d'un concept assez intéressant, permettant d'ajouter des couches de calques les unes sur les autres. En commençant par la couche GPSLayer qui se connecte à gpsd et en finissant par MapLayer que l'on peut paramétrer pour aller directement chercher sur GoogleMap en vue carte ou satellite. C'est bien fait, rapide, facile à utiliser mais n'a qu'un seul problème chez moi, il ne lit pas correctement les coordonnées. J'ai peut être loupé une étape dans le paramétrage mais ce gentil logiciel a décidé de me coller au milieu de la luzerne, en plein champs. C'est très gentil de sa part mais pas très concordant avec ce que je vois de ma fenêtre. En pourtant GPSDrive, lui, me donne les bonnes coordonnées.

Mais mis à part ce "léger" problème qui devrait être réglé lorsque j'arriverais à attraper l'auteur sur iRC, l'outil me parait bien prometteur pour un type d'utilisateur tout particulier qui est la contribution au projet OpenStreeMap.

en effet, vicking permet de mémoriser les chemins parcourus et de les remonter sur le serveur OSM et ainsi améliorer cet génial système libre de cartographie. A tester donc, dés que je pourrais sortir de mon champ :-)

Sinon, l'autre projet extrêmement prometteur est NavIt qui vise à fournir sous GNU/Linux un outil libre comparable aux logiciels du marché type "TomTom". Il dispose d'une vue 2D du plan de route, mais aussi d'une vue 3D exploitant OpenGL. Il calcule les itinéraires et est même capable de parler pour vous indiquer les directions.

Pour l'instant NavIt est au stade "béta" mais le concept marche déjà bien. Mais comme c'est encore expérimental, il vous faudra compiler vous-même votre version (en tout cas pour Mandriva). Cela se fait sans aucun problème mis à part pour la 3D. En effet, NavIt utilise QuesoGLC qui chez moi refuse catégoriquement de compiler pour motif de GLU absent alors que cette librairie et les includes qui vont avec sont bien là. Ce n'est pas bien grave, tout est indépendant et l'on peut compiler en n'utilisant pas la vue 3D.

Une fois compilé et installé, il vous faut un fichier de configuration. Pour cela créez le dossier ~/.navit et recopiez y le fichier le fichier navit.xml qui se trouve dans les sources.

Ensuite il suffit de taper navit pour que ce dernier se lance sans problèmes et récupère bien la bonne position via gpsd. Le problème est qu'il n'a en standard qu'une carte de l'Allemagne. Pour avoir quelque chose d'exploitable en france, la solution est d'utiliser OpenStreetMap. Pour cela :

  • Allez sur le site http://www.openstreetmap.org/
  • Affichez la zone que vous voulez exporter.
  • Allez dans l'onglet Export.
  • Cliquez sur Manually select a different area.
  • Sélectionnez votre zone à exporter.
  • Cochez sur OpenStreetMap XML Data.
  • Clickez sur Export.

Au bout d'un temps, vous devriez recevoir un fichier map.osm. Une fois ce fichier téléchargé, il faut le convertir au format NavIt :

osm2navit ~/Bureau/map.osm > ~/.navit/maCarte.bin

La conversion terminée, éditez comme suit le fichier ~/.navit/navit.xml :

 <mapset enabled="yes">
 <map type="binfile" enabled="yes" data="~/.navit/maCarte.bin" />
 ...
</mapset>

Faite attention à ne pas ajouter cela dans un mapset qui ne soit pas enabled. Vous pouvez si vous le désirez supprimer les autres map. Ensuite il suffit de relancer navit et si vos coordonnées GPS sont sur la carte que vous avez importer, votre localisation devrait se faire.

Il existe aussi une extraction automatique de la carte de l'hexagone disponible ici. Attention, le fichier compressé fait plus de 50mo.

Conclusion

NavIt est clairement en phase de développement mais dispose déjà des fonctions de base qui permettent de suivre un itinéraire sans encombres sous réserve que la carte soit complète. En région parisienne, OpenStreetMap est plutôt précis, maintenant je ne saurais dire ce qu'il en est ailleurs. Mais avec Viking, si chez vous il donne les bonne coordonnées, vous allez pouvoir aider ce projet à s'affiner. Une manière simple pour qui n'est pas développeur de participer à l'édifice libre.

Pour ce qui est du BT-338, il marche vraiment très bien. La capture des satellites est très rapide, il est détecté sans aucun problème et à chaud par le système, bref, un achat conseillé pour GNU/Linux.