Dust DDS は、S2E Software Systems によって開発された OMG Data Distribution Services (DDS) および Real-time Publisher-Subscriber (RTPS) のネイティブ Rust 実装です。
このクレートの目標は、最小限の DDS プロファイルの高品質な Rust 実装を提供することです。高品質とは、安定した Rust を使用し、安全でないコードを使用せず、単体テストのコード範囲が広い実装が行われることを意味します。
DDS は、データ中心の接続のために設計されたミドルウェア プロトコルおよび API 標準です。 DDS の核心は、時間内に非同期で動作するパブリッシャーとサブスクライバー間でも、必要なときに必要な場所で、関連データのシームレスな共有を促進することです。 DDS を使用すると、アプリケーションは、ユーザー定義の名前 (トピック) とキーによって識別されるデータ オブジェクトの読み取りと書き込みを通じて情報を交換できます。その特徴の 1 つは、信頼性、帯域幅、配信期限、リソース割り当てを含むサービス品質 (QoS) パラメータに対する堅牢な制御です。
DDS 標準は、「情報生成者から一致する消費者への情報の効率的な配信を可能にするアプリケーション インターフェイス (API) と通信セマンティクス (サービスの動作と品質) の両方を定義します」。この標準を補完するのが DDSI-RTPS 仕様であり、DDS の相互運用性ワイヤ プロトコルを定義します。その主な目的は、さまざまなベンダーの DDS 実装に基づくアプリケーションが相互運用できるようにすることです。 Dust DDS の実装は主に DDS および DDSI-RTPS 標準を中心としています。
Dust DDS の基本的な使用例。パブリッシャー側は次のように実装できます。
use dust_dds :: {
domain :: domain_participant_factory :: DomainParticipantFactory ,
infrastructure :: { qos :: QosKind , status :: NO_STATUS } ,
topic_definition :: type_support :: DdsType ,
} ;
# [ derive ( DdsType ) ]
struct HelloWorldType {
# [ dust_dds ( key ) ]
id : u8 ,
msg : String ,
}
let domain_id = 0 ;
let participant_factory = DomainParticipantFactory :: get_instance ( ) ;
let participant = participant_factory
. create_participant ( domain_id , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let topic = participant
. create_topic :: < HelloWorldType > ( "HelloWorld" , "HelloWorldType" , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let publisher = participant
. create_publisher ( QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let writer = publisher
. create_datawriter :: < HelloWorldType > ( & topic , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let hello_world = HelloWorldType {
id : 8 ,
msg : "Hello world!" . to_string ( ) ,
} ;
writer . write ( & hello_world , None ) . unwrap ( ) ;
加入者側は次のように実装できます。
use dust_dds :: {
domain :: domain_participant_factory :: DomainParticipantFactory ,
infrastructure :: { qos :: QosKind , status :: NO_STATUS } ,
subscription :: sample_info :: { ANY_INSTANCE_STATE , ANY_SAMPLE_STATE , ANY_VIEW_STATE } ,
topic_definition :: type_support :: DdsType ,
} ;
# [ derive ( Debug , DdsType ) ]
struct HelloWorldType {
# [ dust_dds ( key ) ]
id : u8 ,
msg : String ,
}
let domain_id = 0 ;
let participant_factory = DomainParticipantFactory :: get_instance ( ) ;
let participant = participant_factory
. create_participant ( domain_id , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let topic = participant
. create_topic :: < HelloWorldType > ( "HelloWorld" , "HelloWorldType" , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let subscriber = participant
. create_subscriber ( QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let reader = subscriber
. create_datareader :: < HelloWorldType > ( & topic , QosKind :: Default , None , NO_STATUS )
. unwrap ( ) ;
let samples = reader
. read ( 1 , ANY_SAMPLE_STATE , ANY_VIEW_STATE , ANY_INSTANCE_STATE ) ;
if let Ok ( hello_world_samples ) = samples {
println ! ( "Received: {:?}" , hello_world_samples [ 0 ] . data ( ) . unwrap ( ) ) ;
}
Rust のみを使用している場合は、手続き型マクロを利用して、DustDDS を使用して型を送信できるようにすることができます。キー フィールドはマクロの一部として定義することもできます。
use dust_dds :: topic_definition :: type_support :: DdsType ;
# [ derive ( DdsType ) ]
struct HelloWorldType {
# [ dust_dds ( key ) ]
id : u8 ,
msg : String ,
}
別のプログラミング言語またはベンダーを使用している場合は、dust_dds_gen クレートを使用して OMG IDL ファイルから DDS タイプを生成できます。
Dust DDS は、「同期」API と「非同期」API の両方を提供し、最大のパフォーマンスで最大数のアプリケーションに DDS を統合できるようにします。一般に、最初のオプションは同期 API を使用し、イベント ベースのプログラムのリスナーなどの DDS 指定の機能を利用することです。
すでに非同期を利用しているアプリケーションを実装する場合は、非同期 API を使用する必要があります。特に、Tokio ランタイムを使用している場合、Sync API を使用すると呼び出しのブロックによりパニックが発生します。例は、examples フォルダーにあります。
REST API を使用して DDS データを操作したい場合は、Nebula DDS WebLink ソフトウェアを使用できます。 Nebula DDS WebLink は、Object Management Group (OMG) Web-Enabled DDS v1.0 標準を実装するサーバーを提供します。
DDS の相互運用性は通常、形状デモを使用してテストされます。 Dust DDS Shapes デモはリポジトリから入手でき、ルート フォルダーからcargo run --package dust_dds_shapes_demo
実行することで開始できます。
Dust DDS は固定リリース スケジュールに従っていませんが、新機能が実装されたらリリースを作成します。
このプロジェクトは、Apache License Version 2.0 に基づいてライセンスされています。