访问嵌套的ROS消息

时间:2018-09-05 15:26:42

标签: c++ ros

我想访问ROS消息message_a的第二个元素。

# ROS-Message message_a
Header header
message_b[] test

ROS消息1包含ROS消息2!

# ROS-Message message_b
Header header
uint32[] result

在我的主代码中,我使用数据类型message_a通过消息测试循环进行for-each循环。

for ( message_a::Test1 test : message_a.message_b ) {
  uint32_t c = test.result;
}

例如,如何访问message_b的第二个元素?我需要它,因为我想获得第二次测试的结果。

通过上面看到的for-each循环,它将循环遍历message_b的所有元素。如何将这个for-each循环更改为一般的for循环?然后我可以从2循环到3 ...

2 个答案:

答案 0 :(得分:0)

您可以将基于范围的(也称为for-each)循环更改为基于索引的for循环,该循环遍历测试42的第二,第三,...和最终结果:

std::size_t test_idx      = 42; // Second element of results
std::size_t result_start  = 1; // start from the second result
std::size_t result_end    = your_msg_obj.test.at(test_idx).size(); // run until end of all in the given test

// For loop that iterates over all results in a given test
for ( std::size_t result_idx = result_start; idx < result_end; ++idx ) {
  uint32_t c = your_msg_obj.test.at(test_idx).result.at(result_idx);
  // ... fancy stuff
}

答案 1 :(得分:0)

ROS documentatation of messages解释说数组消息字段在C ++中以std::vector的形式生成。在您的情况下,字段test的类型为std::vector<message_b>,字段result的类型为std::vector<uint32_t>

C++ vectors可以通过服务方式访问,您可以在in this answer中找到它们。在您的情况下,应该可以通过索引简单地访问项目,例如:

for(size_t i = 0; i != your_message_a.test.size(); i++)
{
    //Access the second result item of each test item
    uint32_t c = your_message_a.test[i].result[1];
}