Rasperry PI als Navigationsgerät mit Touchscreen verwenden

Benutzeravatar
Alx83
Entwickler Team
Beiträge: 632
Registriert: Mo 12. Mär 2012, 22:48
Has thanked: 4 times
Been thanked: 3 times
Kontaktdaten:

Rasperry PI als Navigationsgerät mit Touchscreen verwenden

Beitrag von Alx83 »

Als Basis für dieses HowTo, geh' ich von einem Raspberry Pi mit Raspbian als OS aus.
Als Bildschirm hab ich diesen hier verwendet: LINK
und diesen GPS-Stick: LINK

1. Grundlagen:

Spoiler
Show
Zunächst bringen wir ein mal das OS auf den aktuellen Stand:

Code: Alles auswählen

sudo apt-get update && sudo apt-get upgrade
Danach installieren wir die benötigten Pakete um Navit zu kompilieren:

Code: Alles auswählen

sudo apt-get install subversion espeak cmake freeglut3-dev imagemagick libdbus-1-dev libdbus-glib-1-dev libdevil-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libgarmin-dev libglc-dev libgps-dev libgtk2.0-dev libimlib2-dev libpq-dev libqt4-dev libqtwebkit-dev librsvg2-bin libsdl-image1.2-dev libspeechd-dev libxml2-dev ttf-liberation
Für die Unterstützung des GPS-Sticks, brauchen wir noch folgende Pakete:

Code: Alles auswählen

sudo apt-get install gpsd gpsd-clients python-gps
Damit der Bildschirm komplett ausgefüllt wird, muss noch /boot/config.txt angepasst werden:

Code: Alles auswählen

sudo nano /boot/config.txt
Hier die vorhandenen Werte mit denen überschreiben:

Code: Alles auswählen

overscan_left=-4
overscan_right=-2
overscan_top=-14
overscan_bottom=-18
Nun muss ermittelt werden, ob der GPS-Stick korrekt erkannt wurde und über welche Schnittstelle er erreichbar ist:

Code: Alles auswählen

dmesg | grep ttyUSB
[    7.930852] usb 1-1.2: pl2303 converter now attached to ttyUSB0
Der Stick sitzt alsp an ttyUSB0, also starten wir den GPS-Deamon testweise wie folgt:

Code: Alles auswählen

gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
Mit cgps-s kann man testen, ob das Ganze arbeitet:

Code: Alles auswählen

┌───────────────────────────────────────────┐┌─────────────────────────────────┐
│    Time:       2013-08-18T15:05:10.0Z     ││PRN:   Elev:  Azim:  SNR:  Used: │
│    Latitude:    51.231848 N               ││  14    43    249    40      Y   │
│    Longitude:    0.514014 E               ││  25    75    283    37      Y   │
│    Altitude:   132.3 m                    ││   2    26    085    31      Y   │
│    Speed:      0.0 kph                    ││  12    56    070    18      Y   │
│    Heading:    0.0 deg (true)             ││   9    19    133    22      Y   │
│    Climb:      0.0 m/min                  ││  27    09    133    17      Y   │
│    Status:     3D FIX (1 secs)            ││   4    17    045    31      Y   │
│    GPS Type:                              ││  32    05    321    20      Y   │
│    Longitude Err:   +/- 8 m               ││  29    41    192    18      Y   │
│    Latitude Err:    +/- 9 m               ││  31    28    304    42      Y   │
│    Altitude Err:    +/- 27 m              ││                                 │
│    Course Err:      n/a                   ││                                 │
│    Speed Err:       +/- 68 kph            ││                                 │
│                                           ││                                 │
│                                           ││                                 │
│                                           ││                                 │
│                                           ││                                 │
│                                           ││                                 │
└───────────────────────────────────────────┘└─────────────────────────────────┘
GPSD startet bei jedem Systemstart, funktioniert aber nicht. Selbst nach dem Befehl sudo update-rc.d gpsd remove wird es noch von irgendwo her gestartet.
Hierfür habe ich nur eine dreckige Lösung, die aber wenigstens funktioniert:

Zuerst hab ich den Daemon für GPSD entfernt:

Code: Alles auswählen

sudo rm /etc/init.d/gpsd
Dann neuen Daemon mit dem Namen gpsdrestart angelegt:

Code: Alles auswählen

sudo nano /etc/init.d/gpsdrestart
Dort kam dann folendes rein:

Code: Alles auswählen

#! /bin/sh
# /etc/init.d/gpsdrestart

touch /var/lock/gpsdrestart

case "$1" in
start)
echo "Töte gpsd... "
killall gpsd
echo "Starte gpsd neu... "
gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
;;
*)
echo "Usage: /etc/init.d/navit {start}"
exit 1
;;
esac
exit 0
Nun noch den Autostart aktivieren:

Code: Alles auswählen

sudo update-rc.d gpsdrestart defaults

Es besteht auch noch die Möglichkeit, via GPS die Systemzeit zu aktualisieren:
]Hierzu muss NTP installiert werden:

Code: Alles auswählen

sudo apt-get install ntp
Jetzt muss noch folgendes in die /etc/ntp.conf unter die existierenden Server hinzugefügt werden:

Code: Alles auswählen

# gps ntp
server 127.127.28.0 minpoll 4
fudge  127.127.28.0 time1 0.183 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge  127.127.28.1 refid PPS
Zum Schluss noch NTP neustarten:

Code: Alles auswählen

sudo service ntp restart
Mit ntpq -p kann nun geprüft werden, ob es funktioniert:

Code: Alles auswählen

pi@raspberrypi:~$ ntpq -p
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ns1.luns.net.uk 33.117.170.50    2 u   54   64    7   65.454    2.666   5.800
+resntp-b-vip.lo 127.151.91.34    3 u   45   64   17   55.704   -5.169   8.482
+bart.nexellent. 194.242.34.149   2 u   17   64   17   76.585   -4.271  57.595
+v01.s01.be.it2g 193.190.230.65   2 u   20   64   37   86.464   -2.374 228.460
xSHM(0)          .NMEA.           0 l   11   16  377    0.000  144.714   3.026
SHM(1)          .PPS.            0 l    -   16    0    0.000    0.000   0.000
2. Austauschen des Kernels gegen Kernel mit Touch-Modul:
Spoiler
Show
Den passenden Kernel gibt's hier zum Download:

Code: Alles auswählen

wget http://andrei-development.googlecode.com/files/kernel_3_6_11_eGalax_feb_2013.tar.gz
Danach entpacken:

Code: Alles auswählen

cd ~
tar -xzf kernel_3_6_11_eGalax_feb_2013.tar.gz
Die kernel.img Datei ersetzen:

Code: Alles auswählen

sudo cp ~/kernel_3_6_11_eGalax_feb_2013/kernel.img /boot/kernel.img
/lib ersetzen:

Code: Alles auswählen

sudo cp -r lib /lib
Im Anschluss neustarten
3. Kalibrieren des Touchscreens:
Spoiler
Show
Herunterladen des Kalibrators:

Code: Alles auswählen

cd ~
wget http://github.com/downloads/tias/xinput_calibrator/xinput_calibrator-0.7.5.tar.gz
Entpacken:

Code: Alles auswählen

tar -xf xinput_calibrator-0.7.5.tar.gz
Kompilieren:

Code: Alles auswählen

cd xinput_calibrator-0.7.5
./configure
sudo make
sudo make install
Über folgenden Befehl kann der Kalibrator aus der Konsole gestartet werden:

Code: Alles auswählen

xinput_calibrator
Der Kalibrator gibt am Ende dann die Werte aus. Da die Einstellungen einen Neustart nicht überleben, müssen sie noch gesichert werden:

Code: Alles auswählen

sudo nano /usr/share/X11/xorg.conf.d/01-input.conf
Der Inhalt sieht bei mir so aus:

Code: Alles auswählen

Section "InputClass"
Identifier "calibration"
MatchProduct "eGalax Inc. USB TouchController"
Option "Calibration" "56 1980 1876 111"
EndSection

4. Kompilieren von Navit:

Spoiler
Show
Jetzt wird die aktuelle Version von Navit mit folgenden Befehlen ausgecheckt:

Code: Alles auswählen

cd ~
svn co svn://svn.code.sf.net/p/navit/code/trunk/navit/ navit
Nun erstellen wir ein Verzeichnis und kompilieren Navit:

Code: Alles auswählen

mkdir navit-build
cd navit-build
cmake ~/navit
make
Dies dauert auf dem Raspberry leider etwas.

Um zukünftig navit mal up zu daten, muss geht man wie folgt vor:

Code: Alles auswählen

cd /home/pi/navit
svn update
Danach, wie oben beschrieben, neu kompilieren.

Als nächstes brauchen wir noch eine Karte.
Diese kann hier heruntergeladen werden: LINK
5. Anpassen der navit.xml:
Spoiler
Show
Nun muss noch der Speicherort der Karte, sowie ihr Namen in der navit.xml angepasst werden.
Diese findet sich hier und wird wie folgt angepasst:

Code: Alles auswählen

cd ~/navit-build/navit
nano navit.xml
Ich habe die Karte dann europa.bin genannt und auf einen USB-Stick kopiert, der Pi-Car heißt und die navit.xml wie folgt bearbeitet:
Einmal die die Beispielkarte deaktiviert:

Code: Alles auswählen

<mapset enabled="no">
<xi:include href="$NAVIT_SHAREDIR/maps/*.xml"/>
</mapset>
dann noch die eigene OpenStreetMap aktiviert:

Code: Alles auswählen

<!-- Mapset template for openstreetmaps -->
<mapset enabled="yes">
<map type="binfile" enabled="yes" data="/media/Pi-Car/map/europa.bin"/>
</mapset>
Damit sich die Karte mit der Fahrtrichtung dreht, muss noch folgendes geändert werden:
<navit center="4808 N 1134 E" zoom="256" tracking="1" orientation="-1" recent_dest="10" autozoom_active="1">

Mein Navit sieht so aus:
navit52yt0.png
navit52yt0.png (57.38 KiB) 540 mal betrachtet
Um dies zu erreichen, hab ich am Ende der Datei noch folgendes eingefügt:

Code: Alles auswählen

        <!-- Anzeige-Einstellungen -->

        <!-- Zoom-Buttons -->
        <osd enabled="yes" type="button" x="10" y="-116" command="zoom_in()" src="zoom_in.png"/>
        <osd enabled="yes" type="button" x="10" y="-55" command="zoom_out()" src="zoom_out.png"/>
        <!-- aktuelle Geschwindigkeit -->
        <osd enabled="yes" type="text" label="${vehicle.position_speed}" x="10" y="60" font_size="800" w="205" h="55" align="4" background_color="#c63030cc"/>
        <!-- Anzeige der Fahrtrichtungsänderung -->
        <osd enabled="yes" type="navigation_next_turn" font_size="350" x="10" y="130" w="100" h="100"  background_color="#c63030cc" icon_src="$NAVIT_SHAREDIR/xpm/%s_wh_48_48.png" />
        <!-- Entfernung zur nächsten Fahrtrichtungsänderung -->
        <osd enabled="yes" type="text" label="${navigation.item[1].length[named]}" font_size="350" x="10" y="240" w="100" background_color="#c63030cc" />
        <!-- Name der Straße, auf der man sich gerade befindet -->
        <osd enabled="yes" type="text"label="Aktuelle Straße: ${navigation.item.street_name_systematic}" x="-805" y="10" align="0" background_color="#c63030cc" font_size="550" w="795" h="40"/>
        <!-- per GPS errechnete Höhe über Meer (dies ist zwar recht ungenau, aber dennoch oftmals von Interesse) -->
        <osd enabled="yes" type="text" label="${vehicle.position_height} m" x="-80" y="55" w="70" h="40" background_color="#c63030cc"/>
        <!-- GPS-Status -->
        <osd enabled="yes" type="gps_status" x="-60" y="100" w="50" h="40" background_color="#c63030cc"/>
        <osd enabled="yes" type="text" label="${vehicle.position_sats_used}/${vehicle.position_qual}" x="-60" y="140" w="50" h="25" background_color="#c63030cc"/>
        <!-- voraussichtliche Ankunftszeit -->
        <osd enabled="yes" type="text" label="Ankunftszeit ${navigation.item.destination_time[arrival]}" x="70" y="-30" w="200" h="30" background_color="#c63030cc"/>
        <!-- Restdistanz -->
        <osd enabled="yes" type="text" label="Restdistanz ${navigation.item.destination_length[named]}" x="270" y="-30" w="200" h="30" background_color="#c63030cc"/>
        <!-- Restzeit - Wie lange die Fahrt noch dauert -->
        <osd enabled="yes" type="text" label="Restzeit ${navigation.item.destination_time[remaining]}" x="470" y="-30" w="200" h="30" background_color="#c63030cc"/>
Falls jemand die ganze Navit.xml will bitte ne PN schreiben, sie ist zu groß für dieses HowTo

6. Navit in LXDE integrieren:
Spoiler
Show
Wenn man sich Navit selbst kompiliert, fehlt leider noch die Integration als Symbol im Menü.
Und Autostart wäre ja auch nicht schlecht. Hierzu sind wieder einige Schritte notwendig:

Ein Bash-Datei zum Starten anlegen:

Code: Alles auswählen

sudo nano /usr/bin/navit.sh
Diese soll folgenden Inhalt haben:

Code: Alles auswählen

#!/bin/bash
cd /home/pi/navit-build/navit
./navit
Dannn noch die passende Rechte:

Code: Alles auswählen

chmod 755 /usr/bin/navit.sh
Jetzt wird die Datei für den Startmenü-Eintrag angelegt und befüllt:

Code: Alles auswählen

sudo nano /usr/share/applications/Navit.desktop
Inhalt:

Code: Alles auswählen

[Desktop Entry]
Version=1.0
Name=Navit
Name[de]=Navit
Name[fr]=Navit
Comment=The open source vector based navigation program with routing engine
Comment[de]=Ein vektorbasiertes Navigationsprogramm
Comment[fr]=Le logiciel opensource de navigation vectorielle
Exec=/usr/bin/navit.sh
Icon=/usr/share/icons/hicolor/128x128/apps/navit.png
StartupNotify=true
Terminal=false
Type=Application
Categories=GTK;Utility;Geography;
GenericName=Navit
GenericName[de]=Navit
Um Navit direkt beim Hochfahren starten zu lassen, die Datei noch nach /$HOME/.config/autostart kopieren:

Code: Alles auswählen

cp /usr/share/applications/Navit.desktop /$HOME/.config/autostart/
Falls die Verzeichnisse nicht vorhanden sind, ggf. mit mkdir /$HOME/.config/autostart anlegen

Damit das Ganze auch noch schön ausschaut, das Bild unten noch nach /usr/share/icons/hicolor/128x128/apps/navit.png kopieren:
Quellen:
http://engineering-diy.blogspot.de/2013 ... creen.html
http://blog.retep.org/2012/06/18/gettin ... pberry-pi/
http://wiki.navit-project.org/index.php ... figuration

Dieses HowTo ist mit Sicherheit noch nicht vollständig. Es fehlt zum Beispiel noch die Sprachausgabe, diese werde ich bei Gelegenheit nachreichen.
Es soll später auch noch ein HowTo für XBMC werden. Hier gibt's aber noch Probleme mit dem Touchscreen.
Auf den Alkohol! Die Ursache und Lösung aller Probleme - Homer J. Simpson

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast