2013-04-13 16 views
6

我想发布一个未知长度的包含两个整数和两个字符串的结构向量。 ROS中是否有发布商和订阅者可以这样做?你会如何在一个结构向量的ROS中发布消息?

如果没有,我一直在寻找的tutorial of how to create custom messages和我想我可以包含一个.msg文件:

int32 upperLeft 
int32 lowerRight 
string color 
string cameraID 

和包含先前消息的数组另一个.msg文件。但教程没有给出如何使用数组的示例,所以我不知道要在第二个.msg文件中放置什么。此外,我不知道如何在C++程序中使用此自定义消息。

有关如何做到这一点的任何提示将是伟大的!

回答

3

假设你的第一个味精叫做MyStruct。为了有一个味精是MyStructs数组,你将不得不与田。味精:

MyStruct[] array 

然后在你的代码做一个MYSTRUCT并设置所有的值:

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

然后到MyStructs添加到一个数组你在第二。味精类型的数组,你可以使用的push_back(就像使用的std ::向量):

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

它说push_back不是m的成员?为什么? – TravellingSalesWoman

+2

是的,应该是'm.array.push_back(temp)' – Avio

7

只是为了扩大一点点什么@Sterling已经解释...

如果你有一个名为 “test_messages” 项目(因此目录),你有这两种类型的消息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 

然后,您可以这样写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); 
相关问题