Как бы вы опубликовали сообщение в ROS вектора структур?

Я хочу опубликовать вектор неизвестной длины структур, который содержит два целых числа и две строки. Есть ли в ROS издатель и подписчик, который может это сделать?

Если нет, я смотрю на учебник о том, как создавать собственные сообщения и я думаю, что я могу сделать один .msg файл, содержащий:

int32 upperLeft
int32 lowerRight
string color
string cameraID

и другой .msg файл, содержащий массив предыдущих сообщений. Но учебник не дает пример того, как использовать массивы, поэтому я не знаю, что положить во второй .msg файл. Кроме того, я не уверен, как вообще использовать это пользовательское сообщение в программе на C ++.

Любые советы о том, как сделать это было бы здорово!

6

Решение

Просто чтобы немного расширить, что @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);
7

Другие решения

Допустим, ваше первое сообщение называется MyStruct. Чтобы иметь msg, который является массивом MyStructs, вы должны иметь .msg с полем:

MyStruct[] array

Затем в коде вы делаете MyStruct и устанавливаете все значения:

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

Затем, чтобы добавить MyStructs в массив вашего массива во втором типе .msg, вы можете использовать push_back (как и в случае с std :: vector):

MySecondMsg m;
m.push_back(temp);
my_publisher.publish(m);
3

По вопросам рекламы [email protected]