joshualan
joshualan

Reputation: 2140

How would you publish a message in ROS of a vector of structs?

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!

Upvotes: 8

Views: 37483

Answers (2)

Avio
Avio

Reputation: 2717

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

Upvotes: 11

Sterling
Sterling

Reputation: 4223

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

Upvotes: 3

Related Questions