Skip to content

アーキテクチャ

mavlink-python は、MAVLinkメッセージの定義、通信、メッセージの配信、アプリケーションによる処理を分離した構成になっています。

全体の構成は以下のようになります。

flowchart TB
    subgraph Core["Core API"]
        Topic["Topic"]
        Bridge["Bridge"]
        subgraph Publishers["Publishers"]
            Publisher["Publisher"]
            TLogReader["TlogReader"]
        end
        subgraph Subscribers["Subscribers"]
            Sub["Subscriber"]
            History["History"]
            Status["Status"]
            Recorder["Recorder"]
        end
        subgraph Generated["Generated from MAVLink Dialect"]
            MessageDefinition["Message Definition"]
            ParserPacker["Parser / Packer"]
        end
    end

    subgraph Transport["Transport"]
        UDP["UDP"]
        Serial["Serial"]
    end

    subgraph Mock["Mock API"]
        Node["Node"]
    end

    UDP <--bytes--> Bridge
    Serial <--bytes--> Bridge
    Node <--subscribe / publish--> Topic

    Bridge <--subscribe / publish--> Topic
    Publisher --publish--> Topic
    TLogReader --publish--> Topic
    Topic --subscribe--> Sub
    Topic --subscribe--> History
    Topic --subscribe--> Status
    Topic --subscribe--> Recorder

mavlink-python の主要な構成要素は以下の通りです。

構成要素 役割
Node アプリケーションの実行単位
MAVLinkTopic MAVLinkメッセージを交換するための中心的なインターフェース
Publisher Topicへメッセージを送信する
Subscriber Topicからメッセージを受信する
History Topicで扱われたメッセージの履歴を扱う
MAVLinkBridge TopicとTransportを接続する
Transport 外部の通信経路との送受信を担当する
Recorder Topicのメッセージをログへ記録する
TLogReader テレメトリログからメッセージを読み出す

Transportは、UDPやSerialなどの通信媒体とのデータの送受信を担当します。Transport自体はMAVLinkメッセージの意味を扱わず、通信媒体から得られたバイト列をMAVLinkTopicへ渡します。

Topic

MAVLinkTopic は、ライブラリ内でMAVLinkメッセージを交換するための中心的な インターフェースです。

アプリケーションは、SerialやUDPなどの通信方式を直接扱わず、 MAVLinkTopic を介してメッセージを送受信します。

flowchart LR
    Topic["MAVLinkTopic"]

    subgraph App1
        Pub1["MAVLinkPublisher"]
        Sub1["MAVLinkSubscriber"]
    end

    subgraph App2
        Pub2["MAVLinkPublisher"]
        Sub2["MAVLinkSubscriber"]
    end

    subgraph App3
        Sub3["MAVLinkSubscriber"]
    end

    subgraph App4
        Pub4["MAVLinkPublisher"]
    end

    Pub1 --> Topic
    Pub2 --> Topic
    Pub4 --> Topic

    Topic --> Sub1
    Topic --> Sub2
    Topic --> Sub3

詳細な仕様についてはAPI Referenceを参照してください。

Publisher / Subscriber

Publisher はTopicへMAVLinkメッセージを送信し、 Subscriber はTopicからMAVLinkメッセージを受信します。

Subscriberは購読条件を指定できるため、特定のSystem ID、Component ID、Message IDなどに限定してメッセージを受信できます。

Publisherの詳細な仕様についてはこちらを、Subscriberの詳細な仕様についてはこちらを参照してください。

BridgeとTransport

MAVLinkBridge は、MAVLinkTopic と Transport の間を接続します。

Transport はSerialやUDPなど、特定の通信方式によるデータの送受信を担当します。 一方、MAVLinkBridge はTransportとTopicの間でMAVLinkメッセージを受け渡します。

この分離によって、アプリケーションは通信方式を意識せずにMAVLinkメッセージを扱うことができます。

flowchart TD
    Real["実機"]
    Bridge["Bridge"]
    Topic["MAVLinkTopic"]

    subgraph Application
        Sub1["MAVLinkSubscribers"]
        Pub1["MAVLinkPublisher"]
    end

    Real <-->|"Transport UDP/Serialなど"| Bridge
    Bridge <-->|"MAVLink message"| Topic
    Topic -->|"MAVLink message"| Sub1
    Pub1 -->|"MAVLink message"| Topic

さらに、1つの MAVLinkTopic には複数のBridgeを接続できます。

例えば、同じTopicをSerialとUDPの両方に接続できます。

これにより、実機との通信とネットワークへの配信を、アプリケーション側の処理を変更せずに組み合わせることができます。

flowchart TD
    Real["実機"]
    Bridge1["Bridge1"]
    Topic["MAVLinkTopic"]

    ExternalApp["既製品のソフトウェア"]
    Bridge2["Bridge2"]

    subgraph Application
        Sub1["MAVLinkSubscribers"]
        Pub1["MAVLinkPublisher"]
    end

    Real <-->|"Transport(Serial)"| Bridge1
    ExternalApp <-->|"Transport(UDP)"| Bridge2
    Bridge1 <-->|"MAVLink message"| Topic
    Bridge2 <-->|"MAVLink message"| Topic
    Topic -->|"MAVLink message"| Sub1
    Pub1 -->|"MAVLink message"| Topic

MAVLinkBridgeの詳細な仕様についてはこちらを参照してください。また、Transportの抽象classについてはTransportBaseを参照してください。

Node

Node はアプリケーションの実行単位です。

NodeはTopicからPublisherやSubscriberを作成し、アプリケーション固有の処理を実装します。

Node の具体的な用途や実装方法は利用するシステムによって異なるため、本ライブラリでは特定のNode実装を提供しません。

examples/mock_node.py にNodeの実装例を示しています。

Nodeの抽象classの仕様についてはこちらを参照してください

ロギング

MAVLinkRecorder はTopicで扱われるMAVLinkメッセージをテレメトリログとして記録します。

Recorderをアプリケーションの通信処理から分離することで、既存のメッセージ処理を変更せずに通信内容を記録できます。

flowchart LR


    subgraph Application
        Sub["MAVLinkSubscriber"]
        Pub["MAVLinkPublisher"]
    end

    Transport <--> Bridge
    Topic --> MAVLinkRecorder
    MAVLinkRecorder --> .tlogファイル
    Bridge <--> Topic
    Topic --> Sub
    Pub --> Topic

TLogReader

TLogReader はテレメトリログを逐次読み込み、(timestamp, message) の形式でMAVLinkメッセージを提供します。

reader = TLogReader("flight.tlog")

for timestamp, message in reader:
    ...

TLogReader はログの読み出しを担当し、データ分析や可視化などは担当しません。

アプリケーションと通信の分離

mavlink-python では、アプリケーションが通信方式に依存しない構成を基本とします。

flowchart LR
    Application <--> Topic <--> Bridge <--> Transport <--> External["External System"]

そのため、同じアプリケーションをSerial、UDPなど異なる通信方法で接続させることができます。

また、Recorder によって実機で取得したデータを保存し、TLogReader によって保存したデータをアプリケーション側で利用できます。

この構成により、実機通信・シミュレーション・試験・ログ取得などで 共通のメッセージングモデルを利用できます。