我正在尝试编译一个使用 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 answer和 MultiArrayLayout docs获取额外信息。
关于c++ - 请求 Float64MultiArray 中非类类型的成员 'resize',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180378/