I want to publish a vector of unknown length of structs that contain two integers and two strings. Is there a publisher and subscriber in ROS that can do this?
If not, I've been looking at the tutorial of how to create custom messages and I figure I can make one .msg
file containing:
int32 upperLeft
int32 lowerRight
string color
string cameraID
and another .msg
file containing an array of the previous messages. But the tutorial does not give an example of how to use arrays, so I do not know what to put in the second .msg
file. Furthermore, I am not sure how to even use this custom message in a C++ program.
Any tips on how to do this would be great!
Just to expand a little bit what @Sterling already explained...
If you have a project (and thus directory) called "test_messages", and you have these two types of message 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
You can then write this C++ 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);
Let's say your first msg is called MyStruct. To have a msg that is an array of MyStructs, you would have a .msg with the field:
MyStruct[] array
Then in the code you make a MyStruct and set all the values:
MyStruct temp;
temp.upperLeft = 3
temp.lowerRight = 4
temp.color = some_color
temp.cameraID = some_id
Then to add MyStructs to an array your array in the second .msg type, you can use push_back (just like with std::vector):
MySecondMsg m;
m.push_back(temp);
my_publisher.publish(m);