2013-04-13 13 views
6

Chcę opublikować wektor o nieznanej długości struktur, które zawierają dwie liczby całkowite i dwa ciągi. Czy jest jakiś wydawca i subskrybent w ROS, który może to zrobić?Jak opublikować wiadomość w ROS wektorów structs?

Jeśli nie, szukałem na tutorial of how to create custom messages i zorientować mogę zrobić jeden .msg plik zawierający:

int32 upperLeft 
int32 lowerRight 
string color 
string cameraID 

i inny plik .msg zawierający tablicę poprzednich wiadomości. Ale samouczek nie podaje przykładu użycia tablic, więc nie wiem, co umieścić w drugim pliku .msg. Co więcej, nie wiem, jak wykorzystać tę niestandardową wiadomość w programie C++.

Wszelkie wskazówki, jak to zrobić, będą świetne!

Odpowiedz

3

Załóżmy, że twoja pierwsza wiadomość to MyStruct. Aby mieć wiad że jest tablicą MyStructs, to masz msg z pola:

MyStruct[] array 

Następnie w kodzie dokonaniu MyStruct i ustawić wszystkie wartości:

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

Następnie aby dodać MyStructs do tablicy macierzy w drugim typie .msg można wykorzystać push_back (podobnie jak w przypadku std :: vector):

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

Powiedział, że push_back nie jest członkiem m ?? czemu ? – TravellingSalesWoman

+2

Tak, powinno to być 'm.array.push_back (temp)' – Avio

7

wystarczy poszerzyć trochę tego, co już zostało wyjaśnione @Sterling ...

Jeśli masz projekt (a tym samym katalogu) o nazwie "test_messages", i trzeba te dwa rodzaje wiadomości w 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 

Następnie można napisać ten C++ Kod:

#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);