2017-02-11 21 views
2

Я пытаюсь составить эскиз C++ Arduino, который использует тип данных ROS Float64MultiArray, а некоторые examples говорят, вы должны инициализировать это нравится:Запроса члена «размер» в Float64MultiArray, который имеет типа неклассовой

std_msgs::Float64MultiArray array_msg; 
array_msg.data.resize(9); 

Однако, пытаясь скомпилировать мой минимальный эскиз:

#include <std_msgs/Float64MultiArray.h> 

std_msgs::Float64MultiArray vec3_msg; 

void setup() { 
    vec3_msg.data.resize(3); 
} 

void loop() { 
} 

дает мне ошибку:

main.ino: In function 'void setup()': 
main.ino:6:19: error: request for member 'resize' in 'vec3_msg.std_msgs::Float64MultiArray::data', which is of non-class type 'std_msgs::Float64MultiArray::_data_type* {aka float*}' 
    vec3_msg.data.resize(3); 
       ^

Что я делаю неправильно?

ответ

2

Пример гласит:

The message structure has a single field called data which can be treated as a std::vector type in your C++ node.

Но это не относится к вашему делу, так как вместо того, чтобы использовать лежащую в основе std::vector -как реализации, она по умолчанию для простого float массива, вероятно, из-за Arduino особенностей (см rosserial).

Вам необходимо работать с vec3_msg.data как с любым другим простым массивом. Таким образом:

vec3_msg.data = (float*)malloc(sizeof(float) * 9); 
for (int i = 0; i < 9; ++i) 
{ 
    vec3_msg.data[i] = someValue; 
} 

- один способ.

Возможно, вы захотите сохранить статический массив, с которым вы работаете где-то, и указать на него данные вашего сообщения.

float myGlobalArray[9]; 

setup() 
{ 
    vec3_msg.data = myGlobalArray; 
} 

// change myGlobalArray here and the 
// data will update too. 

Не забудьте установить vec3_msg.data_length до 9, так как в вашем случае это необходимо. См. this answer и MultiArrayLayout docs для дополнительной информации.

+0

Пятно на. Ни один из документов не упоминал, что библиотека переключает реализации, но имеет смысл, что она может это сделать. – Cerin