2013-03-08 13 views
1

현재 선택한 DDS 도메인에서 사용할 수있는 항목을 얻을 수있는 가장 간단한 C# 응용 프로그램을 만들려고합니다. 그러나 나는 그것을 작동하게하는 것처럼 보일 수 없다. 위의 코드를 실행하는 경우DDS의 기본 항목 "DCPSTopic"구독

// Create the DDS Domain participant on domain ID 0 
DDS.DomainParticipant participant =       
      DDS.DomainParticipantFactory.get_instance().create_participant(
        0, 
        DDS.DomainParticipantFactory.PARTICIPANT_QOS_DEFAULT, 
        null, /* Listener */ 
        DDS.StatusMask.STATUS_MASK_NONE); 
DDS.Subscriber sub = participant.get_builtin_subscriber(); 
DDS.DataReader reader1 = sub.lookup_datareader("DCPSTopic"); 
DDS.TopicBuiltinTopicDataDataReader builtinReader1 = 
         (DDS.TopicBuiltinTopicDataDataReader)reader1; 
DDS.TopicBuiltinTopicDataSeq topicSeq = new DDS.TopicBuiltinTopicDataSeq(10) ; 
DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq(10); 
builtinReader1.read(topicSeq, 
        infoSeq, 
        10, 
        DDS.SampleStateKind.ANY_SAMPLE_STATE, 
        DDS.ViewStateKind.ANY_VIEW_STATE, 
        DDS.InstanceStateKind.ANY_INSTANCE_STATE); 

, 내가 마지막 줄에 "Retcode_NoData"예외가 (builtinReader1.read (...)) 출판사와 가입자 모두 같은 도메인에서 실행하고 게시하는 경우에도 (도메인 0). 내 코드에 무엇이 잘못 될 수 있는지에 대해 알고 있습니까?

그건 그렇고. 나는 DDS의 RTI Connext 5.0 구현을 사용합니다. 하나는 예상대로

감사 RTI Connext와 존

답변

1

TopicBuiltinTopic은 작동하지 않습니다.

참고 : :이 DDS_TopicBuiltinTopicData가 내장 주제에 발견 된 항목에 대한 정보를 전달하는 의미있는 C# API DDS::TopicBuiltinTopicData Class Reference의 설명서를 확인하십시오. 이 주제의 샘플은 이 전선의 개별 패킷으로 전파되지 않습니다. 대신 다른 기본 제공 항목 인 (DDS::PublicationBuiltinTopicDataDDS::SubscriptionBuiltinTopicData)이 전달하는 정보의 일부로 데이터는 으로 전송됩니다. 따라서 TopicBuiltinTopicData DataReader는 데이터를받지 않습니다.

Connext에서 검색이 구현되는 방식으로 인해 TopicBuiltinTopicData DataReaders에 데이터가 표시되지 않습니다. 이것은 코드 스 니펫에서 관찰 한 것입니다.

다행히도 버스에서 주제에 대한 정보를 얻을 수 있습니다. 이는 PublicationBuiltinTopicData 및 SubscriptionBuiltinTopicData를 통해 발생해야합니다. C# API DDS::PublicationBuiltinTopicData Class Reference의 설명서를 보면 데이터에 topic_nametype_name 문자열 필드가 있음을 알 수 있습니다. 또한 형식의 구조에 대한 정보를 얻을 수 있지만 더 고급 구현 특정 있습니다.


게시 및 구독 기본 항목 읽기를 구현하려는 경우 세 가지 설명이 나와 있습니다. 첫째의 이름을 하드 코딩하는 대신에 내장 된 당신이 "DCPSTopic"와 함께했던 것처럼 주제, 같이 해당 TypeSupport 속성을 참조하는 것이 좋습니다 :

reader = sub.lookup_datareader(
      DDS.PublicationBuiltinTopicDataTypeSupport.PUBLICATION_TOPIC_NAME); 

그 다음이 가진 것을 알고하는 것이 좋다 Connext, 기본 제공 DataReaders에는 기본 제공 구독자와 동일한 DomainParticipant에있는 게시 또는 구독에 대한 샘플이 포함되어 있지 않습니다. 즉, 다른 참여자의 엔티티 만 볼 수 있지만 자신의 엔티티는 볼 수 없습니다.당신 코드로 주위를 재생하는 동안

마지막으로, 나는 다음과 같이 내가 시퀀스의 생성자 호출을 대체하지 않는 한 샘플의 판독 값이 작동하지 않는 것으로 나타났습니다 : 대신에

DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq(); 

DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq(10); 

및 이와 유사한 데이터 시퀀스. 그 이유는 모르겠지만 실제적인 의미는 없어야합니다.

+0

하이 라이 니어, 의견을 보내 주셔서 감사합니다!나는 당신의 3 가지 제안을 구현했으며 현재 Subscription and Publication 내장 주제/자료실을 사용하고 있습니다. 하지만 내 응용 프로그램은 여전히 ​​"Retcode_NoData"예외를 제외하고 어떤 피드백도 제공하지 않습니다. DDS 응용 프로그램 중 다른 응용 프로그램이 실행중인 랩톱에서 응용 프로그램을 실행 중입니다. 모두 0 도메인에 있지만 응용 프로그램에는 표시되지 않습니다. 무엇이 잘못되었을 지에 대한 다른 제안이 있습니까? 다시 한 번 감사드립니다! John – Rauhe

+0

랩톱에서'rtiddsspy' 도구를 실행할 때 아무 것도 보이지 않습니까? 버스에서 모든 DataReader 및 DataWriter를 검색하고 항목 및 모든 업데이트 (오류로 인해)를 인쇄해야합니다. 그 결과가 표시되지 않으면 랩톱 설정에 문제가있는 것입니다. 결과가 표시된다면이 [code snippet] (http://pastebin.com/awEHZTBv)을 확인하고 그 것이 효과가 있는지 확인할 수 있습니까? 이를 디버깅하기 위해 랩톱에서만 시작하여 예를 들어 RTI의 Shapes 데모와 함께 스 니펫을 실행합니다. –

+0

내 대신 코드 네피 닛을 실행 해 보았습니다. 내장 된 TopicReader는 결과가 없지만 게시자/구독자로부터 주제를 읽을 수는 있습니다. 당신의 도움을 주셔서 대단히 감사합니다 ! – Rauhe

1

Rainier가 옳습니다. Connext DDS는 주제를 직접 TopicBuiltinTopicData에 전파하지 않습니다. 오히려 그것은 간접적으로 PublicationBuitinTopicDataSubscriptionBuiltinTopicData에 있습니다. 이는 DDS 스펙에서 허용됩니다.

이 HOWTO의 기본 주제 인 Detect the presence of DomainParticipants, DataWriters and DataReaders in the DDS Domain을 사용하는 방법에 대한 정보가 있습니다. HOWTO에는 작동하는 예제 코드가 포함되어있다. 그것은 C# 대신 Java로되어 있지만 쉽게 매핑 할 수 있어야합니다. 이 예제는 한 번에 하나의 샘플을 읽으므로 시퀀스 sytax를 다룰 필요가 없습니다.

당신이 사용해야하는 이유 :

DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq(); 

대신 :

DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq(10); 

전달 된 시퀀스는 "비어있는"인지 읽기가 /에 따라 두 개의 서로 다른 행동이 API를 가지고인가요 (즉, 할당/최대 길이가 0 임) 또는 할당 된 길이를가집니다.

시퀀스가 ​​비어있는 경우 (기본 생성자를 사용하는 경우) 읽기/가져 오기는 제로 복사 API로 작동합니다. 즉, 시퀀스의 실제 요소는 이미 미들웨어 내부에 저장되어있는 요소로부터 "대여"됩니다. 이러한 이유 때문에 전달되어야하는 시퀀스는 "빈"시퀀스 여야하므로 미들웨어가 내용을 내부 요소에 대한 참조로 바꿀 수 있음을 알 수 있습니다. 요소에 액세스 한 후 DataReader::return_loan 작업을 호출하는 미들웨어로 '대여 한 요소'를 반환해야합니다.

시퀀스가 ​​비어 있지 않으면. 그런 다음 DDS는 요소가 사전 할당되어 있다고 가정하여 전달한 요소에 데이터를 복사하려고 시도합니다. 표시된 코드의 문제점은 다음과 같습니다.

DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq(10); 

시퀀스 자체를 할당합니다. 그러나 요소는 아닙니다. 따라서 복사를 시도 할 때 읽기/가져 오기 호출이 실패합니다.

for (int i=0; i< 10; i++) { 
    infoSeq.set_at(i, new DDS.SampleInfo()); 
} 

을 그리고 같은뿐만 아니라 데이터 시퀀스에 대해 적용됩니다 :이 비 제로 복사 API를 사용하고자하는 경우는 각 요소의 할당/할당과 전화를 따라야한다. 이렇게하면 DataReader::return_loan 작업을 사용할 필요가 없습니다. 그러나 여분의 복사본이 있으므로 효율성이 떨어집니다.

이 HOWTO에서 DDS 시퀀스 사용 방법에 대한 자세한 정보는 Howto use OMG DDS Sequences in C++입니다. 이것은 C++ 예제로 작성되었지만 원칙은 모든 언어에 적용됩니다.

감사합니다, 제라르

+0

설명해 주셔서 감사합니다. – Rauhe