2013-04-13 12 views
6

Ich möchte einen Vektor unbekannter Länge von Strukturen veröffentlichen, die zwei ganze Zahlen und zwei Zeichenfolgen enthalten. Gibt es einen Verleger und Abonnenten in ROS, die dies tun können?Wie würden Sie eine Nachricht in ROS eines Vektors von Strukturen veröffentlichen?

Wenn nicht, ich habe am tutorial of how to create custom messages suchen und Ich denke, ich eine, die .msg Datei machen können:

int32 upperLeft 
int32 lowerRight 
string color 
string cameraID 

und andere .msg Datei ein Array der vorherigen Nachrichten enthält. Aber das Tutorial gibt kein Beispiel für die Verwendung von Arrays, daher weiß ich nicht, was ich in die zweite .msg-Datei schreiben soll. Darüber hinaus bin ich nicht sicher, wie diese benutzerdefinierte Nachricht in einem C++ - Programm sogar verwandt wird.

Alle Tipps, wie dies zu tun wäre, wäre toll!

Antwort

3

Nehmen wir an, Ihre erste msg heißt MyStruct. Um eine msg zu haben, die ein Array von MyStructs ist, müssten Sie eine .msg mit dem Feld:

MyStruct[] array 

Dann in dem Code, den Sie einen MyStruct machen und setzen Sie alle Werte:

MyStruct temp; 
temp.upperLeft = 3 
temp.lowerRight = 4 
temp.color = some_color 
temp.cameraID = some_id 

Dann MyStructs auf ein Array Array in der zweiten msg Typ hinzufügen, können Sie push_back verwenden können (wie bei std :: vector):

MySecondMsg m; 
m.push_back(temp); 
my_publisher.publish(m); 
+0

Es sagte, dass push_back ist kein Mitglied von m ?? Warum ? – TravellingSalesWoman

+2

Ja, es sollte 'm.array.push_back (temp)' sein – Avio

7

nur ein wenig zu erweitern, was @Sterling bereits erklärt ...

Wenn Sie ein Projekt (und damit Verzeichnis) namens "test_messages", und Sie haben diese beiden Arten von Nachrichten in test_messages/msg:

#> cat test.msg 
string first_name 
string last_name 
uint8 age 
uint32 score 

#> cat test_vector.msg 
string vector_name 
uint32 vector_len   # not really necessary, just for testing 
test[] vector_test 

Sie können dann diese C++ schreiben Code:

#include "test_messages/test.h" 
#include "test_messages/test_vector.h" 

... 

    ::test_messages::test test_msg; 

    test_msg.age   = 29; 
    test_msg.first_name = "Firstname"; 
    test_msg.last_name = "Lastname"; 
    test_msg.score  = 79; 

    test_pub.publish(test_msg); 


    ::test_messages::test_vector test_vec; 

    test_vec.vector_len = 5; 
    test_vec.vector_name = std::string("test vector name"); 

    for (int idx = 0; idx < test_vec.vector_len; idx++) 
    { 
     test_msg.age   = 50; 
     test_msg.score  = 100; 
     test_msg.first_name = std::string("aaaa"); 
     test_msg.last_name = std::string("bbbb"); 

     test_vec.vector_test.push_back(test_msg); 
    } 

    test_vector_pub.publish(test_vec);