请求会员在Float64MultiArray中调整非调度类型

问题描述:

我想编译一个使用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); 
       ^

我在做什么错?

的例子指出:

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