Я хочу опубликовать вектор неизвестной длины структур, который содержит два целых числа и две строки. Есть ли в ROS издатель и подписчик, который может это сделать?
Если нет, я смотрю на учебник о том, как создавать собственные сообщения и я думаю, что я могу сделать один .msg
файл, содержащий:
int32 upperLeft
int32 lowerRight
string color
string cameraID
и другой .msg
файл, содержащий массив предыдущих сообщений. Но учебник не дает пример того, как использовать массивы, поэтому я не знаю, что положить во второй .msg
файл. Кроме того, я не уверен, как вообще использовать это пользовательское сообщение в программе на C ++.
Любые советы о том, как сделать это было бы здорово!
Просто чтобы немного расширить, что @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);
Допустим, ваше первое сообщение называется 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);