2017-02-11 33 views
2

ROSデータ型Float64MultiArrayを使用するC++ Arduinoスケッチをコンパイルしようとしています。examplesは、非クラス型のFloat64MultiArrayのメンバー 'resize'のリクエスト

のように初期化すると言います
std_msgs::Float64MultiArray array_msg; 
array_msg.data.resize(9); 

しかし、私の最小限のスケッチをコンパイルしようとしている:

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); 
       ^

#include <std_msgs/Float64MultiArray.h> 

std_msgs::Float64MultiArray vec3_msg; 

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

void loop() { 
} 

は私にエラーを与えます

私は間違って何をしていますか?

答えて

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配列、にデフォルト設定するので、それは、あなたのケースには適用されません。 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. 

は、あなたの場合には、それが必要なので9にvec3_msg.data_lengthを設定することを忘れないでください。追加情報については、this answerおよびMultiArrayLayout docsを参照してください。

+0

Spot on。ライブラリが実装を切り替えると言われているドキュメントはありませんが、それがそうする可能性があるのは間違いありません。 – Cerin

関連する問題