7

2 つの整数と 2 つの文字列を含む長さ不明の構造体のベクトルを公開したいと考えています。これを行うことができるROSのパブリッシャーとサブスクライバーはありますか?

そうでない場合は、カスタム メッセージの作成方法のチュートリアルを見て、以下を含む1 つの.msgファイルを作成できると考えています。

int32 upperLeft
int32 lowerRight
string color
string cameraID

.msgそして、以前のメッセージの配列を含む別のファイル。しかし、チュートリアルでは配列の使い方の例を示していないため、2 番目の.msgファイルに何を入れればよいかわかりません。さらに、このカスタム メッセージを C++ プログラムで使用する方法さえわかりません。

これを行う方法に関するヒントは素晴らしいでしょう!

4

2 に答える 2

9

@Sterlingがすでに説明したことを少し拡張するだけです...

「test_messages」というプロジェクト (およびディレクトリ) があり、次の 2 種類のメッセージが にあるとします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

次に、2 番目の .msg 型の配列に MyStructs を追加するには、push_back を使用できます (std::vector と同様):

MySecondMsg m;
m.push_back(temp);
my_publisher.publish(m);
于 2013-07-29T15:46:04.420 に答える