タイムテーブル Timetable

タイムテーブルに戻る
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
日本周辺では毎年1,700〜1,800隻規模の船舶事故が発生しており、その多くを小型船舶が占めています。事故を減らすには、操船者が周囲の船舶、位置、針路、速度、水深、風などを継続的に把握し、安全な航行判断につなげる仕組みが必要です。
一方で、海上では通信が不安定で、クラウドや外部APIに常時頼れるとは限りません。このセッションでは、小型船舶や実験艇の船上で動くGoサーバーを想定し、船内や周囲から届く航行データをローカルで処理する設計と実装を紹介します。
サーバーの入力として、AISとNMEA 0183を扱います。AISは、周囲の船舶がVHF帯の電波で送信する位置・針路・速度などの情報を受信する仕組みです。NMEA 0183は、GPS、電子コンパス、水深計、風向風速計などの船内機器が使うテキストベースの通信フォーマットです。これらをAIS受信機、シリアル接続、USB変換、複数の船内機器の信号をまとめる装置などを通じてGoサーバーへ取り込みます。
これらのデータは形式、頻度、信頼度が異なり、値が古い、複数の情報源が矛盾する、といった状態も起こります。そのため、単に保存するだけではなく、欠損、遅延、古い情報、根拠含めて判断できる形に整える必要があります。
Goは、標準ライブラリによるI/O処理、goroutineとchannelによる並行処理、contextによる停止制御を組み合わせやすく、複数のリアルタイム入力を扱うローカルサーバーに向いています。発表の半分程度はGo実装・設計の説明に使い、AIS/NMEAのparser、複数入力をgoroutineとchannelでまとめる構成、最新状態の集約、古くなった情報の判定、判断支援に使いやすいイベント列の出力までをコードベースで説明します。
この発表では、海事ドメインを題材にしながら、不完全でリアルタイムに流れ続けるデータをGoでどう受け、整え、判断支援につなげるかを扱います。IoT、ロボティクス、設備監視など、複数の不完全な入力を扱うGoアプリケーションにも応用できる内容です。
弓削商船高等専門学校 情報工学科 教員 / ソフトウェアエンジニア
渋谷のIT企業でソフトウェアエンジニアとして働きながら、弓削商船高等専門学校 情報工学科で教員をしています。 小型船舶の事故を減らすため、AIS情報(船舶航行情報)の活用や海上でのリアルタイムデータ処理、基盤についての研究をしています。今回の発表では、その一環で現在実証中のG航行データストリームを扱うGoサーバーの設計と実装、Goを使った未来のAI操船支援技術について話します。