目前程式修改的進度#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "PID_v1.h"
#include"Servo.h"
Servo myservo;
Servo myservo1;
MPU6050 accelgyro;
unsigned long now, lastTime = 0;
float dt; //微分时间
/**********************************************************************/
int16_t ax, ay, az, gx, gy, gz; //加速度计陀螺仪原始数据
float aax=0, aay=0, agx=0, agy=0, agz=0; //角度变量
long axo = 0, ayo = 0, azo = 0; //加速度计偏移量
long gxo = 0, gyo = 0, gzo = 0; //陀螺仪偏移量
float pi = 3.1415926;
float AcceRatio = 16384.0; //加速度计比例系数
float GyroRatio = 131.0; //陀螺仪比例系数
uint8_t n_sample = 8; //加速度计滤波算法采样个数
float aaxs = {0}, aays = {0}; //x,y轴采样队列
long aax_sum, aay_sum; //x,y轴采样和
float a_x={0}, a_y={0} ,g_x={0} ,g_y={0}; //加速度计协方差计算队列
float Px=1, Rx, Kx, Sx, Vx, Qx; //x轴卡尔曼变量
float Py=1, Ry, Ky, Sy, Vy, Qy; //y轴卡尔曼变量
/**********************************************************************/
double Kp=0.2; //Initial Proportional Gain
double Ki=0; //Initial Integral Gain
double Kd=0; //Initial Differential Gain
doubleInput,Output,Output1,Output2,Output1_old=10,Output2_old=10;
doubleSetpoint=0;
intDirection;
PID myPID(&Input, &Output, &Setpoint,Kp,Ki,Kd, DIRECT);
void setup() {
Wire.begin();
Serial.begin(9600);
accelgyro.initialize(); //初始化
unsigned short times = 200; //采样次数
for(int i=0;i<times;i++){
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值
axo += ax; ayo += ay; azo += az; //采样和
gxo += gx; gyo += gy; gzo += gz;
}
axo /= times; ayo /= times; azo /= times; //计算加速度计偏移
gxo /= times; gyo /= times; gzo /= times; //计算陀螺仪偏移
myPID.SetMode(AUTOMATIC);
myservo.attach(5,1000,2000);
myservo1.attach(6,1000,2000);
delay(100);
myservo.writeMicroseconds(1000);
myservo1.writeMicroseconds(1000);
delay(2000);
}
void loop(){
MPU6050_Angle();
if(agy<0)
{
Input = agy;
myPID.Compute();
Output1 = Output + 14;
// Output1_old = Output1;
Output2 = Output2_old;
}
else
{
Input = -1 * agy;
myPID.Compute();
Output2 = Output + 10.5;
// Output2_old = Output2;
Output1 = Output1_old;
}
if((Output1)>=180)
{
Output1 = 180;
myservo.write(Output1);
myservo1.write(Output2);
}
else if((Output2)>=180)
{
Output2 = 180;
myservo.write(Output1);
myservo1.write(Output2);
}
else
{
myservo.write(Output1);
myservo1.write(Output2);
}
// Output1_old = Output1;
// Output2_old = Output2;
//delay(15);
/*Serial.print(agx);Serial.print(",");
Serial.print(agy);Serial.println();*/
Serial.print(agx); Serial.print("\t");
Serial.print(agy); Serial.print("\t");
Serial.print(Output1); Serial.print("\t");
Serial.println(Output2);
}
voidMPU6050_Angle()
{
unsigned long now = millis(); //当前时间(ms)
dt = (now - lastTime) / 1000.0; //微分时间(s)
lastTime = now; //上一次采样时间(ms)
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值
float accx = ax / AcceRatio; //x轴加速度
float accy = ay / AcceRatio; //y轴加速度
float accz = az / AcceRatio; //z轴加速度
aax = atan(accy / accz) * (-180) / pi; //x轴对于水平面的夹角
aay = atan(accx / accz) * 180 / pi; //y轴对于水平面的夹角
aax_sum = 0; // 对于加速度计原始数据的滑动加权滤波算法
aay_sum = 0;
for(int i=1;i<n_sample;i++){
aaxs = aaxs;
aax_sum += aaxs * i;
aays = aays;
aay_sum += aays * i;
}
aaxs = aax;
aax_sum += aax * n_sample;
aax = (aax_sum / (11*n_sample/2.0)) * 9 / 7.0; //角度调幅至0-90°
aays = aay; //此处应用实验法取得合适的系数
aay_sum += aay * n_sample; //本例系数为9/7
aay = (aay_sum / (11*n_sample/2.0)) * 9 / 7.0;
float gyrox = - (gx-gxo) / GyroRatio * dt; //x轴角速度
float gyroy = - (gy-gyo) / GyroRatio * dt; //y轴角速度
agx += gyrox; //x轴角速度积分
agy += gyroy; //x轴角速度积分
/* kalmen start */
Sx = 0; Rx = 0;
Sy = 0; Ry = 0;
for(int i=1;i<10;i++){ //测量值平均值运算
a_x = a_x; //即加速度平均值
Sx += a_x;
a_y = a_y;
Sy += a_y;
}
a_x = aax;
Sx += aax;
Sx /= 10; //x轴加速度平均值
a_y = aay;
Sy += aay;
Sy /= 10; //y轴加速度平均值
for(int i=0;i<10;i++){
Rx += sq(a_x - Sx);
Ry += sq(a_y - Sy);
}
Rx = Rx / 9; //得到方差
Ry = Ry / 9;
Px = Px + 0.0025; // 0.0025在下面有说明...
Kx = Px / (Px + Rx); //计算卡尔曼增益
agx = agx + Kx * (aax - agx); //陀螺仪角度与加速度计速度叠加
Px = (1 - Kx) * Px; //更新p值
Py = Py + 0.0025;
Ky = Py / (Py + Ry);
agy = agy + Ky * (aay - agy);
Py = (1 - Ky) * Py;
}用最笨的方式來做
不過還是不能平衡
這邊還要再想看看:L
你如果是想学习做飞控并且体验个中的味道,这样一步步来是可以的,否则建议你直接去学习人家开源的APM或者WMC,都是基于MEGA2560的!
如果想一边学一边做得更好,就不要用MEGA2560这种8位MCU了,直接用ARM吧,后期还能加上视频什么的......
拾瑞 发表于 2013-7-19 16:19 static/image/common/back.gif
你如果是想学习做飞控并且体验个中的味道,这样一步步来是可以的,否则建议你直接去学习人家开源的APM或者WMC ...
我有去看過人家開源的程式碼~
只是都看不懂~:L
至於為啥不用ARM的問題嘛~
因為小弟我還是學生~沒那麼多$$再去買其他的東西
只能用現有的板子來玩囉~:lol
哎,真心劝你一句,如果还没有一定的水平,而且是一个人战斗,你的四轴是飞不起来的......飞控是非常专业的东西,如果看不明白开源的代码,你又把重心再放到飞控上,就是唐诘柯德战风车啊!
comet1989 发表于 2013-7-19 15:52 static/image/common/back.gif
視頻方面我會在處理一下
我們這邊鎖掉了你們的一些視頻網站
谢谢楼主!!!
comet1989 发表于 2013-7-19 15:51 static/image/common/back.gif
目前用2560只是做測試~
因為手邊就只有這塊~
恩恩!楼主厉害,我也打算做一个用来研究算法,最后就直接集成到一个很小的主板上,方便的安装就可以飞行,
comet1989 发表于 2013-7-19 15:55 static/image/common/back.gif
目前程式修改的進度用最笨的方式來做
不過還是不能平衡
這邊還要再想看看
您好:
我也是台灣人,最近也再做四軸,還飛不起來><,樓主的程式沒用到PID嗎??
本帖最后由 comet1989 于 2013-7-22 16:17 编辑
TTTTTTT33 发表于 2013-7-20 20:36 static/image/common/back.gif
您好:
我也是台灣人,最近也再做四軸,還飛不起來>
目前PID指有用一小部份而已~
要如何讓它能平衡就是難的地方哩
這邊就需要各位大大們的幫忙了~
学慧放弃 发表于 2013-7-20 19:29 static/image/common/back.gif
恩恩!楼主厉害,我也打算做一个用来研究算法,最后就直接集成到一个很小的主板上,方便的安装就可以飞行 ...
我也沒有很厲害
我都是看論壇上大家的文章學來的
希望大家能一起討論這個問題吧~
comet1989 发表于 2013-7-22 16:16 static/image/common/back.gif
我也沒有很厲害
我都是看論壇上大家的文章學來的
希望大家能一起討論這個問題吧~
嗯嗯,
拾瑞 发表于 2013-7-20 09:43 static/image/common/back.gif
哎,真心劝你一句,如果还没有一定的水平,而且是一个人战斗,你的四轴是飞不起来的......飞控是非常专业的东西 ...
小弟也是学生,想一步一步学飞控。。。求指点,从哪里学起?
comet1989 发表于 2013-7-22 16:15 static/image/common/back.gif
目前PID指有用一小部份而已~
要如何讓它能平衡就是難的地方哩
這邊就需要各位大大們的幫忙了~
請問您是用pid函式庫??還是自己寫的??
拾瑞 发表于 2013-7-17 16:11 static/image/common/back.gif
楼主台湾的吧!你的影片我们看不到的!
1,kalmen有个库文件的;
你用mpu6050的动dmp能读出正确的四元数,然后输出pyr吗?我用库里的例程貌似有问题,读出来pyr数据波动很大,加入延时300ms可以,但那样更新频率太低了,能说说你的办法吗?
看波形那是什么工具
ShadowWalker 发表于 2013-7-27 12:56 static/image/common/back.gif
你用mpu6050的动dmp能读出正确的四元数,然后输出pyr吗?我用库里的例程貌似有问题,读出来pyr数据波动很 ...
用本论坛上的DMP库文件是可以的啊......