请求非class类型的Float64MultiArray中的成员'resize'

Request for member 'resize' in Float64MultiArray which is of non-class type

我正在尝试编译一个使用 ROS 数据类型的 C++ Arduino 草图 Float64MultiArray, and some examples 说你应该像这样初始化它:

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 answer and the MultiArrayLayout docs