高手们能不能把德国人程序的框架给大家分析一下
例如有几个功能模块,各模块是如何协同工作的,手动控制与自动稳定控制如何协调等 本人是做硬件的﹐軟件功底不行﹐不敢在這耍大刀了。下面說說我對于問這類問題上的方法。首先要有"我為人人﹐人人為我"的精神才行﹐這種問題想要引來大家熱烈討論的話﹐一般都要樓主把自己的成果先跟大家分享﹐說說自己很少地見解。 没人愿意静心去看那个程序,眼晕,就等楼主吃螃蟹了,呵呵! 那我先说一下对ppm信号接收子程序的理解吧
以下是0.60版程序中的rc.c
/*#######################################################################################
Decodieren eines RC Summen Signals
#######################################################################################*/
#include "rc.h"
#include "main.h"
volatile int PPM_in;
volatile int PPM_diff;// das diffenzierte Stick-Signal
volatile unsigned char NewPpmData = 1;
//############################################################################
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input
//Capture Funktion benutzt:
void rc_sum_init (void)
//############################################################################
{
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64
//(1<<ICNC1)输入捕捉噪声抑制
//(1<<ICES1)上升沿触发输入捕捉
//T1:64分频
TIMSK1 |= _BV(ICIE1);
AdNeutralGier = 0;
AdNeutralRoll = 0;
AdNeutralNick = 0;
return;
}
//############################################################################
SIGNAL(SIG_INPUT_CAPTURE1)
//############################################################################
{
static unsigned int AltICR=0;
signed int signal = 0;
static int index;
signal = (unsigned int) ICR1 - AltICR;
AltICR = ICR1;
//Syncronisationspause? 同步信号
if ((signal > 1500) && (signal < 8000)) //20MHz64分频后相当于4.8ms—25.6ms
{
index = 1;
NewPpmData = 0;// Null bedeutet: Neue Daten 空值意味着:新的数据
// OCR2A = Poti2/2 + 80;
}
else
{
if(index < 14)
{
if((signal > 250) && (signal < 687) )//0.8ms-2.19ms( 大约1ms到2ms)
{
signal -= 466; // Stabiles Signal 466是1.49ms
if(abs(signal - PPM_in) < 6) //ppm信号稳定性的判断
{
if(SenderOkay < 200) SenderOkay += 10;
}
signal = (3 * (PPM_in) + signal) / 4; //移动加权平均
PPM_diff = signal - PPM_in;//ppm信号差值
PPM_in = signal;//得到该通道的ppm值
}
index++;
}
}
}
http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_438110.gif
(原文件名:ourdev_426203.gif)
接收到的ppm信号如上图所示,包含多个通道的脉冲,通道定时器1上升沿捕捉把各个通道对应的脉冲宽度解码,并赋给数组PPM_in[]
EE_Parameter.Kanalbelegung= 1;//通道配置 通道1:俯仰控制通道
EE_Parameter.Kanalbelegung= 2;//通道配置 通道2:横滚控制通道
EE_Parameter.Kanalbelegung = 3;//通道配置 通道3:油门控制通道
EE_Parameter.Kanalbelegung= 4;//通道配置 通道4:偏航控制通道
由以上参数设置可知
PPM_in]=PPM_in
PPM_in]=PPM_in
PPM_in]= PPM_in
PPM_in]=PPM_in 支持,学习下,准备马上着手研究德国人的控制部分代码,到时候每一部分的研究成果会及时贴过来跟大家讨论,这里做个记号! 直接看FC部分吧,其它部分所有系统都一样的 fc.c还在看,很多地方不懂,也不知道怎么交流 fc.c交流比较难啊,开源很久了,就没人仔细讨论过,还没有抄飞控板的人多 我现在能看懂个大概的框架,但最近有几个参数看的很头疼,就是MikroKopter-Tool软件中设置的一些参数
比如Sticks( 控制柄)选项里的Nick/Roll P-Anteil和Nick/Roll D-Anteil以及Gier-P,我认为这几个参数是控制四轴对遥控杆响应的幅度和速度的,但是没搞明白参数为何那样取值。
还有电机的几个通道混合控制,原理基本明白了,但是从(ppm数据+传感器测量数据)---》电机pwm值之间的转化关系还不太懂 能解释一下PPM_diff数组的含义? ppm数组是将PPM进行解码 终于有人开始尝试了,我谈谈我以前看德国代码的理解:
其中姿态控制的核心其实并不多,重点可注意看两个函数:
void MotorRegler(void)
void Mittelwert(void)
其它不用太上心,而且其中超强的“德-英文混合变量名”含义也较难理解,所以建议“观其大略、省其小节”即可。
从算法来看,我个人理解应该只包含简单的PID,甚至只有比例积分,并无KALMAN之类
其中PD较为简单,但只能做到对瞬时角速度的负反馈控制,并不能长时间稳定。
让德国人四轴够长时间平稳的关键在于积分,积分算法实际在纠正角度误差。
另外,德国人程序中有太多经验参数引入,且并未统一定义与标识,整篇理解太累
大概德国高人写代码都是这种随心所欲的风格吧,也或许他的非开源版本会非常规范,但我们看不到
以上只是自己的一些粗浅理解,希望坛子里的人多讨论fc.c,多谈自己的理解,这样大家水平才会有真实提高
网上很多人跟我聊天,说想把四轴推广到工业应用,却很少有人潜心研究基础原理,不知道为什么?
估计是知道迟早有人会做,等着拿现成就可以了 jh 从MK的CVS里找到V0.72p Code Redesign killagreg的版本,注释和变量还有函数名都换成英文的了。
看起来能容易一些。
英文版本的飞控代码,注释,变量名都是英文的ourdev_439921.rar(文件大小:251K) (原文件名:V0.72p Code Redesign killagreg.rar) 不过还是建议大家看0.71h的版本,0.72p的增加了对于多马达的支持,代码变化比较大。
V0.71h Code Redesign killagregourdev_440208.rar(文件大小:2.42M) (原文件名:V0.71h Code Redesign killagreg.rar) 定期顶,希望能有更多坛里的人加入讨论 0.71h中好像用了卡尔曼滤波
“
if(FCParam.Kalman_K != -1)
{
// determine the deviation of gyro integral from averaged acceleration sensor
tmp_long = (int32_t)(IntegralNick / ParamSet.GyroAccFactor - (int32_t)Mean_AccNick);
tmp_long = (tmp_long * FCParam.Kalman_K) / (32 * 16);
tmp_long2= (int32_t)(IntegralRoll / ParamSet.GyroAccFactor - (int32_t)Mean_AccRoll);
tmp_long2= (tmp_long2 * FCParam.Kalman_K) / (32 * 16);
。。。
”
FCParam.Kalman_K应该是卡尔曼增益 我上次见到外国的四轴一般都不采用kalman 滤波的,他们好像采用一种互补滤波器进行滤波的。 mark……正在进行时~ TO【17楼】 cai_mouse
能不能详细说下 什么是互补滤波器? 互补滤波器其实RC数字滤波器的一种用法 , 看看附件吧 这是互补滤波器的仿真ourdev_440336.pdf(文件大小:130K) (原文件名:Comp Filter Simulation.pdf) 顶 从互补滤波器的仿真结果看,为什么在峰值阶段会有较大误差?
用MK TOOL观察GROY积分值与ACC均值曲线时,也是同样的问题。 这个我也不太清楚,我理解应该是高频成分比较多吧! 互补滤波器的算法是比较简单的 LS的,互补滤波算法能给个模型么?我在网上没有查到。只搜到了个卡尔曼互补滤波的东西。上传上来,大家看看。
点击此处下载 ourdev_441093.pdf(文件大小:443K) (原文件名:基于互补滤波的全数字拖靶高度控制系统.pdf) mark 点击此处下载 ourdev_528283.pdf(文件大小:112K) (原文件名:measure_dynamic_motion_combine_gyro_with_acc.pdf)
同学在网上下的,讲解加速度如何修正角速度~
其中第三页,计算k值,提到 “a time constant”,‘一段固定时间’不知具体指什么~ 下午没事,就把文档给翻译了~~不保证完全准确,望定看英文原版(29楼)~~~~
结合角速度传感器与加速度计测量车辆运动
当测试车辆时,人们常常需要测量车辆的动态运动以及车辆相对于道路的倾角。我们可以通过加速度计来获得车辆转弯、加速或者制动时产生的冲击力,但是,除非车辆在进行上述运动时保持水平,否侧测试结果是不准确的。比如,你想用加速度计测量车辆的制动力,但车辆是向前倾斜的,测量结果中就会有重力分量。
大多数倾斜传感器把重力方向当作参考方向。重力是一种加速度,并且不断变化(应该是随高度变化吧)。制动、加速和转弯时,车辆会产生加速度。然而当进行倾斜测量时,我们只需要得到重力加速度;当进行车辆动力测量时,却又只想得到运动加速度。
有运动加速度时,倾斜传感器将得到一个不准确的倾角。也就是说,在车辆倾斜时只通过加速度计将无法得到准确的倾角。
通过测量绕车辆重心的旋转,角速度传感器有助于纠正车俩向前倾斜带来的不利影响。不幸的是,角速度传感器有其自身的缺陷。它测量旋转速度,不是旋转角度,通过不断积分得到角度。当旋转速度的测量出现偏差,积分后所得的角度将会有很大的偏差。但是,你可以结合角速度值和加速度值,计算出车辆动态运动时的精确数据。角速度和加速度的缺点可以相互弥补。当拥有足够强的计算能力,我们就可以得到实时的加速度和角度的精确值。
要实现这一点,你需要测量沿三个轴的加速度和角速度。于是我们沿着车身安装了三轴加速度计,和与值对应的三轴角速度计。见图1。如果可能,传感器最好安装在车辆重心,尽量减少旋转加速度对测量带来的不利影响。
http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_528975.jpg
(原文件名:page 1.jpg)
图1。车辆各轴上的传感器
我们可以用角速度传感器测量车辆绕给定轴的旋转。如果一直对角速度积分,将会得到角度关于时间的函数。例如,您可以使用角速度传感器来跟踪车辆沿着X和Y轴的旋转,然后对传感器信号积分,计算出车辆俯仰角和翻滚角。这是一个关于时间的函数。根据这个计算得到的俯仰角和翻滚角,从加速度传感器信号中减去由于倾斜带来的重力分量,最终得到运动加速度。
要得到可靠的俯仰角和翻滚角,你必须对角速度信号积分。结果是,角速度信号的偏差,会造成角度的偏差,并且随时间线性增加。此外,角速度传感器的随机噪声会导致计算角度的随机波动,这种波动使得角度以与时间的平方根成正比的速度漂移,even in the absence of rate bias error.这些影响将限制昂贵的角速度传感器在超过几分钟测量时的应用。
幸运的是,我们可以利用角速度传感器短时测量准确的优势和加速度计长时稳定的特点,两者结合,得到即能短时稳定又能长时稳定的倾角。用角速度传感器测量短时内角度变化,把加速度传感器当做倾角传感器测量倾角,并在一个长时间范围内,迫使角速度传感器得到的倾角慢慢匹配加速度传感器得到的倾角。
要执行这些操作,需要有传感器,以及数据采集和处理设备。我们使用一个三轴加速度计和(三个)3轴角速度计。不管沿哪个方向,你都需要以能测量车辆完整运动的目的来安装这些传感器。还可以添加一个温度传感器,用其采集的数据补偿温度对加速度计和角速度计输出的影响。然后将传感器信号数字化,并输入计算机或存储器。
可以使用电脑对得到的数据进行计算。但是,如果想看到实时的计算结果,那得需要一台数字信号处理器(DSP),作为信号采集设备之一。然后,将计算得到的角度数据、已修正的加速度和角速度信息用数据线传送到电脑。如果发送的是二进制数据包,工作在38.4K波特率的串行RS-232数据线应该满足超过200Hz的传输速率。这大大快于角速度传感器的带宽。
尽量把传感器安装在靠近车辆运动中心的地方。否侧旋转产生的离心力将会被加速度计测量。请注意,我们使用加速度计只是测量车辆重心的线性加速度,所以要尽量减少旋转运动对加速度测量的耦合。
http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_528974.jpg
(原文件名:page 2.jpg)
图2。硬件配置
图3显示了一个轴的算法。实时对角速度传感器输出积分得到原始角度。利用加速度计测量重力方向并推断出倾斜角度。例如,如果在x轴上得到0.1G的加速度,这意味着倾斜角为arcsin(0.1)=5.7°。为了避免震动和冲击造成倾斜角计算错误,使用截止频率为 100Hz或更底的低通滤波器。简单的单极RC滤波器即可。
http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_528973.jpg
(原文件名:page 3.jpg)
图3。稳定的角度计算。
计算两角度之差,为误差信号。它可以用来更正角度计算。这里定义了一个增益参数,k,决定着有多少误差信号用于更正角速度积分。最后将角速度原始积分与误差信号(已乘增益)相加。该过程的输出是一个角度值,短时间看角速度值起主导作用,但长时间看是由加速度值来修正的。时间尺度由k值决定。
增益参数k is similar to the erection rate in an analog vertical gyro. k值设置时间常数,在这段时间内角速度传感器计算得到的角度被重力计算的角度稳定修正。您应该选择一个比预期测试更长的时间常数。然后将它除于测量速率,就是k值了。例如,如果你选了一个5s的时间常数,而且角速度和加速度传感器的工作速率是200Hz。那么,k=5/200=0.025。
一旦得到稳定的倾角,就可以用它修正原始的加速度数据。这样能得到沿任一轴的真实(运动)加速度。请注意, 一旦倾斜,重力分量就会被x和y轴的加速度计测量。解决这一问题的办法之一是建立一个旋转矩阵,根据已求取的倾斜角,将加速度矢量(x,y和z轴与车辆一致)旋转到地面坐标系(对车辆坐标系进行坐标变换)。在水平系统中,重力是完全竖直的,所以水平方向上x,y轴得到的将是纯运动加速度,没有重力分量。
最终结果是得到车辆运动的完整描述,包括角速度,稳定的倾斜角度和纠正了的线性加速度。以上描述的实时系统可以使用固态传感器实现。这构成了一个可靠,廉价的车辆运动检测系统。 德国人的东西怎么就是那么值得我们研究呢? mark 很好的帖子,收藏了 帖子不错。收藏。。。 顶,正缺这些东西! 回复【31楼】ddcour 小打小闹
-----------------------------------------------------------------------
德国人的东西怎么就是那么值得我们研究呢?
-----------------------------------------------------------------------
你的水平要有人家好,我们可以研究你 signal = (3 * (PPM_in) + signal) / 4; //移动加权平均
请教高手,这句到底是怎么回事啊,想了很久都不明白 signal -= 466; // Stabiles Signal 466是1.49ms
signal = (3 * (PPM_in) + signal) / 4; //移动加权平均
signal本身不就已经是脉宽了嘛(少了4个系统时钟周期,但精度可以接受),为什么还要加这两句呢?急盼高人指点,快想崩溃了 void (*mark)(); thx 4 share 记号一下。 正在学习这个东西,好贴,哈哈 mark MARK 太高深了,慢慢学习,关注 mark 对自动控制很感兴趣 mark 回复【38楼】xzhtom
signal -= 466; // stabiles signal 466是1.49ms
signal = (3 * (ppm_in) + signal) / 4; //移动加权平均
signal本身不就已经是脉宽了嘛(少了4个系统时钟周期,但精度可以接受),为什么还要加这两句呢?急盼高人指点,快想崩溃了
-----------------------------------------------------------------------
移动加权平均就是一阶惯性滤波,第二行引入的3、4两个常数,代表加权值
意思是历史脉宽75%权值,实时检测脉宽25%权值,此算法相当于硬件低通滤波
有助于消除非目标惯性运动带来的白噪声,比如电机运转造成的机身共振
用MEMS器件做惯性导航方面的应用,低通滤波是最基本的要求。 回复【30楼】DDAI
......
幸运的是,我们可以利用角速度传感器短时测量准确的优势和加速度计长时稳定的特点,两者结合,得到即能短时稳定又能长时稳定的倾角。用角速度传感器测量短时内角度变化,把加速度传感器当做倾角传感器测量倾角,并在一个长时间范围内,迫使角速度传感器得到的倾角慢慢匹配加速度传感器得到的倾角。
......
-----------------------------------------------------------------------
这段话的核心就是:
陀螺仪测量角速度,角速度与时间的积分就是动态角度,但有累积误差。
加速度计测量重力方向,可在静态时计算倾角,且没有累积误差。但由于不区分重力与外力加速度
变加速环境下角度收到外力干扰很大,用软件算法结合二者,即可得到较为真实的姿态角。
卡曼滤波或德国四轴的加速度修正积分都是如此。
卡曼滤波需要大量浮点运算,不太适合用在FC控制板上的8位MCU,且滤波参数确定需要大量试验数据。
德国四轴的加速度修正积分简单可靠,基本可实现全整数运算,故为小型惯导应用首选。
德国四轴算法的缺点是修正系数固定不可调,在角速度积分与加速度角偏差较大时,需要较长纠正时间。
其实只要在德国四轴算法中再进一步,将修正系数改为根据运动状态滑动(自整定),动态调整积分角与加速度角权值
即可得到非常真实的姿态角,下图就是在一稳定平台项目中的横滚轴测试截屏:
图中黄色线是三轴加速度计直接低通滤波后算的倾角,红色是惯导算法求解的姿态角,其滤波效果已经好于我以前用的卡曼滤波
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_589750GBODHD.JPG
(原文件名:未命名2.JPG) 顶 看来这导航算法是关键啊 德国人加gps悬停是不是用的gps与惯导卡曼 MARK mark mark 回复【29楼】DDAI
-----------------------------------------------------------------------
请问一下, 为什么 "角速度信号的偏差,会造成角度的偏差,并且随时间线性增加。此外,角速度传感器的随机噪声会导致计算角度的随机波动,这种波动使得角度以与时间的平方根成正比的速度漂移"这个角度随时间的平方根 又是因为什么而来的呢? 好东东,记号一下. 对自动控制很感兴趣 好东东,记号一下. 下不了,?? mark,好贴,论坛里的技术贴实在太少了,我们毕业设计做这个,想在算法上改进一下,现在正在读代码,请论坛里的老鸟们不吝赐教 mark mark 顶一下。基础有点差,慢慢看。 mark mark Mark 学习 回复【楼主位】zht9961020
-----------------------------------------------------------------------
请问哪里能下载它的source code?谢谢。 喜欢程序框架之类的东东~ mark mark~ mark Mark! 来学习一下下~~~~ Mark! 学习了。 mark 先下载了pdf,回去自己研读一下再来请教!^_^ 高人啊,顶! mark 马克,一下,高手好多的啊
马可…菠萝 啃源代码,支持 {:biggrin:}{:smile:} {:lol:}
最近也在研究这个,根据前人的经验然后摸索容易找着道儿 cnmusic 发表于 2009-4-27 15:16 static/image/common/back.gif
不过还是建议大家看0.71h的版本,0.72p的增加了对于多马达的支持,代码变化比较大。
V0.71h Code Redesign...
德国人用的是什么cpu , atmega644p主频只有20M,不是传说中的500M呀 cnmusic 发表于 2009-4-27 15:16 static/image/common/back.gif
不过还是建议大家看0.71h的版本,0.72p的增加了对于多马达的支持,代码变化比较大。
V0.71h Code Redesign...
cnmusic 大侠开始发飙了...{:3_48:} 新手来学习一下
页:
[1]