GPSを取り付けたRaspberry Piの現在位置をオフラインで地図に表示するには Navit版

Raspberry PiにGPS受信モジュールを取り付けて

そのRaspberry Piが現在どこにあるか、地図上にリアルタイムに表示したいと思います。

次の2種類の方法で表示可能です。

①Raspberry Piのディスプレイに表示する方法。地図をあらかじめダウンロードしておきますので、GPS信号を受信できればインターネット環境が無い山でも海でもリアルタイムに地図上に現在位置を表示可能です。②スマートフォンやPCのWebブラウザに表示する方法。①の画面にWi-Fi等のネットワーク経由で接続するかたちです。config.txtに画面サイズを設定することで、Raspberry Piにディスプレイを接続しなくても(ヘッドレスで)実現可能です。下図の青い丸が現在位置になります。

座標データをどこかにアップロードしたりせず、Raspberry Pi 1台のみで完結します。アカウント登録等は一切不要、位置データもRaspberry Piの外に出ることはありません(画像データのパケットはネットワーク上に流れますが)。地図もオープンなデータを使用させて頂き、費用もかかりませんでした。

このようなシステムの構築方法を記録しておこうと思います。


使用する機材と事前準備

タッチパネル付きディスプレイ

このような感じで、Raspberry Pi 3 Model Bに公式7インチタッチパネルとGPSモジュールを取り付けてみました。取り付け方法はこちらの記事になります。

もっと小さなカラーLCDでも大丈夫かと思いますが、DSI端子の場合Pi Zeroは対応しませんのでご注意下さい。

ディスプレイを取り付けて地図を表示しつつ、次のnoVNC設定を行うことで、同時にスマートフォンやPCで地図を表示することも可能です。

WebブラウザからRaspberry Piデスクトップ画面を操作

次の記事の設定を行うことで、Raspberry Piデスクトップ画面をWebブラウザで表示・操作することができます。

たとえばRaspberry Pi Zero WHに(ディスプレイを接続せずに)GPSのみ取り付け、Wi-Fiスマートフォンで現在位置を地図表示することも可能かと思います。


Navitのインストールと設定

地図の表示はNavitを使用させて頂きました。

Raspberry PiのOSはRaspbianを使用しました。aptコマンドでNavitのインストールが可能のようです。

ソフトウェアの設定は、全体的に次の流れになります。

  1. GPSモジュールを接続、gpsdが動作するように設定します。
  2. Navitをインストール、日本語表示設定を行います。
  3. 表示したい地域の地図をダウンロード、Navit用のバイナリファイル(binfile)にコンバートします。

3番のNavitのbinfile作成は、Raspberry Piではなく、Windows PCを使用しました。地図の大きさにより、Raspberry Piでは作業用メモリーが不足して、コンバートに失敗する場合があるためです。

GPSモジュールの取り付けとgpsd設定

基本的にこちらの記事と同じ内容になります。

2018年11月から3機の「みちびき」の運用が開始されました。再設定しつつ、gpsmonで「みちびき」の信号を受信できるかどうか確認してみました。

  1. 次の配線図に従い、GPSモジュールを接続します。
  2. /boot/cmdline.txtを編集して既存のシリアルコンソール(serial0)行をコメントアウト、tty1をコンソールとして設定します。
    sudo sed -i 's/^dwc_org.lpm_enable/\#&/g' /boot/cmdline.txt
    echo 'dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait' | sudo tee -a /boot/cmdline.txt

  3. systemd設定を変更し、シリアルコンソールを停止します。(Wi-Fi対応のRaspbrry Pi 3、Pi Zero Wの設定変更内容になります)
    sudo systemctl stop serial-getty@ttyS0.service
    sudo systemctl disable serial-getty@ttyS0.service
  4. UARTとPPSを有効にするため、/boot/config.txtに「enable_uart=1」行と「dtoverlay=pps-gpio,gpiopin=18」行を追加します。
    echo 'enable_uart=1' | sudo tee -a /boot/config.txt
    echo 'dtoverlay=pps-gpio,gpiopin=18' | sudo tee -a /boot/config.txt

    ※20.7.5追記:「,assert_falling_edge=true」付きが正しいとのご指摘を頂きましたので追記致します。

    echo 'enable_uart=1' | sudo tee -a /boot/config.txt
    echo 'dtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=true' | sudo tee -a /boot/config.txt
  5. /etc/modulesに「pps-gpio」行を追加します。
    echo 'pps-gpio' | sudo tee -a /etc/modules

  6. gpsd、gpsd-clients、pps-toolsをインストールします。
    sudo apt-get install gpsd gpsd-clients pps-tools

  7. /etc/default/gpsdを変更
    vi /etc/default/gpsd

    DEVICES、GPSD_OPTIONS等を設定します。

    START_DAEMON="true"
    DEVICES="/dev/ttyS0 /dev/pps0"
    GPSD_OPTIONS="-n"
  8. systemd設定を変更し、gpsd.socketサービスを有効にします。
    sudo systemctl enable gpsd.socket

  9. 再起動して設定変更を有効にします。
    sudo reboot
  10. ppstestやgpsmonコマンドでGPS信号を受信できているかどうか確認します。
    sudo ppstest /dev/pps0
    gpsmon

手持ちのGPSモジュールのファームウェアを更新させて頂いたところ、PRN番号193(みちびき初号機), 195(みちびき4号機)の2機のみちびきの信号を受信できていることを確認できました。


Navitのインストールと日本語表示設定

  1. aptコマンドでnavitをインストールします。
    sudo apt install -y navit

    Raspberry Piでnavit用の地図データを作る場合、maptoolを使用しますが、別のPCで作ることにしまして、インストールしませんでした。

  2. 日本語化するために各種フォントをインストールしました。
    sudo apt install xfonts-jisx0213 xfonts-intl-japanese fonts-ipafont fonts-noto xfonts-shinonome ttf-mscorefonts-installer

    このうち、Noto Sansフォントを設定させて頂きました。

  3. 使用可能なフォントファミリー名を確認します。
    fc-list |grep Noto

  4. /etc/navit/navit.xml設定ファイルは、navitをアップデートした場合に上書きされるようです。~/.navitディレクトリを作成し、コピーしておきます。
    mkdir ~/.navit
    cp /etc/navit/navit.xml ~/.navit
  5. navit.xmlのfont=行を変更して、日本語フォントを指定します。”Liberation Sans”を”Noto Sans CJK JP”に変更するかたちです。sedコマンドで書き換えてみました。
    sed -e 's/Liberation Sans/Noto Sans CJK JP/g' ~/.navit/navit.xml  |grep 'font='
    # 問題なければ-iで実際に変更を反映します
    sed -i 's/Liberation Sans/Noto Sans CJK JP/g' ~/.navit/navit.xml

  6. 以上でNavitの日本語化が完了しました。実際に起動してみると、gpsdと連携して現在位置が表示されますが、地図が無いため寂しい感じです。
    navit -c ~/.navit/navit.xml

    上図はOSDのcompassとnavigation_next_turnを有効にしたため、画面左側に矢印(コンパス)が表示されています。navit.xmlを変更して、各種ボタンやメーターを表示、カスタマイズできるようです。


地図データのダウンロード

binファイルを直接ダウンロード

※19.3.2追記:地図は、こちらからbinファイルを直接ダウンロードする方法のほうが、正確で簡単のようです。

ダウンロード後、記事の後方「Navitのbinfile有効化」でXMLファイルに登録すると、ダウンロードした地図が表示されます。

pbfファイルのbinファイル変換手順

以下の方法は、pbfファイルからbinファイルを作成する方法になりますが、変換エラーでありえない道が表示される場合があるようです。


地図データは、Open Street Map(OSM)を使用させて頂こうと思います。

最初、日本全土の地図を入れようと思いましたが、データが大きすぎてうまく表示できませんでした。

データを分割して入れたほうが地図表示の速度も早いようですので、Asia→Japan→Kantō region(関東)のosm.pbfファイルをダウンロードさせて頂きました。ダウンロードしたpbfファイルをNavitのバイナリファイルに変換しようと思います。


OSM(PBF)ファイルからNavit用binfile作成

Raspberry Piのメモリー使用可能量の問題から、PBFからNavitのbinfileへの変換はWindows PCを使用しました。

Linuxのmaptoolコマンドを使用する必要があるため、Vagrantをインストールして、Windowsの中でUbuntu 18.04を起動しました。

Vagrant環境作成のこちらの記事と同じ流れになります。

最近公開されましたVirtual Box 6.0を使用させて頂きましたが、問題なく動作致しました。

  1. VirtualBox本体、VirtualBox Extension Pack、Vagratをダウンロードしてインストールします。
  2. 動作用のフォルダを作成、boxにubunt 18.04公式イメージを追加、フォルダを初期化してVagrantfileを作成しました。
    mkdir ubuntu-18.04
    cd ubuntu-18.04
    vagrant box add ubuntu/bionic64
    vagrant init ubuntu/bionic64

  3. Vagrantfileを編集します。
    config.vm.synced_folder "./", "/vagrant_data"
    config.vm.provider "virtualbox" do |vb|
      vb.memory = 8192
    end

    • 作業用フォルダを/vagrant_dataへマウント
    • メモリー使用量を8192MB(8GB)に変更しました。
  4. 作成した作業用フォルダに、ダウンロードしたpbfファイルをコピーしておきます。ダウンロードした関東の地図は「kanto-latest.osm.pbf」というファイル名でした。
  5. ubuntuを起動、sshに接続します。
    vagrant up
    vagrant ssh

  6. アップデート実行後、maptoolをインストールします。
    sudo apt update
    sudo apt install maptool
  7. pbfファイルをnavitのbinfileへコンバートします。
    cd /vagrant_data
    maptool --protobuf -i kanto-latest.osm.pbf kanto-latest.bin

  8. ファイル名をlatestから日付に変更しながら、Raspberry PiへSCPでコピーしました(Raspberry PiのSSHサーバ機能が有効になっている必要があります)。
    scp kanto-latest.bin pi@<Raspberry PiのIPアドレス>:/home/pi/kanto-181223.bin

vagrantのシャットダウンは「vagrant halt」コマンド、vagrantマシンを削除する場合「vagrant destory」にて行えるようです。


最後に作成したbinfileを有効にします。

  1. Raspberry Piのターミナルにログインします。
  2. /home/pi/mapsに地図を入れようと思います。
    mkdir maps
    mv kanto-181223.bin maps/
  3. ~/.navit/navit.xmlファイルを変更します。
    vi ~/.navit/navit.xml

    394行目付近、mapsetタグを追加します。

    <mapset enabled="yes">
        <map type="binfile" enabled="yes" data="/home/pi/maps/kanto-181223.bin"/>
    </mapset>

    他のmapsetタグのenabled属性は”no”に変更しておきました。

以上で設定が完了しました。navitを起動してみます。

navit -c ~/.navit/navit.xml

地図上に、現在位置が表示されましたでしょうか?

マウスホイールで拡大/縮小、左クリックでメインメニューが表示されます。

GPSの緯度・経度情報の表示、画面の最大化、地図の表示モード変更等を行えるようです。


現在位置を地図表示したい場合、拡大/縮小で倍率を調節すれば、場所がわかるかと思います。

Navitを本格的なカーナビとして使用したい場合、navit.xmlファイルをいろいろとカスタマイズして、ボタンや情報の表示を行う必要があるようです。

カーナビの自作にご興味がありましたら、いろいろと試してみるのも(少し大変かもしれませんが)面白いかと思います。

インターネットの常時接続が必要になりますが、Google Mapで地図を表示する記事はこちらになります。

スポンサーリンク

フォローする

スポンサーリンク

コメント

  1. クロ より:

    初めまして!rasberypi最近きになって購入した超初心者のものですが、Navitがsudo apt install -y navitでは 入手できなくてこまっております。なにか手順が間違っているのかわからないのですが、他に入手する方法などはありますでしょうか???

    • hide より:

      クロさん はじめまして。
      コメント頂きまして、誠にありがとうございます。

      ふむふむ、navitが入手できないとのことで、お困りかと思います。
      お使いのOSは、Raspberry Pi OSでしょうか?

      手持ちのRaspberry Pi 4で動かしているUbuntu 20.04 LTSですが、次のコマンドで、navitがインストール可能かどうか検索してみました。
      sudo apt update apt search navit
      次のような感じで、検索結果が表示されました。
      maptool/focal 0.5.4+dfsg.1-2 arm64 Converts OpenStreetMap maps to Navit navit/focal 0.5.4+dfsg.1-2 arm64 Car navigation system with routing engine navit-data/focal 0.5.4+dfsg.1-2 all Car navigation system with routing engine - data files navit-graphics-gtk-drawing-area/focal 0.5.4+dfsg.1-2 arm64 Car navigation system with routing engine - GTK+ graphic plugin navit-gui-gtk/focal 0.5.4+dfsg.1-2 arm64 Car navigation system with routing engine - GTK+ GUI navit-gui-internal/focal 0.5.4+dfsg.1-2 arm64 Car navigation system with routing engine - internal GUI
      この場合、navitのバージョンfocal 0.5.4+dfsg.1-2が配布されているようですので

      sudo apt install navit

      でインストールできそうです。

      よろしければ、上記の

      apt search

      コマンドで、navitがダウンロード可能かどうか調べてみてはいかがでしょうか?

  2. クロ より:

    hideさん
    お返事ありがとうございます!早速試してみようかと思います!後ほど結果をご報告いたします。

  3. クロ より:

    hideさん。
    なんとかnavitをインストールして立ち上げることができました!
    ありがとうございます。
    そのまま進めていったのですが、
    394行目付近、mapsetタグを追加します。
    のxmlファイルを変更ができてなく、上書き保存ができないとでており行き詰ってしまいました。
    通常ロックがかかっているものなのでしょうか?

    • hide より:

      クロさん こんばんは。
      xmlファイルの編集ができないそうですが。ふむふむ。

      vi ~/.navit/navit.xml
      こちらのファイルの編集で、ロックがかかっている感じでしょうか?

      ~は、ホームディレクトリを表しています。
      ログインしたユーザのホームですので、基本的にはファイルの作成・編集は自由のはずです。
      ロックはかかっていないと思います。確認コマンドは以下になります。
      ls -al ~/.navit/

      もしもファイルの所有者がrootユーザに変わっている場合、ロックがかかってしまいます。
      その場合、sudo付きでコマンドを実行することで、rootユーザとしてコマンドを実行して上書きできると思います。
      sudo vi ~/.navit/navit.xml

      sudo付きでコマンドを実行して、編集して頂く方法が良いかもしれません。

  4. クロ より:

    hideさん
    色々試して、結果できるようになりました!大変おせわになりましたありがとうございます!

    • hide より:

      クロさん こんばんは。

      うまく進められたようで、安心致しました。
      解決されて、素晴らしいです!

      こちらこそ、嬉しい書き込みを頂きまして、ありがとうございました。

  5. クロ より:

    hideさん ありがとうございました。
    現在 無謀にもラズベリーパイを用いてのガジェットを作りたいと思い、いろいろ調べているのですが、手も足もでず、困っておりまして、よければ相談に乗っていただけないでしょうか。

    • hide より:

      クロさん こんばんは。
      ガジェットをお作りとのことで、色々と試行錯誤されている感じでしょうか?

      ご相談とのお話で、ふむふむ。
      私など、なにかお役に立てるかわかりませんが、こちらのコメント欄に、クロさんが自由に書き込み頂くのは全く問題ありませんです。
      コメント欄で差し支えなければ、いつでも何でも書き込み頂いて大丈夫です。