仮想AISターゲットでアナログ時計を作ってみた

2025/4/1 7M4MON


相模湾沖に出現させたアナログ時計表示船隊

最近、AISを使ってちょっと変わった遊びができないか考えていました。
その結果思いついたのが、仮想の船を複数出現させて、OpenCPN上にアナログ時計を描くというアイデアです。

最初に大事なことを書いておくと、これは電波を出しているわけではありません
PC上でAISのNMEA文字列を生成して、それをアプリケーションに入力しているだけです。
つまり、無線で何かを送信しているわけではなく、あくまでソフトウェア上でAISっぽい情報を作って遊んでいるだけなので、安全な実験です。

AISとは

AIS(Automatic Identification System)は、船舶が自船の情報を自動送信し、お互いの位置や進行方向などを把握するための仕組みです。
船名、MMSI、位置、速度、進行方向などの情報を送ることで、周囲の船や陸上設備がそれを受信し、画面上に船舶を表示できます。

海図ソフトやプロッター上では、AISターゲットが地図上に船として表示されるため、周囲の状況を把握するのにとても便利です。

今回はその仕組みのうち、「AISターゲットが画面上に表示される」という部分だけを使って遊びます。

仮想の船を出現させる

今回やったことは単純で、AISのNMEA文をPythonで生成し、複数の仮想船を作ることです。

中心には基準となる船を1隻置き、その周囲に船を並べて、

を表現しました。

つまり、船を一直線や円周上に並べることで、OpenCPN上ではそれがアナログ時計の針や文字盤のように見えるわけです。

OpenCPNについて

表示先として使ったのは OpenCPN です。
OpenCPNはオープンソースの海図・航海ソフトで、AISターゲットの表示にも対応しています。

通常は、実際のAIS受信機やGPS受信機からNMEAデータを受け取って、船舶や自船位置を表示します。
しかし今回は、そこへ本物の受信データの代わりに、自作のPythonプログラムが生成したNMEA文字列を流し込みました。

ソケットサーバーから仮想の船の位置を提供する

Python側ではTCPソケットサーバーを立てて、OpenCPNがそこへ接続するとAIS文を受け取れるようにしました。

やっていることはシンプルで

  1. 現在時刻を取得する
  2. 短針・長針・秒針の角度を計算する
  3. 指定した座標を中心に、それぞれの針の位置に仮想船を並べる
  4. その位置をAISのNMEA文として送る

という流れです。

AISとしては、各船にMMSIや船名も割り当てておくことで、OpenCPN上でもそれらしいターゲットとして認識されます。

さらに、TCPサーバー出力だけでなく、COMポートにも同じデータを出せるようにしたので、PCソフト相手の接続実験にも使いやすくなりました。

表示できた

実際にOpenCPNへ接続してみると、仮想の船が地図上に現れ、短針・長針・秒針、それに12個のマーカーで、ちゃんとアナログ時計のような表示になりました。

本当は市販のAISトランスポンダーに表示させたかった

本当は、この仮想ターゲットを市販のAISトランスポンダーやAIS表示に入れて、画面上に時計を出せたら面白いと思っていました。

しかし実際に調べてみると、そうした装置はAIS信号を受信・デコードして表示するためのものであり、外部から好きなAISターゲット情報をそのまま注入して表示させるようには作られていませんでした。

つまり、装置の役目そのものが「AISを受信して解釈すること」なので、こちらが用意した仮想の船データを簡単に外から流し込めるわけではなかった、ということです。

まとめ

実用性はまったくありませんが、OpenCPNの表示機能やAISの仕組みを理解するうえでは、なかなか楽しい実験でした。
ChatGPTがいきなり動くコードを出力してきてびっくりしました。