2013-04-13 3 views
6

Je souhaite publier un vecteur de longueur inconnue de structures contenant deux entiers et deux chaînes. Y a-t-il un éditeur et un abonné dans ROS qui peuvent le faire?Comment publieriez-vous un message dans ROS d'un vecteur de structures?

Sinon, je l'ai regardé la tutorial of how to create custom messages et je me dis que je peux faire un .msg fichier contenant:

int32 upperLeft 
int32 lowerRight 
string color 
string cameraID 

et un autre fichier contenant .msg un tableau des messages précédents. Mais le tutoriel ne donne pas un exemple de comment utiliser les tableaux, donc je ne sais pas quoi mettre dans le deuxième fichier .msg. De plus, je ne sais pas comment utiliser ce message personnalisé dans un programme C++.

Des conseils sur la façon de faire ce serait génial!

Répondre

3

Supposons que votre premier message soit appelé MyStruct. Pour avoir un msg qui est un tableau de MyStructs, vous auriez un .msg avec le terrain:

MyStruct[] array 

Ensuite, dans le code que vous faire un MyStruct et définir toutes les valeurs:

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

Ensuite, d'ajouter MyStructs à un tableau de votre tableau dans le deuxième type de .msg, vous pouvez utiliser push_back (comme avec std :: vector):

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

Il a dit que push_back n'est pas un membre de m ?? Pourquoi ? – TravellingSalesWoman

+2

Oui, il devrait être 'm.array.push_back (temp)' – Avio

7

juste pour développer un peu ce @Sterling déjà expliqué ...

Si vous avez un projet (et donc), appelée "test_messages", et vous avez ces deux types de message dans 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 

Vous pouvez alors écrire ce code C++:

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