PDA

View Full Version : *** خروجی گرفتن از یه تابع معمولی !!!!



soodi1100
جمعه 10 آبان 1392, 10:48 صبح
سلام

من میخواهم از تابع زیر 3 خروجی pitch و yaw و roll که در پایان هر پاراگراف ساخته میشه رو به صورت جدا از هم در 3 متغیر داشته باشم
ممنون میشوم کمکم کنید


void IMU_Poll(IMU_DATA *data)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;

pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
data->pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
data->roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
data->yaw=yaw;
}

soodi1100
جمعه 10 آبان 1392, 16:28 عصر
منتظرم :ناراحت:

omidshaman
جمعه 10 آبان 1392, 17:04 عصر
۳ تا متغیر رو بریز تو ارایه بعد return کن .
یا ۳ تا متغیر با آدرس بفرست به تابع توی تابع عوضشون کن.

soodi1100
جمعه 10 آبان 1392, 22:33 عصر
خیلی ممنون میشوم که مثال عملیش رو بزنید چون برنامه نویسیم یکم ضعیفه

rahnema1
شنبه 11 آبان 1392, 08:37 صبح
اولا که این خیلی هم «معمولی» نیست بعدش
تابع شما یک ورودی بصورت استاکچر داره به نام data از نوع IMU_DATA که نتیجه محاسبه pitch roll yaw توی همون استراکچر ریخته میشه
نکته بعدی اینه که در محاسبه یک استراکچر دیگه وجود داره به نام MPU_Data از نوع MPU6050Data که باید قبلا تعریف و مقدار دهی شده باشه ظاهرا داده های یک سخت افزار توی اون هست حالا توی اینجا من یک سری مقدار رو به اون دادم مثل .1 و .23 .که خودتون باید درستش رو بعدا اصلاح کنید



#include <stdio.h>
#include <math.h>
typedef struct IMU_DATA{
float pitch;
float yaw;
float roll;
} IMU_DATA;
typedef struct MPU6050Data{
double Accel_X;
double Accel_Y;
double Accel_Z;
double Gyro_X ;
double Gyro_Y;
double Gyro_Z;
MPU6050Data():
Accel_X(0.1),
Accel_Y(0.23),
Accel_Z(0.12),
Gyro_X(0.43),
Gyro_Y(0.56),
Gyro_Z(0.25){}
} ;
void IMU_Poll(IMU_DATA *data);
int main()
{
IMU_DATA data;
IMU_Poll(&data);
printf("\n pitch=%f\n yaw=%f\n roll=%f",data.pitch,data.yaw,data.roll);
}
void IMU_Poll(IMU_DATA *data)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;
pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
data->pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
data->roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
data->yaw=yaw;
}

soodi1100
دوشنبه 13 آبان 1392, 17:58 عصر
سلام

خیلی ممنون از پاسختون
ولی این کامپایل نمیشه ؟؟؟
حرف شما درسته ، این تابع IMU-Poll کلا با چندتا سابع دیگه توی یه کتابخونس که اول برنامه اضافش کردم ، و طبق گفتتون ، اون MPU-Data همون اول کتابخونه مقدار دهی میشه
ولی الان به خط های :

IMU_DATA data; IMU_Poll(&data);

ارور های زیر رو میگره :
Program.c(65): error: #268: declaration may not appear after executable statement in block
Program.c(66): error: #167: argument of type "IMU_DATA *" is incompatible with parameter of type "IMU_DATA *"


و این :

typedef struct IMU_DATA{
float pitch;
float yaw;
float roll;
} IMU_DATA;
رو باید حتما داخل int-main() وارد کنم وگرنه خطا میگیره !!!

ممنون میشوم بیشتر توضیح بدید که چطور این مقادیر رو بخونم
شرمنده و تشکر

rahnema1
دوشنبه 13 آبان 1392, 20:24 عصر
این فایل رو مستقل از سایر فایلها اجرا کردید یک بار دیگه فایل رو zip کردم فرستادم لطفا اون را بصورت مستقل از لایبری های دیگه اجرا کنید من نمی دونم شما توی برنامه program.c چه چیزی اضافه کردید اون رو بذارید ببینیم اشکال کجاست
نکته دیگه برنامه از نوع سی پلاس پلاسه نه از نوع سی بنابراین پسوند برنامه رو به program.cpp تغییر بدید تا کامپایلر تشخیص بده باید اون رو بعنوان سی پلاس پلاس کامپایل کنه