Dust DDS는 S2E Software Systems에서 개발한 OMG 데이터 배포 서비스(DDS) 및 실시간 게시자-구독자(RTPS)의 기본 Rust 구현입니다.
이 크레이트의 목표는 최소 DDS 프로필의 고품질 Rust 구현을 제공하는 것입니다. 고품질이라는 것은 안정적인 Rust를 사용하고 안전하지 않은 코드 없이 대규모 단위 테스트 코드 적용 범위를 사용하여 구현이 수행된다는 의미입니다.
DDS는 데이터 중심 연결을 위해 설계된 미들웨어 프로토콜 및 API 표준입니다. 기본적으로 DDS는 시간에 맞춰 비동기적으로 작동하는 게시자와 구독자 간에도 필요한 위치와 시기에 정확하게 관련 데이터를 원활하게 공유하는 것을 목표로 합니다. DDS를 사용하면 애플리케이션은 사용자 정의 이름(주제) 및 키로 식별되는 데이터 객체의 읽기 및 쓰기를 통해 정보를 교환할 수 있습니다. 이를 정의하는 기능 중 하나는 안정성, 대역폭, 배달 기한 및 리소스 할당을 포함하여 서비스 품질(QoS) 매개변수에 대해 제공하는 강력한 제어입니다.
DDS 표준은 "정보 생산자로부터 일치하는 소비자에게 정보를 효율적으로 전달하는 API(애플리케이션 인터페이스)와 통신 의미론(동작 및 서비스 품질)을 모두 정의합니다." 이 표준을 보완하는 것은 DDS에 대한 상호 운용성 유선 프로토콜을 정의하는 DDSI-RTPS 사양입니다. 주요 목표는 다양한 공급업체의 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를 모두 제공하여 최대 성능으로 가장 많은 수의 애플리케이션에 DDS를 통합할 수 있도록 합니다. 일반적으로 첫 번째 옵션은 동기화 API를 사용하고 이벤트 기반 프로그램용 리스너와 같은 DDS 지정 기능을 활용하는 것입니다.
이미 비동기를 사용하는 애플리케이션을 구현하는 경우 비동기 API를 사용해야 합니다. 특히 Tokio 런타임을 사용할 때 Sync API를 사용하면 호출 차단으로 인해 패닉이 발생합니다. 예제 폴더에서 예제를 찾을 수 있습니다.
REST API를 사용하여 DDS 데이터와 상호 작용하려면 Nebula DDS WebLink 소프트웨어를 사용할 수 있습니다. Nebula DDS WebLink는 OMG(Object Management Group) 웹 지원 DDS v1.0 표준을 구현하는 서버를 제공합니다.
DDS 상호 운용성은 일반적으로 모양 데모를 사용하여 테스트됩니다. Dust DDS Shapes 데모는 당사 리포지토리에서 사용할 수 있으며 루트 폴더에서 cargo run --package dust_dds_shapes_demo
실행하여 시작할 수 있습니다.
Dust DDS는 고정된 릴리스 일정을 따르지 않지만 새로운 기능이 구현되면 릴리스할 예정입니다.
이 프로젝트는 Apache 라이센스 버전 2.0에 따라 라이센스가 부여되었습니다.