7

我想发布一个包含两个整数和两个字符串的结构长度未知的向量。ROS中是否有发布者和订阅者可以做到这一点?

如果没有,我一直在看如何创建自定义消息的教程,我想我可以制作一个.msg包含以下内容的文件:

int32 upperLeft
int32 lowerRight
string color
string cameraID

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

关于如何做到这一点的任何提示都会很棒!

4

2 回答 2

9

只是为了扩展@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);
于 2014-08-13T12:01:04.497 回答
3

假设您的第一个消息称为 MyStruct。要拥有一个 MyStructs 数组的 msg,您将拥有一个带有以下字段的 .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);
于 2013-07-29T15:46:04.420 回答