Raspberry Piを使って位置情報を取得する

## 動作環境
Raspberry Pi 4 （OS : Raspberry Pi OS Lite 32bit）
MacBook Pro 13-inch, M1, 2020 （OS : Monterey v12.6）
GPSレシーバー : VKLSVAN VK172 G-MOUSE USB GPS/GLONASS GPS Receiver Module Support Windows 8/7/Vista/XP/CE


## Introduction
現在、Raspberry Piを用いてオフラインWeb地図サーバー[「UNVT Portable」](https://github.com/unvt/portable)の作成を行っています。UNVT Portableは災害時等のオフライン環境下でも、難しい設定なしでQRコードを読み込むだけで、スマートフォン等のデバイスを使ってWeb地図の閲覧を可能にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/379d9056-55cf-bc87-e058-9cc8a5292f47.png)

詳細については以下のリンク先にまとめていますので、目を通していただけると幸いです。

GitHub: https://github.com/unvt/portable
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/46871c60-eae2-3192-dffe-3182978b8904.png)

UNVT Portableを実際に使ったデモ動画: https://youtube.com/shorts/_ZqT9D-Pfos
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/db41a2f3-d40a-ed6c-02a6-88b93d13c616.png)


## 今回やりたいこと
いままでは、静的な地図をただ表示することしかできませんでした。
ここに利用者の現在位置を表示できるように設計し直したいと考えました。

そこで、以下の戦略で実装してみることにしました。
```
1. Raspberry PiにGPSレシーバーをつけて位置情報を取得できるようにする。
2. 取得した位置情報をWebページに表示するためにRaspberry PiをSSL化する ##取得した位置情報をWeb上で表示するにはSSL化が必要なため
```

1と2の全てを1つの記事にまとめるとかなりの分量になりそうなので、この記事では1の位置情報を取得することに焦点を絞り執筆していきます。2については別の記事で詳しく書く予定です。

## 実装
当たり前ですが、位置情報を取得するにはGPSレシーバーが必要です。
Raspberry Piには位置情報を取得する装置が初期仕様では搭載されていないので、後付けする必要があります。今回は[以下のGPSレシーバー](https://www.amazon.co.jp/VKLSVAN-G-MOUSE-GLONASS-Receiver-Support/dp/B07SMRZ929/ref=sr_1_2_sspa?crid=11QGLN5Z8ZY9C&keywords=gps+%E3%83%AC%E3%82%B7%E3%83%BC%E3%83%90%E3%83%90%E3%83%BC&qid=1671842640&sprefix=gps%E3%83%AC%E3%82%B7%E3%83%BC%E3%83%90%E3%83%BC%2Caps%2C172&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyVzdRODdDTURPSlNFJmVuY3J5cHRlZElkPUEwNDE4NTcxMjNBU01DMDQ0UDRWWSZlbmNyeXB0ZWRBZElkPUEzMjVKU0Y2R0RaSTVVJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)を使いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/07a8a6d0-a627-69b7-603a-dfacc27ef6fd.png)

GPSレシーバーをRaspberry Piに挿入したあと、自前のPC（MacBook Pro 13-inch, M1, 2020, OS : Monterey v12.6）からRaspberry Piにssh接続を行います。
![IMG_3054.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/ea4ae650-c581-0fa4-0a09-f12e289078ed.jpeg)

ssh接続が完了したら、```lsusb```コマンドを入力します。
```lsusb```は入力されているUSBデバイスの情報を表示するコマンドです。

入力すると以下のようになります。
```
pi@unvtportable:~ $  lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 1546:01a7 U-Blox AG [u-blox 7] ##これがGPSレシーバー
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/6079ad26-d8b9-087e-dc8c-650a66e85c03.png)

``` Bus 001 Device 003: ID 1546:01a7 U-Blox AG [u-blox 7]```がGPSレシーバーであり、無事に入力されていることが確認できました。

次はGPSレシーバーで実際に位置情報を取得してみます。単にGPSレシーバーを挿入しただけでは、位置情報は取得ができないので、GPS デバイスと通信する gpsd と呼ばれるGPSデーモンとそのクライアントをインストールします。以下のコマンドを入力しましょう。
``` 
sudo apt-get install -y gpsd gpsd-clients
```
無事にインストールが完了したら、実際に測位の状況を確認してみましょう。以下のコマンドを入力します。
```
cgps -s -u m
```
すると以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/1dc1adbd-d988-4566-16c2-d3cd674d5656.png)
画面左側に映るのが、現在地の情報で画面右側には捕捉している衛星が出力されます。
初めて測位を行う際は、コールドスタートといって、位置情報がわかるまでに時間（約10分程度）がかかります。また、屋内であったり、周りに高い建物があった場合、衛星を捕捉できずにいつまで経っても位置情報が出力されないことがあります。筆者も最初はカフェの中でこの作業をしていたのですが、衛星を捕捉できず1時間たっても位置情報が取得できませんでした。公園や家のベランダなど外に開けた環境で作業することをおすすめします。

## 感想
Raspberry Piは本当に優秀で、GPSレシーバーを使うためのドライバの設定等は一切なく、GPSレシーバーを挿入し、GPSデーモンをインストールするだけで位置情報を取得することができました。本記事では、位置情報の取得をメインで書きましたが、次回の記事（現在執筆中...）では実際に測位した情報をWeb地図に展開する手法について書いていこうと思います。ここまで読んでいただきありがとうございました。

*本記事は[Smart Maps Advent Calendar 2022](https://qiita.com/advent-calendar/2022/smart-maps)に投稿しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467847/e6cad0c0-9b93-af48-7573-b5b4eb461e06.png)