仿制rantingting的两轮平衡小车
本帖最后由 freebird_sp 于 2013-1-11 14:50 编辑根据rantingting的帖子http://www.amobbs.com/thread-5509883-1-1.html,仿制了一台两轮平衡小车,现在在调试参数,有些问题。
1.使用的减速电机由于齿轮之间有缝隙,所以轮子有些晃动。
http://v.youku.com/v_show/id_XNTAwNDkzNzE2.html
2.小车有一定的控制趋势,但是,还是有些问题。现在只加了P和D,位置和速度参数没有加,哪位高手请指导一下,应该如何继续调整参数,特别是位置和速度参数。
3.接通电源后,很长时间才能得到角度和角速度。观察加速度输出没有问题,感觉是卡特曼滤波的问题。请指教一二
http://v.youku.com/v_show/id_XNTAwNDk2MDUy.html 本帖最后由 freebird_sp 于 2013-4-20 17:12 编辑
今天有时间,又调了一下小车,发现一个很低级的问题,有一个车轮的编码器的信号输出居然接反了,导致电机同向转动时,输出值一正一负,怪不得调了好久都不行。给正在制作中的朋友提个醒,别和我一样犯这么低级的错误。
http://v.youku.com/v_show/id_XNTQ1NTk0MTE2.html
小车不够稳定,主要是受电机的影响,第一个视频已经介绍了,减速电机齿轮有间隙,导致控制力不能立刻加到电机上,而是有延时,所以小车再平衡位子会摆动调整,好在目前能站起来了。准备做下一个,改进型的。 加个位置环就为稳定很多,你初始化都在干啥?MCU需要运算这么久应该是程序的问题吧! 初始是这些,没有问题
delaynms(500); //上电延时
Init_PWM(); //PWM初始化
Init_Timer0(); //初始化定时器0,作为PWM时钟源
Init_Timer1(); //初始化定时器1
Init_Interr(); //中断初始化
Init_Motor(); //电机控制初始化
Init_BRT(); //串口初始化(独立波特率)
InitMPU6050(); //初始化MPU6050
delaynms(500);
计算倾角的程序如下,
//*********************************************************
// 倾角计算(卡尔曼融合)
//*********************************************************
void Angle_Calcu(void)
{
//------加速度--------------------------
//范围为2g时,换算关系:16384 LSB/g
//角度较小时,x=sinx得到角度(弧度), deg = rad*180/3.14
//因为x>=sinx,故乘以1.3适当放大
Accel_x= GetData(ACCEL_XOUT_H); //读取X轴加速度
/*Angle_ax = (Accel_x + 620) /16384; //去除零点偏移,计算得到角度(弧度)
Angle_ax = Angle_ax*1.2*180/3.14; //弧度转换为度,*/
Angle_ax = (Accel_x - 1300) *180/36310; //去除零点偏移,计算得到角度(弧度)
//-------角速度-------------------------
//范围为2000deg/s时,换算关系:16.4 LSB/(deg/s)
Gyro_y = GetData(GYRO_YOUT_H); //静止时角速度Y轴输出为-30左右
Gyro_y = -(Gyro_y + 30)/16.4; //去除零点偏移,计算角速度值,负号为方向处理
//Angle_gy = Angle_gy + Gyro_y*0.01;//角速度积分得到倾斜角度.
//-------卡尔曼滤波融合-----------------------
Kalman_Filter(Angle_ax,Gyro_y); //卡尔曼滤波计算倾角
/*//-------互补滤波-----------------------
//补偿原理是取当前倾角和加速度获得倾角差值进行放大,然后与
//陀螺仪角速度叠加后再积分,从而使倾角最跟踪为加速度获得的角度
//0.5为放大倍数,可调节补偿度;0.01为系统周期10ms
Angle = Angle + (((Angle_ax-Angle)*0.5 + Gyro_y)*0.01);*/
}
刚刚试了一下,把卡尔曼滤波程序注释掉,角速度和加速度的值都会立刻显示,加上滤波程序后,就需要很长时间了。
卡尔曼滤波程序
//******卡尔曼参数************
float code Q_angle=0.001;
float code Q_gyro=0.003;
float code R_angle=0.5;
float code dt=0.01; //dt为kalman滤波器采样时间;
charcode C_0 = 1;
float xdata Q_bias, Angle_err;
float xdata PCt_0, PCt_1, E;
float xdata K_0, K_1, t_0, t_1;
float xdata Pdot ={0,0,0,0};
float xdata PP = { { 1, 0 },{ 0, 1 } };
//*********************************************************
// 卡尔曼滤波
//*********************************************************
//Kalman滤波,20MHz的处理时间约0.77ms;
void Kalman_Filter(float Accel,float Gyro)
{
Angle+=(Gyro - Q_bias) * dt; //先验估计
Pdot=Q_angle - PP - PP; // Pk-先验估计误差协方差的微分
Pdot=- PP;
Pdot=- PP;
Pdot=Q_gyro;
PP += Pdot * dt; // Pk-先验估计误差协方差微分的积分
PP += Pdot * dt; // =先验估计误差协方差
PP += Pdot * dt;
PP += Pdot * dt;
Angle_err = Accel - Angle; //zk-先验估计
PCt_0 = C_0 * PP;
PCt_1 = C_0 * PP;
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP;
PP -= K_0 * t_0; //后验估计误差协方差
PP -= K_0 * t_1;
PP -= K_1 * t_0;
PP -= K_1 * t_1;
Angle += K_0 * Angle_err; //后验估计
Q_bias += K_1 * Angle_err; //后验估计
Gyro_y = Gyro - Q_bias; //输出值(后验估计)的微分=角速度
}
片子应该是AVR的吧我猜的。恩你的延时准确么?其他的毛病我也搞不清楚了。以前玩AVR的时候也出过类似的毛病但是那是个低级错误烧程序的时候时钟没设置好导致延时不准.... 你的车子跑的好开心啊。、、、{:lol:}{:lol:}{:lol:}{:lol:} 不错···· 还不错朋友加油啊 LZ加油,很多还是需要自己调试的,耐心点,问题都能找到的 我的也是这样啊,我的只会前进 我也是按照他的做的,很多问题用他的程序实验要等很久 mark!!!!!! 我开始也跟楼主的一样,要很久才有反应。应该是kalman的问题,换成互补滤波就好了 这个问题我找到是什么问题了,你把卡尔曼定义的几个值,全部都赋值.这样就不会抖动,请加我的Q,我现在也出了很大的问题,相互讨论,谢谢.896309534 这是我的赋值,float angle=90.0, angle_dot=0.0; //外部需要引用的变量
你可以参考一下,快点加我哦,拜托了,我有点问题要请教你 rantingting 是什么 请教楼主pid参数调试经验 123bac 发表于 2013-1-29 12:00 static/image/common/back.gif
我也是按照他的做的,很多问题用他的程序实验要等很久
你的能站稳当起来么 migrantcn 发表于 2013-2-3 08:45 static/image/common/back.gif
我开始也跟楼主的一样,要很久才有反应。应该是kalman的问题,换成互补滤波就好了 ...
我 也遇到这个问题 你的车弄好了么? 楼主,小车很牛啊 楼主,我的车子也是要几分钟才能有反应的,我想请教下你的问题解决了么?什么原因啊、加我的qq,1377379144,告诉我你的qq,我加你也行啊!坐等楼主啊 楼主,坐等啊! 是卡尔曼滤波的问题,现在换成互补滤波就没问题了 xysfwm 发表于 2013-4-22 09:31 static/image/common/back.gif
楼主,坐等啊!
是卡尔曼滤波的问题,现在换成互补滤波就没问题了 编码器怎么接线,怎样换成互补滤波 楼主能加个扣扣交流吗515520404 你仅仅用的mpu6050还是imu? "有一个车轮的编码器的信号输出居然接反了,导致电机同向转动时,输出值一正一负" 请问一下,这会导致什么情况出现? freebird_sp 发表于 2013-4-28 16:32 static/image/common/back.gif
是卡尔曼滤波的问题,现在换成互补滤波就没问题了
请教一下,你的小车换成卡尔曼滤波的情况下,MPU6050是不是装的方向变成垂直的(用的是rantingting的程序)? 我也遇到了同样的问题,上电等好久才启动,还以为单片机挂了,把外围电路查了一遍,发现没问题。后来发现自己做的光电编码器输出信号不是很好,跳动很厉害。 am_diy 发表于 2013-6-5 03:03 static/image/common/back.gif
"有一个车轮的编码器的信号输出居然接反了,导致电机同向转动时,输出值一正一负" 请问一下,这会导致什么 ...
编码器主要是在位移和速度控制时起作用,是小车能够在一个位置不动。之前无论怎样调整位移和速度参数,小车都会向一个方向运动,最终倒掉。 顶一个 学习了 freebird_sp 发表于 2013-4-20 17:08 static/image/common/back.gif
今天有时间,又调了一下小车,发现一个很低级的问题,有一个车轮的编码器的信号输出居然接反了,导致电机同 ...
楼主如果只调角度和角速度能让校车站稳么? huhulixin 发表于 2013-8-19 18:55 static/image/common/back.gif
楼主如果只调角度和角速度能让校车站稳么?
不行,车会向一个方向运动,直至倒下。但可以观察到趋向平衡的趋势,要想车稳定,必须加入速度和位移参数 mark 平衡车一共做了二十多天了,,,不知道啥时候能站起来,,, LZ的车记得加防摔保护啊,不然这样搞搞就摔坏了~~。。。{:funk:}{:funk:}{:funk:} 哥们,车卖不?
顶一个 学习了 支持一下,很好... 好吧,我也改为互补滤波 本帖最后由 huang_1688 于 2014-3-5 14:49 编辑
另外有一事不明:
ACCEL_XOUT_H :是X轴的加速度
GYRO_YOUT_H :是Y轴的角速度
这两个怎么融合 ??? 挺好的,正在弄得路过。
页:
[1]