c++ - 请求 Float64MultiArray 中非类类型的成员 'resize'

标签 c++ arduino ros

我正在尝试编译一个使用 ROS 数据类型 Float64MultiArray 的 C++ Arduino 草图。 ,还有一些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 answerMultiArrayLayout docs获取额外信息。

关于c++ - 请求 Float64MultiArray 中非类类型的成员 'resize',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180378/

相关文章:

emacs - Arduino Emacs 开发

python - 通过 pySerial 将字符串发送到端口出错

c - 距离传感器测距误差估计

opencv - RQT ROS中的轨迹栏

c++ - 折叠复制和 move 语义的重载

C++ 规则 5 - 自定义析构函数的段错误

c++ - boost make_shared 的用例

C++ 段错误结构

linux - 在 Debian Jessie 上安装 ROS Kinetic

python - 如何创建具有多种功能的 OpenAI Gym 观察空间