请求会员在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 answer和MultiArrayLayout docs额外的信息。
点上。该文档中没有提到,库切换实现,但它非常有意义,它可能这样做。 – Cerin