2017-02-11 55 views
2

我想編譯一個使用ROS數據類型Float64MultiArray的C++ Arduino草圖,有些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 answerMultiArrayLayout docs額外的信息。

+0

點上。該文檔中沒有提到,庫切換實現,但它非常有意義,它可能這樣做。 – Cerin