![見出し画像](https://assets.st-note.com/production/uploads/images/25431552/rectangle_large_type_2_33a891b16269eb6605257d6c52de4bf4.jpg?width=1200)
GPSタイムサーバーの構築
#earthMetronome 構想は、とても正確な時刻同期を前提としています。ここでは、ローカルネットワーク上でGPSに同期した時刻サーバーを設定してみます。
どうしてそんなものが必要?
earth Metronome 構想では、音楽・映像などに関係するすべてのイベントが、全地球で一つだけの時間尺度で動作することを目標としています。ネットワークでもし遅延があっても、最大1フレーム以内、できれば10ミリ秒(1/100秒)以下ですべてのものが同期する。もちろん、世界各地へのデータ伝送はそれなりに時間がかかるわけですが、
・これから起こるイベントは、正確な世界共通時間で起動され、
・過去に起こったイベントは、正確な世界共通時間で記録される
ことによって、すべてのイベントが同期して起こり、また起こったイベントは後で同じ時間軸上にまとめることができます。
たとえば、世界各地でバラバラに収録した映像や音声データでも、正確な時間軸情報が記録されていれば、一瞬で同じ時間で「そろえる」ことができるようになります。
すでにあるんじゃないの?
インターネット上にはすでにNTPプロトコルを使った時刻サーバーが公開されており、それらは原子時計や日本標準時の基準時計に接続されています。
WindowsやMacOSはデフォルトでそれらの時刻サーバーに時刻同期しますし、スマートフォンは基地局のGPSレシーバからの信号で正確に時刻同期します。
ちなみにGPSは位置情報のための仕組みですが、GPS衛星の中にとても正確な時計が内蔵されていて、その時刻情報も電波で取得することができます。その精度はだいたい10の11乗分の1、つまり3100年で1秒ずれる、くらいです。
ただ、NTPサーバーが実現する時刻同期は、秒単位ではもちろん正確なのですが、それ以下の基準となるといささか怪しいようです。というのは、基本的にネットワークを通じて同期している関係上、ネットワーク上の混雑やパケットロスなどによって「揺らぎ」が出てしまうからです。また、もし基準時とパソコン内部の時計がずれていた場合、一気に合わせるとシステムやプログラムの動作に影響を与えかねないので、「徐々にあわせていく」仕組みが入っています。逆に言うと、ある時点でほんとに基準時に同期しているかどうかは、プログラムからはわかりません。
映像の場合、1秒間に25から60枚の連続した絵で構成されています。これをフレームといいますが、1フレームが40ミリ秒から18ミリ秒しかないため、もしこのフレーム単位で正確に同期をとるなら、それ以下の精度の時刻管理が必要になります。このタイムサーバーはその時刻情報を提供します。
プロトタイピング
材料さえそろえば次のステップでとりあえず正確な時刻サーバーを構築はできます。
基本的に、ここに書いてあることがすべてです。
必要なものは、
- Raspberry Pi 3 B (4でも動きますが、発熱が大きいので常時動かすには向かないかも)
- Raspberry PiのOSを格納するmicro SDXCメモリカード 32GB UHS-I U3推奨
- GPSモジュール 1pps出力対応 - これが安くて使いやすい
- GPSモジュールとRasberry Pi 3をつなぐケーブル - こういうやつ
- Raspberry Pi 3用電源。USB micro Bで3Aぐらいあれば余裕 - こういうのとか
で、Raspberry Pi というちいさなコンピュータにGPSモジュールを接続してGPSから時刻情報ととても正確な1秒単位の「パルス(時報みたいなもの)」を取得し、その信号を
で、インターネット標準のNTPサーバーとして立ち上げます。そして、同じサブネットのLAN上にいるPCやスマホと正確な時刻同期ができるようにします。
動作検証
もう一つのRaspberry Piの時刻同期(systemd-timesyncd)を新しく作ったNTPサーバーに合わせ、しばらく時間をおいてから、
ntpdate -q NTPサーバーアドレス
でオフセットを測定します。
server 192.168.100.41, stratum 1, offset 0.000559, delay 0.02748
11 May 18:50:09 ntpdate[16898]: adjust time server 192.168.100.41 offset 0.000559 sec
server 192.168.100.41, stratum 1, offset 0.000224, delay 0.02779
11 May 18:50:10 ntpdate[16899]: adjust time server 192.168.100.41 offset 0.000224 sec
server 192.168.100.41, stratum 1, offset 0.000419, delay 0.02719
11 May 18:50:11 ntpdate[16900]: adjust time server 192.168.100.41 offset 0.000419 sec
server 192.168.100.41, stratum 1, offset 0.001807, delay 0.02997
11 May 18:50:11 ntpdate[16901]: adjust time server 192.168.100.41 offset 0.001807 sec
server 192.168.100.41, stratum 1, offset 0.000396, delay 0.02715
11 May 18:50:12 ntpdate[16902]: adjust time server 192.168.100.41 offset 0.000396 sec
server 192.168.100.41, stratum 1, offset 0.000401, delay 0.02716
11 May 18:50:13 ntpdate[16903]: adjust time server 192.168.100.41 offset 0.000401 sec
といった感じで、おおむね2ミリ秒以下、だいたい1ミリ秒を切るぐらいの正確さでGPS時刻に同期できていることがわかりました。
今後の計画
これを、「メトロノーム・サーバー」と名付けて、正確な時間をベースに、以下のような機能を実装していきます。
1秒以下の同期
一秒パルスをサーバーがUDPでブロードキャストして、クライアントが最低10秒、できれば90秒くらいのパルスを拾って平均化して位相比較、つまり「ネットワーク - ソフトウェアPLL」して自分のクロックチック(コンピュータの中のクロック - 1マイクロ秒かそれ以下)との位相ずれを保持しておいて、それと同期して動く
タイムコードの提供
0:00:00始まりの29.97フレーム/秒度フロップフレーム(DF)ありのもの、25フレームDFなし、24フレームDFなし、60フレームDFなしの4種類をREST APIで提供
ビートクロックの供給
詳細後日 / TBD
技術情報 - Windowsにおけるより正確な時刻同期
(MacOSについては後日調査)
Windows Server 2016, and Windows 10 version 1607 or later、では、これまでのWindowsの1ミリ秒単位までの時刻同期を改善し、さらに正確な時刻同期ができる仕組みを提供しているようです。
サポート Welcome! いただいたサポートは今後の研究開発や寄付に使わせていただきます。