美好的一天:)我正在编写一个代码,用于从加速度计和陀螺仪获取俯仰,偏航和侧倾角。为了创建易于使用的简洁代码,我采用了创建两个不同函数的方法。一个用于陀螺仪来计算俯仰和横滚,另一个用于加速度计,它也可以执行相同的操作。
float *readGyro(){
/*get data from sensor here*/
float gyroAngles[4]={gyroPitch,gyroRoll,gyroYaw};
float* gyroPRY=gyroAngles;
return gyroPRY;
}
float *readAccel(){
/*get data from sensor here*/
float accelAngles[4]={accelPitch,accelRoll,accelYaw};
float* accelPRY=accelAngles;
return accelPRY;
}
如您在上面看到的,我将函数的输出存储到一个数组中以传递到主函数中。基本上,指针被传递。但是,从传递的指针访问值时,将打印恒定的垃圾值(当我移动IMU时不会更改)(例如2.38221e-44和-3.84146e-06)。通过打印这些功能中的值,我检查了陀螺仪和加速度计的功能输出,结果很好。
int main(void){
float *accelData;
float *gyroData;
while(1){
accelData=readGyro();
gyroData=readAccel();
float accelPitch=*(accelData);
float accelRoll=*(accelData+1);
float accelYaw=*(accelData+2);
float gyroPitch=*(gyroData);
float gyroRoll=*(gyroData+1);
float gyroYaw=*(gyroData+2);
cout << "AccelPitch=" << accelPitch <<endl;
cout << "AccelRoll=" << accelRoll <<endl;
cout << "AccelYaw=" << accelYaw <<endl;
cout << "GyroPitch=" << gyroPitch <<endl;
cout << "GyroRoll=" << gyroRoll <<endl;
cout << "GyroYaw=" << gyroYaw <<endl;
}
}
我找不到我的代码做错了什么。在此之前,我查阅了许多参考资料。但是我仍然无法解决。您的帮助将不胜感激:)
您正在做的事情永远不会起作用,因为您正在将指针返回到readGyro
and的堆栈上readAccel
。当这些函数退出时,将回收堆栈的该部分,并且您将拥有未定义的行为。
一种方法是分配数组并返回它,但随后您也不得不删除该分配,这使您负担沉重。
您可以为所需的参数创建2个结构,并将它们传递到函数中。这样,函数可以在返回后仍会保留的地方写东西。
例如
#include <iostream>
using std::cout;
using std::endl;
struct gyro_data_t
{
float pitch;
float roll;
float yaw;
};
struct accel_data_t
{
float pitch;
float roll;
float yaw;
};
void readGyro(gyro_data_t* gd)
{
/*get data from sensor here*/
gd->pitch = 1.0f;
gd->roll = 1.1f;
gd->yaw = 1.2f;
}
void readAccel(accel_data_t* ad)
{
/*get data from sensor here*/
ad->pitch = 1.0f;
ad->roll = 1.1f;
ad->yaw = 1.2f;
}
int main(void)
{
accel_data_t accelData;
gyro_data_t gyroData;
while(1)
{
readGyro(&gyroData);
readAccel(&accelData);
cout << "AccelPitch=" << accelData.pitch << endl;
cout << "AccelRoll=" << accelData.roll << endl;
cout << "AccelYaw=" << accelData.yaw << endl;
cout << "GyroPitch=" << gyroData.pitch << endl;
cout << "GyroRoll=" << gyroData.roll << endl;
cout << "GyroYaw=" << gyroData.yaw << endl;
}
}
请注意,这比示例更易读,因为它显式地命名了每个变量,而不是将它们表示为与返回值的偏移量。分配给新变量使您无需再理解值的含义。
这两个结构实际上是相同的,因此如果需要,可以将其浓缩为一个通用结构。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句