搜索
bottom↓
回复: 151

回馈论坛,开源飞控。

  [复制链接]

出0入0汤圆

发表于 2013-8-24 23:18:28 | 显示全部楼层 |阅读模式
本帖最后由 zywei_09 于 2013-8-25 11:00 编辑

基本概况:
飞控名字:暂且叫WZY吧
主控芯片:STM32
传感器:MPU6050+HMC5883L+BMP085
操作系统:uC/OS-II
编译环境:keil 4

具体代码在压缩包的WZY飞控中,项目开发过程在压缩包的PDF中。










四旋翼飞控项目日志








                                                                                          作者:WZY



前言
                大四下学期完成主体程序,大四毕业暑假加入操作系统,希望大家共同学习,共同进步。

                                                                                                                 2013.8

时间 2013年2月2日11:57:37
  项目进展了这么久第一次写日志,总结一下这一段时间的经验。首先,我通过李想的stm32教学视频对stm32进行了简单的了解,发现stm32用起来比51都方便,原来一直被“arm难学”误导了,单片机只是工具,真正编算法才是难点,所以以后在做项目时不应该过分考虑单片机是否好用这个问题,只要适合项目的单片机就应该拿来用。
  李想视频里编译环境是MDK,所以在编程时一直使用MDK编译,感觉和学51时用的keil一模一样,比较好上手。由于项目所要做的第一步是要做姿态解算,所以在初步了解stm32原理以后,就开始从MPU6050传感器读数据。MPU6050是一个集成了加速度计和陀螺仪的传感器,使用I2C和单片机进行通信,总体来说读取数据还是比较简单的。但是也遇到一些比较烦人的问题,卡了好久。一个是变量类型搞错了

这是一段读取MPU6050陀螺仪x轴数据的程序,先通过I2C函数把陀螺仪X轴数据的低8位和高8位读取出来,分别放入BUF[0]和BUF[1]中,在通过移位把两个数据合成一个数据传入G_X变量,G_X是一个short型变量,而imu_measure.gx是一个double型变量,编译器编译是自动把G_X转成double型除以16.4赋值给imu_measure.gx。曾经犯过一个错误就是把BUF数组数据相合后直接除以16.4然后赋值给imu_measure.gx,结果通过串口传回来的数据就出现了错误。以后要避免这种错误。
  在新添加文件后要记着把文件添加进工程,否则编译会出错。
  至于为什么除以16.4,参考《MPU-6050寄存器映射》第32页

  在MPU6050初始化时把 FullScale Range设置为±2000°/s,所以灵敏度为16.4 LSB/°/s,
所以在读出寄存器值的基础上除以16.4就是角速度。
  而对于加速度,设置为±8g,灵敏度为4096,所以在读出值的基础上除以4096就是加速度,单位为g,再乘以9.8单位就是m/s^2,所以8192/9.8=835.066,除以这个值就是加速度(m/s^2)。同理,在理解MPU6050初始化的设置时,参考这本手册即可。


要设置为+-4g 即0000100=0x08
  还有一个就是extern变量的使用。正确的用法是在初始化的地方定义(函数外定义,如果在函数内则会是局部变量),然后在External_Variable.h文件中用extern关键字再定义一遍(注意,这里不要赋值),告诉编译器,这个变量在其他地方已经定义过,直接使用即可。然后需要用到全局变量的文件开头进行#Include “External_Variable.h”,就可以了。
  MPU6050传感器初始化时,使用I2C总线函数即可,例如:
Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);       //解除休眠状态
分别写入MPU6050地址,寄存器地址,和写入的值即可。出现一个问题就是MPU6050的I2C地址在手册上写的是7位固定,为0x68(1101000),但有的例程上给的是直接写入0x68,实际在使用过程中写入0xD0(11010000)才有反应,即7为固定位加一位硬件设置的地址位(BIT0=0)。
在MPU6050初始化后就可以不停的读取传感器值进行姿态解算了。在姿态解算前,我先对四元数进行了初始化,即飞控板在静止状态下通过加速度计解算欧拉角,再通过四元数公式计算(即函数quat_init())。其实感觉这里不初始化也可以,因为姿态解算速度很快,第一次的值对以后影响并不大。
随后就开始真正的姿态解算了,首先要对读取的传感器值进行移动均值滤波。定义了Filter_ACC结构体,先把读取值加到这个结构体变量里,每加一次,积分标记位加1。当定时器中断触发。姿态解算周期到来时,进入if(IMUupdate_flag == TRUE){}里面求平均值并对变量清零,完成移动均值滤波。

滤波过后,就开始用IMUupdate()函数进行解算,这个函数是参考
在实际编程中发现,在输入IMUupdata()函数前如果角速度不除以一个比例系数,解算出的姿态角就会出现超调或者,但是如果系数过大就会出现调不够的现象,所以实验的几次以后找到了一个经验值。


进行使用的,基本原理是把加速度计解算出的姿态和上次解算出的姿态(认为是正确的)进行向量叉乘,得到两个向量的差,然后把这个差乘以比例系数和角速度数据融合得到认为是正确的角速度里,将正确的角速度代入到龙格库塔方程里推算出当前正确的姿态。方程里所需的半周期halfT是由TIM2中断产生的(TIM2每2ms中断一次,即T=2ms,halfT=1ms)。在这个过程里还引入里积分环节来消除静差。

比如陀螺X轴读取时始终有个 -32 °/s的误差存在,在姿态解算后,滚转角始终不是平的,会有一个误差,但是会发现这个误差会逐渐减小,这就是积分环节在起作用。
其实在一开始,通过上位机看stm32姿态解算的状态并不是很好,最后发现是uart1传输函数里面有个Delayms(1),晕死,本来对速度的要求就很高,结果每传输一次就延时1ms,不出问题才怪。结果吧这个延时函数去掉以后干脆不出数据了,卡了好久,发现是自己思维进入死胡同了!忘记串口传输完毕是要等待传输结束的:

结果加上这句话后形式一片大好~顺利的解算出了姿态,而且效果很好。

这里使用的上位机软件是阿莫论坛上一位大虾提供的,很好用,不足的地方就是传送速率过快会卡,不能迅速显示,不过功能还是挺强大的,可以数据保存截图什么的。
下一步的任务就是使用HMC5883对偏航角进行修正,由于加速度计不能读出偏航角的数据,所以偏航角由于陀螺仪误差的缘故会一直向一个方向偏。再然后就是读取气压高度。
2013年2月3日23:14:52
今天主要解决的是全姿态罗盘。说来很惭愧,大部分时间卡在一个很细小的问题上,就是HMC5883L的I2C总线地址上。一开始翻看MWC的程序,磁阻仪的地址上0x1E,于是用I2C向磁阻仪写入0x1E,结果一点反应都木有啊~试了各种方法,一度以为是MPU6050的I2C辅助位没有设置好(其实设置是没问题的,让MPU6050的I2C_Master功能disable,ByPass功能打开,主芯片可以直接控制HMC5883L,这两个寄存器分别在0x37和0x6A两个寄存器里),在这里设置了好久。后来突然想到上篇日志里写的地址移位的问题,查看MWC飞控的I2C写入函数,果然地址进去以后先要左移一位,顿时泪奔,0x1E左移一位是0x3C,按这个地址写入瞬间各种正常~
但是在磁阻仪数据读出后,立马又发现了一个问题。飞控板转动90°,上位机显示实际的转动是小于90°的。然后就各种逛论坛啊,各种没思路。于是决定先睡一会儿,困死了,结果刚躺下立马就有思路了,果然过于专注一个问题思维容易进入死胡同。其实磁阻仪的每个轴的数据并不是关于0对称的,这是一个误差。另一个误差是每个轴的变化量是不同的,以X,Y轴为例,如果以想两轴的数据确定一个点(X,Y),那么如果把飞控板转一圈得到的数据画出的圆其实是一个椭圆,而且和原点存在偏移。如图:

蓝色点是飞控板在XY平面旋转一圈采集到的数据,红色圆圈是用matlab拟合得到的圆。
通过matlab拟合,我们得到了下图数据:
其中数据从左到右分别为椭圆圆心的坐标(X,Y),然后是椭圆长半轴和短半轴的长度。
所以我们可以利用这些数据对磁阻仪进行校正。

其中椭圆圆心的偏移量分别为磁阻仪XY轴数据的偏移量,用原始数据减去这个偏移量即可。然后由于Y轴比X轴长,所以把X轴数据乘以长半轴和短半轴的商来校正X轴数据,这样XY轴数据就变成一个没有偏移的圆,通过atan2函数就可以求方向角了。

如图,我把飞控板旋转90°,可以看到上位机读到的数据从180°左右变到了270°左右。

但是接下来又存在一个问题,就是这个方法只能在水平面内使用,如果有滚转或俯仰角,通过磁阻仪计算得到的偏航角就会有很大幅度的变化。然后又是一顿查资料,找到几篇关于全姿态罗盘的论文,参考上面的把磁阻仪三轴数据变化到平面的公式编入程序中发现,根本没有什么变化。可能是这个飞控板的传感器安装和论文里所用的安装方位不一样的缘故吧。然后又是一阵挠头,突然想到MWC飞控里应该有相应的程序。于是翻MWC的程序,结果还真找到了。
heading = _atan2f(EstG.V.X * EstM.V.Z -EstG.V.Z * EstM.V.X, EstG.V.Z * EstM.V.Y - EstG.V.Y * EstM.V.Z)
上面是MWC全姿态罗盘的程序,Est.V.axis分别是重力向量在机体坐标系下在机体坐标系各轴的分量(即机体坐标系下重力向量),EstM.V.axis同理为机体坐标系下磁场的向量。用这个坐标变换并用atan2函数就可算出偏航角。
按照这个思路把程序写出来并实验了一下。
下图中红色为偏航角,黄色为滚转角。可以看到当滚转角发生变化时,偏航角只发生了小幅的变动,可以看出全姿态罗盘算法起作用了。而偏航角的小幅变动我推测是由于Z轴没校正好的缘故。Z轴的校正没有用matlab拟合,只是简单的找了最大值和最小值算偏移量(由于只是简单的手动旋转,可能没有找到真正的最大值和最小值),然后用Z轴数据的量程和Y轴数据的量程做比较得出比例系数。其实如果把三轴数据统计会得到一个椭球体,然后用matlab拟合得到椭球体的原点偏移和各轴的长度,相信可以得到更准确的磁阻仪校正。


至于如何用matlab拟合,是从论坛上找到的现成的程序,改天把它改成椭球体的拟合。数据处理是通过串口助手读取数据存到word里,然后将文本准换成表格,以空格分列,然后把各列数据存到Excel里,最后用matlab读取数据。由于我的matlab貌似存在问题,得用主程序图标以管理员方式运行,进入后把目录设置成拟合程序的目录,然后用XY=xlsread(‘file’)函数读取数据。

在程序里,今天做的最大的修改就是把均值滤波去掉了。因为发现在姿态解算前积分量只积分了一次,也就是说就是当前读取传感器的值,所以干脆去掉了。而且传感器最快的读取速度也就1KHz,姿态解算的速率是500Hz,没有必要滤波了。如果以后装到飞机上发现噪声严重的话再滤波和降低姿态解算速率。


2013年2月4日22:27:33

今天做的主要一件事就是把陀螺仪和磁力计的数据进行融合。因为陀螺仪在很微小的转动时几乎察觉不不到飞控板的转动,所以需要磁力计的数据进行校正。而磁力计虽然昨天做了全姿态罗盘的变换,但是在存在俯仰和滚转角时,偏航角任然有扰动,所以又需要陀螺仪来校正,所以我要把这两个传感器的数据相互融合来取长补短。

其实一开始的想法是通过磁力计解算偏航角,然后把加计和陀螺仪解算的俯仰滚转角和磁力计解算的偏航角一并转成四元数,用于下次四元数解算。但是实际效果并不是很好。纠结了一会儿想到一个办法就是把加计和陀螺仪解算的偏航角和磁力计解算的偏航角融合,然后引入一个积分环节,每次积分的值是陀螺仪解算的偏航角和最终解算偏航角的差,用这个积分环节去校正由于加计和陀螺仪解算的偏航角的静差(这个偏航角有累积误差)。

这个方法试验了一下效果不错,但是就是存在一个问题。比如由180°转到360°(0°),由于当磁力计的偏航角到达360°时,加计和陀螺仪的偏航角未必到达360°,所以就会出现一个现象,再稍微顺时针转一下,磁力计的偏航角又变成几度,而加计和陀螺仪的偏航角还在300多度。这样积分环节就会把最终解算的偏航角逆时针转到磁力计的偏航角(大概几度那里)。这是一个很不好的现象,所以我在这个基础上对算法又进行了改进。由于我们需要的是陀螺仪数据,所以我们可以直接从角速度入手,如下图:

把角速度计和磁力计数据融合,gz为角速度数据,乘以负数是和定义的转动方向有关,我定义的是顺时针转动角度从0°变到360°,而gz数据正好相反,所以要乘负数。由于每2ms调用一次IMUupdata(),所以gz*0.002就是2ms转过的角度,对此积分就是实时的角度把磁力计解算角度和上次解算的偏航角做差得到偏航角的误差,乘以一个系数0.002(经验值)再积分用来修正角速度计的累积误差实验表明,角速度计再快速转动时误差较小,但是转动速度较慢时通过积分几乎得不到偏航角的变化,此时就需要用磁力计校正通过数据融合,即避免了角速度计的累积误差又可以用角速度计解算的角度校正滚转俯仰时磁力计产生的误差(从±15°减小到±3°)

这样就很好的避免了上述现象。效果如下:

上图中黄色是滚转角,蓝色是俯仰角(左面图例有误)。当我把飞控板做了三次滚转和三次俯仰动作,可以看到偏航角变化幅度很小。滚转时偏航角的变化是由于用手滚转时不可避免的会影响偏航角。基本上误差在±3°以内,而原来未用陀螺仪校正时可以达到±15°,所以,数据融合起到了很好的效果。

程序中变化较大的就是原来提到的陀螺数据除掉的那个系数,如下图:

  这句代码被删掉了,这个系数也被直接放在MPU6050的宏定义里:

16.4*35=574 16.4是陀螺仪灵敏度,35是系数(本来应该是57.3,即角度值转化为弧度制,但实验发现用35效果较好)。
  原来的除以一个系数后来发现是由于我没把角度值转化成弧度制,看来以后还要细心。

  然后我给BMP085写了驱动,其实BMP085一开始并不需要对其寄存器写一些值进行初始化,而是一开始从BMP085的EEPROM中读取一些值用来以后的数据校正。在使用BMP085时直接向寄存器写值读取即可。但是BMP085有个比较麻烦的地方就是,当你给寄存器写入值准备读取后,它会有个转换时间,如果你在这里加延时等待,就会大大减缓飞控的主频率。所以我还是用了原来使用超声波计的方法,用一个标记位,先写入值准备读取然后跳过去执行其他的命令,当循环几次过来发现标记位触发然后接着读取,这样就会节约很多的时间。

上面是一段读取代码,BMP085_Read_flag就是标记位,从1到4中间隔了三段,每段2ms(IMUupdata函数的调用周期),这样从BMP085_Read_flag=1到BMP085_Read_flag=4中间就隔了6ms,而手册上写的读取时间是4.5ms,所以可以读取。
  不过问题就是,读取后的结果有点诡异。

  不知道哪里出错了,等明天用普通的延时函数读取一下,看是不是这种方法不能用。



2013年2月5日13:08:50
  OK,忙了一天继续写日志,感觉快养成一个习惯了。
  首先今天上午在实验飞控的时候发现飞控在0°的时候仍然存在当磁力计偏航角先从0°多变到350°多时,融合后的偏航角会从0°多顺时针转到350°多,也就是它绕了一个大圈去校正误差。这个问题上文提到过,但是当时以为已经解决了,现在看来还是没有,只是原来逻辑出错了。
  所以我又设计了新的代码解决这个问题,那就是如果误差大于180°就把积分值反方向加,这样就不会绕大圈校正误差了。代码如下:

  把程序拷进去以后发现这个问题被很好的解决了,当我在0°左右变化时,比如从0°多变到350°多,偏航角不会再绕一个大圈去校正了,效果如下:

  接下来是卡了一天的BMP085数据读取问题,接着昨天的那个两个大气压,各种改程序啊,然后参考MWC的还用外部中断判断是否转换完毕,各种调不通啊。。。还读出过5000多Pa的气压,海拔-2000米什么的。
  后来灵感一来发现,我由于在把别人程序拷过来的时候嫌麻烦(别人程序和自己的定义不一样),把uint_32什么的强制转换直接去掉了,因为之前程序里也有好多强制转换直接忽略也没出什么问题,于是我把这些强制转换都加上,uint_32对应的是unsigned long。发现数据就对了,看来调bug还是得靠憋灵感。。。
  不过气压即使读出来发现气压计精度真的很差,静止不动的情况下从一开始的0m能飘到20多m,无语,看来以后当普通的海拔高度计用吧。定高用更精确的气压计或者超声波什么的。



2013年2月6日23:12:01
  今天最大的改动是先把所有的主循环任务放到一个新的函数loop()里,以便以后添加新的任务


  今天发现一个容易出错的问题就是MDK编程里往函数里输入数组直接输入数组名字即可,不需要加[],加上反而会报错。

  还有一个卡了好久的问题就是把滑动均值滤波函数和数据处理函数放到ARHS函数里上位机就没有三个角度的信息,好奇怪,调了好久也没调通,但是只要放在READ_MPU6050()函数里就没问题,索性就放到这个函数里,反正读取数据就要连带滤波和数据处理。

  今天最大的加入就是把PWM输出模块加进去了,虽然是直接拷贝别人的,不过大概看了一下发现也不是很难。基本原理是用TIM4定时器先预分频,72M降到24M,然后设置一个计数上限1000,即PWM的频率是24M/1000=24k Hz,然后TIM4有4个通道,每个通道有寄存器,用通道寄存器和总寄存器比对输出PWM,有点类似8051F的PCA高速输出模式。

  但是又出现一个问题,定时器的预装填值到底用不用减1,PWM例程里1000上限装填的是999,但是更多的例程是不减1的,以后有示波器专门实验一下。


2013年2月8日21:39:33
  基本上飞控已经初具雏形,现在PWM输出和输入都加上了,现在PWM输入调通了,接下来再调PWM输出。
  在编程中发现,每个通用定时器(2~6)都有四个通道,相当于PCA,非常强大,可以产生四路PWM或者检测输入的四路PWM。不过每个定时器的端口是由限制的,芯片是定义好的。参见手册(《STM32中文参考手册》)81页。其中,我用TIM2输入PWM,所以对应PA0~3,用TIM4输出PWM,对应PB6~9。


  而原来产生任务时钟基的定时器变为了TIM3任务,留出TIM2给PWM输入,其实用基本定时器6或7就可以给任务产生时基,但是还不会配置基本定时器,留给以后改变吧。这样可以把TIM3通用定时器留给其他功能。毕竟简单任务就应该配置简单定时器

  然后我在程序中加入了滑动均值滤波器,基本原理是依次更新数组的数据,然后每次调用都把数组所有数据相加再除以数组大小。代码如下


   接下来是头疼了好久的PWM输入的问题,程序是参考的MWC飞控。MWC飞控接收遥控信号给了两种方式,一种是用一个端口检测一路PPM信号,另一种是用8个端口依次扫描每个端口的PWM脉宽。这里我采用了后一种,这样可以直接使用遥控接收机的信号,否则要用PPM信号需要从接收机里的一个引脚里引出PPM信号,或者用解码器,都比较麻烦。
  MWC的流程是先初始化TIM2,用TIM2的四个通道进行读取。当时犯了一个错误就是MWC程序TIM2已经GPIOA端口的APB总线时钟在程序其他地方已经打开了,所以程序这里没打开时钟的代码,而我直接用人家的代码没有任何反应,后来才发现这点赶紧把GPIO,NVIC,TIM2的初始化代码补全,然后就正常了。
  MWC的端口扫描的基本原理是触发TIM2中断后进入中断,然后来一个for循环循环判断四次(因为有四路输入),看是哪个通道产生的中断,判断出以后用一个switch语句把捕捉到的高电平(或低电平)时间赋给变量val,然后根据state->state标记位判断是高电位时间计数还是低电平时间计数,分别赋给state->rise和state->fall。当然,要获取一个rise一个fall是两次进入中断函数完成的。然后他判断这两个计数大小,相减或者求相减的补数得到高电平时间。这是一个非常巧妙的方式。
  但是一开始的时候整个过程非常占用CPU时间,以至于PWM输入功能一打开,CPU只执行PWM输入功能,其他的都不执行。然后我就想找关闭PWM输入功能的语句。试了好久,关GPIO时钟,关中断向量,关TIM2,都没用。没办法,从初始化函数开始一部分加一部分的关闭尝试,当关闭TIM2时钟是发现中断关闭了。这就好说了,我用任务时钟基的标记位Control_counter == 1时打开TIM2时钟,然后当TIM2中断执行16次(每个高电平至少需要两次中断读取,4个高电平就8次,保守一些让中断执行16次)后关闭TIM2时钟,这样就实现了每2ms读取一次PWM输入的功能。把程序烧进去以后一切就都正常了。

上图是程序运行后通道1输入PWM后的结果,可以看到检测到了值而且在变化。我用另一个stm32产生了50Hz(舵机标准信号)的PWM,脉宽从0%变到90%(飞控PWM输入计数应该从0变到18000,满值是20000)。可以看到,图上读数从19000变到1200左右,说明PWM输入起作用了。由于在0%和100%附近PWM信号会失真,所以最大超过18000最小未达到0也是可以理解的,当然也有可能是没有显示出来的缘故,向上位机输出的频率是20Hz,而扫描的频率是500Hz。
  然后我一次把PWM信号线插入通道2 3 4,也读出了数据,说明四个通道都没问题。


上图是上位机读到的通道1的捕捉值变化,纵坐标是200代表20000,可以看到PWM输入很好的跟随了另一个stm32的PWM输出(从0变到18000再从18000变到0),但是偶尔会出现噪声。如

但是这不是最致命的,PWM跟随期间有一段时间会出现下面的情况

噪声很严重,推测是上升沿和下降沿判断出问题了,看来需要对于这个过程多一些判断,避免出现上面的过程。



2013年2月9日12:44:54
  读取多路PWM没进展中,各种噪声各种紊乱。。。。
  读取函数重新改了,改得类似原来8051F开发的PCA函数了(break语句卡了好久)。但是读取值向上偏移2000,去学校用示波器试试,现在不知道是产生PWM的stm32缘故还是读取的缘故。
  只能读出一个通道,是因为TIM_GetCapture函数分TIM_GetCapture1,TIM_GetCapture2,TIM_GetCapture3,TIM_GetCapture4,四个通道。

  关闭看门狗中断,提高TIM2中断优先级

  循环变量不要用全局,污染变量。

  实在不行还是用PPM吧


2013年2月11日12:19:28

  PWM输入搞不定,暂且用上升沿下降沿切换这样读取吧。。。以后再说


2013年2月11日22:42:50

  终于完美解决PWM输入问题了~哈哈哈~
  原来一直困扰的紊乱问题是由于PWM输入波形不稳有噪声,导致错误触发TIM2中断造成的,然后发现stm32的定时器中断有自带的滤波功能,我把滤波值调到最大,就再也没有紊乱了!

  不过还有一个问题就是还是偶尔会有突然变成负的情况,后来才知道那不是变成负的了而是超过一定的范围(大概30000多),数就会变成负的,原来用8051F和手机串口通信的时候也遇到过这种情况,所以原来一直用和0比大小是没有用的。结果我把比20000大的都去掉就好多了。


再也没有出现负的的情况。

  在分析读回来的数据时候,我发现,这些数据依次是增长的关系,之所以有负的是因为超过30000多他自己就会变成负的,由此我彻底明白stm32四个中断和计数器关系了,这四个中断相当于计数器的照相机,计数器计到一定值触发中断通道中断就会记录下来。置位CCRx寄存器是不管用的,必须置位计数器TIMx->CNT!


  置位后的结果:

  有一部分还是负的是因为量程超过30000了。
  所以教训就是以后遇到问题不要光假设瞎调,要深入到问题的每一个步骤发现问题。
  下面是现在的结果:


  OK,明天把PID控制部分一写,把PWM输出程序再调一下就差不多了~


2013年2月12日14:30:01
  今天我把程序改回原来的4通道输入了,完全没有问题!

一边姿态解算,一边PWM输入。


2013年2月12日21:08:46
  OK,历经一个寒假的四旋翼飞控终于有完工的曙光了。现在已经做到除了四路PWM和2.4g无线通信没调其他都调通了,这两项留给到学校调吧。在家也没有示波器,不方便。

  下面介绍一下今天做的PID控制。
  主要参考《标准的PID处理例程》
  PID算法比较简单,就是测量值和期望值做差得到误差,然后把误差存起来得到PrevError和LastError,也就是上上次的误差和上次的误差,用来做微分运算(即相邻两次误差的差),然后还有pp->SumError,存放积分值的。然后把比例积分微分值分别乘以比例积分微分系数就得到控制量。

这个截图里的红色划线代码是把期望值和测量值做差,乘以2000再强制转换成char型,这样就把比较小的误差值转变成整型了,有利于提高运算速度。精度为1/2000*180/PI=0.03°,这个精度已经比较高了。这整个过程相当于定点浮点运算。

  在PID控制函数里,我先通过遥控器的值得到期望值再通过PID运算得到四个PID输出量,再用这四个输出量控制四个电机。
  其实整个PID控制是比较简单的,这个飞控只是一个平台,将来在这个平台上将进行遗传和神经网络的验证。

上图是比较暴力的晃动飞控板时测得的数据,红黄蓝是俯仰滚转偏航角的变化。后面紫色的三角形是PWM输入跟随,可以看到飞控程序很好的完成了测量和计算工作。并且整个过程是加上PID控制的。


2013年2月13日20:26:16
  今天主要完善了PWM输出功能,原来PWM输出之所以调不通是由于通道中断没有初始化,应该分别对四个通道进行初始化。

通过对这几个通道的设置PWM波就生成了,本来想用之前测PWM占空比的程序测一下生成的占空比,但是由于生成的PWM波频率是72000000/2+1/1000=24kHz,频率太高,单片机无法测出,不过把占空比改变的程序烧进去再把输出查到LED灯上,LED灯的亮度确实在变化,说明PWM生成程序起效了。
  PWM生成是通过STM32定时器输出比较的TIM_OCMode_PWM2模式,这里有两种模式TIM_OCMode_PWM1、TIM_OCMode_PWM2其实只是极性不同,就是输出的PWM高低电平会相反。很奇怪的是,手册上说STM32的定时器有TIM_ICMode_PWM1模式用来测PWM输入信号的高电平时间和周期,但是写上这个后编译器报错说没有这种模式,到网上查也没有很好的解决方案。
  在设置PWM输出引脚时有一个问题就是如果设置成B端口所有引脚打开,程序就出问题了,如果打开要用的PB6~7就没问题,不清楚是为什么,可能是和其他地方的设置冲突了。
  在做PID运算时出现的问题就是为了节约内存我把变量设置成char型,但是参数传递过程中出现问题,我想输出值传入500,但是上位机显示只有244,索性把变量设置成int型就没问题了。
  在用上位机看PID效果时我发现俯仰角正负变化相同的角度,和姿态解算的结果不同,导致PID运算输出也不同。这样的原因是加速度计没有校准,由于原来对加速度计的精度要求也不高,所以一直没有校准。校准的方式和磁力计类似,不过比较简单,只是单纯的通过上位机的数据找最大值和最小值,这两个值的和除以2就是偏差,然后把初始数据减去这个偏差。然后测了一下各个通道的量程,发现基本上都是8200左右,也就是说不存在数据组成的是一个椭圆的问题,用atan直接计算就可以得到角度。通过校准以后,俯仰角数据就比以前准确了。原来水平放置俯仰角是1.8°左右,现在已经变成0.6°了。

上图是水平放置是的读数。
飞控写到这里也就NRF24L01模块没加上了,这个去学校加吧,因为家里没有插针,飞控板上的SPI模块无法使用。而且用串口也可以。

2013年2月14日23:05:48
  试着加24L01,结果失败了,还是去学校加吧,实在不行还是用串口模块。

2013年2月20日19:46:41
  24L01在开发板上调通了,换到飞控板上就不行,可能是没焊好,开学把排针焊上去试试。

2013年2月26日18:19:14
GPS模块终于调通了,原来刚才数据读不出来是由于数据超出了short型变量,应该改成long型。



2013年3月2日14:26:25
  今天用HUB连上飞控板,发现飞控板非常不稳定,后来直接连到U口上发现就正常了,可能是HUB在数据集合和分配的时候出问题了吧。
  记着用UART2时关闭PWM输入的3 4通道。
遥控器通道值:
油门:1108~2080          【2】
俯仰:1100~2062(俯->仰)【1】 1603
滚转:906~1866(左->右)【0】 1386
偏航:2073~1083(左->右)【3】1616                                                                             
在做期望值计算的时候有个奇怪的现象就是正值时正常的,负值就不正常了,后来发现还是强制转换的事。

PWM输出示波器一直显示异常,后来居然发现是GND和信号线插针搞反了!
偏航角初始化太早了,有误差。偏航目标值的角度弧度转换,搞错了。而且要把目标偏航角限定在0~360°之间。
偏航角误差过大导致PID运算量过大,程序出现问题。
把延时取消MPU6050会不出数据。
飞控无法解锁,标记位uchar定义,无法超过500;
偏航一直减少,最后发现偏航通道没有值,偏航通道输入线拔下来了!
使用电调时,不要超过1KHz,否则不转。
50  6%到9%
100 12%到18%
200 28%到 36%
1000 即使100%也不转
频率越大越平稳
程序里使用200Hz
1260  1380
采集到的四个桨的转速
组1:7668 7717 7582 7713  1.01           1.02
PID: 俯仰 滚转P13 D500,稍有感觉
蓝牙模块指令:

即AT+BAUDX(X=1~C)
2013年3月7日17:41:50
结构体里定义不能赋值
  神经网络加上去以后调节速度特别慢,怀疑是输出太小了,以误差15°为例。归一化后为15/180=0.08,然后用matlab仿真

一个0.08的阶跃信号,控制输出最大为80多,显然太小了,PWM输出量程是10000,所以把输出放大系数调成40000,改天再试试。

2013年8月8日16:22:07
  TIM1的中断叫TIM1_UP_IRQHandler,这样写TIM1才能正常使用,和通用的不一样,通用没有中间的UP。
stm32103CBT6只有TIM1,2,3,4,没有5,具体有哪些要看stm8选型手册。
  记得换IIC口买的飞控是GPIOB67
2013年8月11日15:56:18
  飞控老跑飞,后来发现PWM输入中断的抢占优先级和任务时钟信号中断的抢占优先级一样,降低PWM输入优先级后解决此问题。
2013年8月14日17:45:29
互补滤波里的四元数要先初始化或者赋予随机数,要不永远是0。而且四元数要是全局变量。
系统节拍必须小于最小延时。
不用遥控器一定要把遥控器输入计算目标角的语句关掉!

2013年8月15日11:47:02

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2013-8-24 23:19:46 | 显示全部楼层
本帖最后由 zywei_09 于 2013-8-24 23:30 编辑

咦?怎么添加附件?

出0入0汤圆

发表于 2013-8-24 23:26:23 | 显示全部楼层
看连载

出0入0汤圆

 楼主| 发表于 2013-8-24 23:28:04 | 显示全部楼层
xieshuangok 发表于 2013-8-24 23:26
看连载

没有连载,我急着上传附件,不会啊。

出0入0汤圆

发表于 2013-8-24 23:33:35 | 显示全部楼层
zywei_09 发表于 2013-8-24 23:28
没有连载,我急着上传附件,不会啊。

上面有个 附件  的东西  点击就可以添加啊

出0入0汤圆

发表于 2013-8-25 07:26:16 | 显示全部楼层
开源,加油!!

出0入4汤圆

发表于 2013-8-25 07:42:37 来自手机 | 显示全部楼层
加油我顶你

出0入0汤圆

发表于 2013-8-25 07:58:48 来自手机 | 显示全部楼层
收藏了,谢谢!

出0入0汤圆

发表于 2013-8-25 09:14:08 来自手机 | 显示全部楼层
先学习学习!

出0入0汤圆

发表于 2013-8-25 09:53:27 | 显示全部楼层
楼主别光发代码,多解释下啊

出0入0汤圆

 楼主| 发表于 2013-8-25 10:49:54 | 显示全部楼层
马学家 发表于 2013-8-25 09:53
楼主别光发代码,多解释下啊

里面有项目开发日志,解释的很详尽。

出0入0汤圆

发表于 2013-8-25 11:06:23 | 显示全部楼层
准备玩飞控  先学习学习  谢楼主分享

出0入0汤圆

发表于 2013-8-25 11:07:48 | 显示全部楼层
再学习...............

出0入0汤圆

发表于 2013-8-25 11:11:15 | 显示全部楼层
楼主有开发日志,这个很好。有没有飞控的艳照和视频啊

出0入0汤圆

发表于 2013-8-25 20:42:12 | 显示全部楼层
本帖最后由 svon 于 2013-8-25 20:44 编辑

想问一下楼主,不用加速度计和磁传感器校正,陀螺仪能做到什么地步啊?我的没一会儿就跑飞了!
能给一个全姿态罗盘的资料链接吗?

出0入0汤圆

 楼主| 发表于 2013-8-25 21:08:20 | 显示全部楼层
svon 发表于 2013-8-25 20:42
想问一下楼主,不用加速度计和磁传感器校正,陀螺仪能做到什么地步啊?我的没一会儿就跑飞了!
能给一个全 ...

没试过,不过好像记得论坛里有只用陀螺仪的,你可以找找;全姿态罗盘的问题我的日志里有论述。

出0入0汤圆

 楼主| 发表于 2013-8-25 21:08:36 | 显示全部楼层
wuguoyan 发表于 2013-8-25 11:11
楼主有开发日志,这个很好。有没有飞控的艳照和视频啊

正在试飞。

出0入0汤圆

发表于 2013-8-25 21:30:47 | 显示全部楼层
很好的习惯,不断的写开发进度,赞一个

出0入0汤圆

发表于 2013-8-25 21:50:30 | 显示全部楼层
lz有心了

出0入0汤圆

发表于 2013-8-25 23:11:56 | 显示全部楼层
原理图可以开源吗?想做。。

出0入0汤圆

发表于 2013-8-26 09:51:11 | 显示全部楼层
zywei_09 发表于 2013-8-25 21:08
没试过,不过好像记得论坛里有只用陀螺仪的,你可以找找;全姿态罗盘的问题我的日志里有论述。 ...

我在陀螺仪积分的时候是将角度增量换成四元数,再和当前姿态四元数相成更新的,不知道这个用的公式对不对,可以帮忙看看吗?

/*将增量欧拉角转换成四元数*/
void EulerAngle_To_Quaternion(AngleL3G Gyro)
{

        float fCosRoll=cos(Gyro.x/2);
        float fSinRoll=sin(Gyro.x/2);
        float fCosPitch=cos(Gyro.y/2);
        float fSinPitch=sin(Gyro.y/2);
        float fCosYaw=cos(Gyro.z/2);
        float fSinYaw=sin(Gyro.z/2);

        QAngleUpdate.w=fCosRoll*fCosPitch*fCosYaw+fSinRoll*fSinPitch*fSinYaw;
        QAngleUpdate.x=fCosPitch*fSinRoll*fCosYaw-fSinPitch*fCosRoll*fSinYaw;
        QAngleUpdate.y=fCosRoll*fCosYaw*fSinPitch+fSinRoll*fSinYaw*fCosPitch;
        QAngleUpdate.z=fSinYaw*fCosPitch*fCosRoll+fCosYaw*fSinPitch*fSinRoll;

}

/*四元数乘法,用于姿态更新*/
void Quaternion_Multiply(Quaternions A,Quaternions B)
{
        QAngleStatus.w=A.w*B.w-A.x*B.x-A.y*B.y-A.z*B.z;
    QAngleStatus.x=A.w*B.x+A.x*B.w+A.y*B.z-A.z*B.y;
    QAngleStatus.y=A.w*B.y-A.x*B.z+A.y*B.w+A.z*B.x;
    QAngleStatus.z=A.w*B.z+A.x*B.y-A.y*B.x+A.z*B.w;
}

/*将四元数转化成欧拉角(弧度)*/
void Quaternion_To_EulerAngle(Quaternions QAttitude)
{

        AngleGyro.y=asin(CLAMP(2*(QAttitude.w*QAttitude.y-QAttitude.x*QAttitude.z),-1.57,1.57));
        AngleGyro.x=atan2(2*(QAttitude.w*QAttitude.x+QAttitude.z*QAttitude.y),1-2*(QAttitude.y*QAttitude.y+QAttitude.x*QAttitude.x));
        AngleGyro.z= atan2(2*(QAttitude.w *QAttitude.z+QAttitude.y*QAttitude.x) ,1-2*(QAttitude.z*QAttitude.z+QAttitude.y*QAttitude.y));
               
}       

出0入0汤圆

发表于 2013-8-26 09:59:58 | 显示全部楼层
LZ好人!顶一个!

出0入0汤圆

 楼主| 发表于 2013-8-26 10:58:38 | 显示全部楼层
svon 发表于 2013-8-26 09:51
我在陀螺仪积分的时候是将角度增量换成四元数,再和当前姿态四元数相成更新的,不知道这个用的公式对不对 ...

你的意思是把欧拉角的增量通过公式转换成四元数的增量?

出0入0汤圆

发表于 2013-8-26 12:22:05 | 显示全部楼层
能持之以恆的寫紀錄不容易啊

之前也想把過程記錄下來
不過幾天後就懶得寫了

Good!

出0入0汤圆

 楼主| 发表于 2013-8-26 14:00:42 | 显示全部楼层
john800422 发表于 2013-8-26 12:22
能持之以恆的寫紀錄不容易啊

之前也想把過程記錄下來

温故而知新,可以为师矣。

出0入0汤圆

发表于 2013-8-26 14:09:51 | 显示全部楼层
zywei_09 发表于 2013-8-26 10:58
你的意思是把欧拉角的增量通过公式转换成四元数的增量?

是的,你看我的转换公式有问题吗?因为我看到过不同的版本

出0入0汤圆

 楼主| 发表于 2013-8-26 14:16:34 | 显示全部楼层
svon 发表于 2013-8-26 14:09
是的,你看我的转换公式有问题吗?因为我看到过不同的版本

QAngleUpdate.z=fSinYaw*fCosPitch*fCosRoll  +  fCosYaw*fSinPitch*fSinRoll;这句,我用的公式里是-不是+,具体是啥改天我查下书。

出0入0汤圆

发表于 2013-8-26 15:33:22 | 显示全部楼层
好帖,MARK

出0入0汤圆

发表于 2013-8-26 15:54:36 | 显示全部楼层
mark,四轴是俺的一个梦想。

出0入0汤圆

发表于 2013-8-26 16:20:19 | 显示全部楼层
zywei_09 发表于 2013-8-26 14:16
QAngleUpdate.z=fSinYaw*fCosPitch*fCosRoll  +  fCosYaw*fSinPitch*fSinRoll;这句,我用的公式里是-不是 ...


http://www.cppblog.com/heath/archive/2009/12/13/103127.html
楼主你可以看一下这里,我是参照这里的,在最后那里提到  如在Direct3D中,笛卡尔坐标系的X轴变为Z轴,Y轴变为X轴,Z轴变为Y轴,我也不知道是什么意思。

出0入0汤圆

发表于 2013-8-26 23:07:43 | 显示全部楼层
记号一个,,顶顶

出0入0汤圆

发表于 2013-8-26 23:18:14 | 显示全部楼层
john800422 发表于 2013-8-26 12:22
能持之以恆的寫紀錄不容易啊

之前也想把過程記錄下來

你好,我想请教你一个问题,希望了解的话能给一下解释吧!
欧拉角旋转矢量法得到方向余弦矩阵要和四元数的方向余弦矩阵相等的话,应该是要他们的参考坐标系相同吧?
如果欧拉角旋转矢量法的参考坐标系是北x-东y-地z(绕y轴转是俯仰角),而导航坐标系是东x-北y-天z的话(绕x轴转是俯仰角),该如何使用四元数和欧拉角的转换呢?

出0入0汤圆

发表于 2013-8-27 00:19:27 | 显示全部楼层
本帖最后由 john800422 于 2013-8-27 00:44 编辑
svon 发表于 2013-8-26 23:18
你好,我想请教你一个问题,希望了解的话能给一下解释吧!
欧拉角旋转矢量法得到方向余弦矩阵要和四元数 ...


假設由 "北x-东y-地z" 轉換到 "东x-北y-天z"

NewCodi = RotateM * OldCodi

OldCodi : 原本座標
NewCodi : 新座標
RotateM : 為先對X轉180度, 再對Z轉-90度的旋轉矩陣 // 不一定要這樣轉



將新座標帶回原本的式子中

應該可行, 沒有仔細想過&驗證, 僅供參考

但最好還是使用相同的座標系
以減少麻煩

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-27 07:21:56 来自手机 | 显示全部楼层
svon 发表于 2013-8-26 23:18
你好,我想请教你一个问题,希望了解的话能给一下解释吧!
欧拉角旋转矢量法得到方向余弦矩阵要和四元数 ...

在欧拉角表示法中,坐标变换有专门的齐次变换矩阵,研究生复试还考了这个:p,我记得四元数表示法下也有对应的变换矩阵。只不过欧拉角表示下的由于旋转顺序的不同共有2^3=8种不同的矩阵,但是对于旋转顺序学界没有严格的定义,之前用一款惯导产品就遇到过这种麻烦。而四元数法就不存在这个问题,这是他优点所在。

出0入0汤圆

发表于 2013-8-27 11:28:06 | 显示全部楼层
john800422 发表于 2013-8-27 00:19
假設由 "北x-东y-地z" 轉換到 "东x-北y-天z"

NewCodi = RotateM * OldCodi

非常感谢!我大概懂了。Rb=Cbn*Rn,对于Cbn(从n到b)这个矩阵,用四元数表示的矩阵要和欧拉角表示的矩阵如果相等,前提是他们的参考坐标系要相同,这样才能转到同一个载体坐标系去。

出0入0汤圆

发表于 2013-8-28 14:29:11 | 显示全部楼层
mark!!

出0入8汤圆

发表于 2013-8-28 14:31:24 | 显示全部楼层
支持一下~~~

出0入0汤圆

发表于 2013-8-28 16:45:04 | 显示全部楼层
zywei_09 发表于 2013-8-27 07:21
在欧拉角表示法中,坐标变换有专门的齐次变换矩阵,研究生复试还考了这个:p,我记得四元数表示法下也有 ...

楼主,陀螺仪有个DRDY中断,是怎么用的啊?

出0入0汤圆

发表于 2013-8-28 17:03:46 | 显示全部楼层
好复杂的东西~

出0入0汤圆

发表于 2013-8-28 17:12:16 | 显示全部楼层
如我所需暂且收下,如果用上,再来感谢

出0入0汤圆

发表于 2013-8-28 17:37:23 | 显示全部楼层
顶楼住阿,今年比赛做这个

出0入0汤圆

发表于 2013-8-28 17:47:48 | 显示全部楼层
写日志,是个好习惯,学习

出0入0汤圆

发表于 2013-8-28 20:37:58 | 显示全部楼层
感谢楼主,学习了~~

出0入0汤圆

发表于 2013-8-28 22:32:50 | 显示全部楼层
mark下,留着

出0入0汤圆

发表于 2013-8-28 23:16:36 | 显示全部楼层
学习了,顶顶···

出0入0汤圆

发表于 2013-8-30 15:46:56 | 显示全部楼层
不错,不过离能平稳的飞行还有需要继续实测调试。

出0入0汤圆

发表于 2013-8-30 17:57:56 | 显示全部楼层
好!好东西啊!顶

出0入0汤圆

 楼主| 发表于 2013-8-30 22:49:01 | 显示全部楼层
ran-Interrupt 发表于 2013-8-30 17:57
好!好东西啊!顶

谢谢!         

出0入0汤圆

发表于 2013-8-30 22:50:46 | 显示全部楼层
留着以后搞四轴的时候再回来慢慢研究

出0入0汤圆

 楼主| 发表于 2013-8-30 22:51:34 | 显示全部楼层
svon 发表于 2013-8-28 16:45
楼主,陀螺仪有个DRDY中断,是怎么用的啊?

不太记得了,查下MPU6050的手册吧。

出0入0汤圆

 楼主| 发表于 2013-8-30 22:52:34 | 显示全部楼层
shujianxiaoyao 发表于 2013-8-30 15:46
不错,不过离能平稳的飞行还有需要继续实测调试。

是的,有点那个意思了,不过赶上研究生开学要忙活好久才能安定下来接着搞。

出0入0汤圆

发表于 2013-8-30 23:36:29 | 显示全部楼层
楼主讲的非常详细啊,还有开发日志!致敬!

出0入0汤圆

 楼主| 发表于 2013-8-31 13:39:27 | 显示全部楼层
ad1984fr 发表于 2013-8-30 23:36
楼主讲的非常详细啊,还有开发日志!致敬!

共同学习,共同进步。

出0入0汤圆

发表于 2013-9-1 03:56:15 | 显示全部楼层
你离高手有多远?

出130入20汤圆

发表于 2013-9-1 11:20:20 | 显示全部楼层
楼主牛逼,顶你

出0入0汤圆

发表于 2013-9-1 14:17:09 | 显示全部楼层
感谢分享!

出0入0汤圆

 楼主| 发表于 2013-9-2 19:12:19 | 显示全部楼层
zpc2013 发表于 2013-9-1 03:56
你离高手有多远?

这个,永无止境吧。

出0入0汤圆

发表于 2013-9-16 13:51:43 | 显示全部楼层
WZY,您好,您用的STM32是STM32的哪一款?

出0入0汤圆

发表于 2013-9-16 14:28:35 | 显示全部楼层
LZ好习惯啊,记得坚持!
谢谢分享你的经验和心得,虽然我想很多人都不会自己去写一个飞控,但看你的开发过程却是绝佳的学习材料!

出0入0汤圆

发表于 2013-9-16 14:36:47 | 显示全部楼层
支持一下。。。

出0入0汤圆

发表于 2013-9-17 22:56:14 | 显示全部楼层
楼主卖你的套件吗

出0入0汤圆

发表于 2013-10-21 10:27:29 | 显示全部楼层
也支持一下!

出0入0汤圆

发表于 2013-10-21 13:24:32 | 显示全部楼层
求工程啊!

出0入0汤圆

发表于 2013-10-21 16:15:45 | 显示全部楼层
先收下,带时在用

出0入0汤圆

 楼主| 发表于 2013-10-27 22:46:02 | 显示全部楼层
剑舞 发表于 2013-9-16 13:51
WZY,您好,您用的STM32是STM32的哪一款?

STM32103                                    

出0入0汤圆

发表于 2013-10-27 23:41:37 | 显示全部楼层
标记一下,以后用的着

出0入0汤圆

发表于 2013-10-27 23:57:47 | 显示全部楼层
才看到,顶起。

出0入0汤圆

发表于 2013-10-28 11:33:32 | 显示全部楼层
不错啊楼主

出0入0汤圆

发表于 2013-11-4 12:30:20 | 显示全部楼层
先收下,谢谢啦

出0入0汤圆

发表于 2013-11-4 16:49:54 | 显示全部楼层
本帖最后由 济南电子爱好者 于 2013-11-4 16:53 编辑

请教一个问题, 如果已经知道 飞行器当前姿态四元数  a向量   , 目标 四元数 为 t 向量 .  则转动增量 为  t向量  -  a 向量 =  △t 向量   .  由△t 向量  应该如何确定 每个电机的转速(这里不考虑 PD 控制,一些其它参数) ??
或者有没有什么其它的方法 ??  简单的说, 姿态的差如何映射到 电机的转动上 ?

出0入0汤圆

 楼主| 发表于 2013-11-4 21:55:39 | 显示全部楼层
济南电子爱好者 发表于 2013-11-4 16:49
请教一个问题, 如果已经知道 飞行器当前姿态四元数  a向量   , 目标 四元数 为 t 向量 .  则转动增量 为  t ...

意思是说选用不同的控制器么?不用PID控制器的话还有很多其他的控制方法,反步啊,神经网络啊,H无穷等。

出0入0汤圆

发表于 2013-11-5 09:04:28 | 显示全部楼层
本帖最后由 济南电子爱好者 于 2013-11-5 09:05 编辑
zywei_09 发表于 2013-11-4 21:55
意思是说选用不同的控制器么?不用PID控制器的话还有很多其他的控制方法,反步啊,神经网络啊,H无穷等。 ...


谢谢你的回复,我大概没说清楚,我的意思是 做pid 控制的话,输入的参数是什么 ?  现在看来输入的参数有欧拉角(不考虑转序,似乎不太合理,因为当偏差角度比较大时,就不得不考虑了),还是一种是利用四元数控制(俊的博客).

出0入0汤圆

 楼主| 发表于 2013-11-5 09:34:15 | 显示全部楼层
济南电子爱好者 发表于 2013-11-5 09:04
谢谢你的回复,我大概没说清楚,我的意思是 做pid 控制的话,输入的参数是什么 ?  现在看来输入的参数有欧拉 ...

输入是当前姿态角和预期姿态角的偏差,用欧拉角表示。

出0入0汤圆

发表于 2013-12-1 12:44:32 | 显示全部楼层
楼主的代码怎么找不到工程文件呀

出0入0汤圆

发表于 2013-12-1 14:00:47 | 显示全部楼层
我居然很认真的看了楼主的日志 发现从3月7日到8月8日之间的日志都木有了

出0入0汤圆

发表于 2013-12-1 15:47:45 | 显示全部楼层
好东西啊,都是牛人啊

出0入0汤圆

发表于 2013-12-1 18:44:37 | 显示全部楼层
好贴 必须顶

出0入0汤圆

 楼主| 发表于 2013-12-1 23:36:13 | 显示全部楼层
baplmqj 发表于 2013-12-1 12:44
楼主的代码怎么找不到工程文件呀

没有传工程,在一个百度网盘里有人传过。

出0入0汤圆

 楼主| 发表于 2013-12-1 23:46:14 | 显示全部楼层
lynx19890808 发表于 2013-12-1 14:00
我居然很认真的看了楼主的日志 发现从3月7日到8月8日之间的日志都木有了 ...

做毕设去了可能。。。

出0入0汤圆

发表于 2013-12-2 09:42:02 | 显示全部楼层
谢谢,看看。

出0入0汤圆

发表于 2013-12-2 12:30:13 | 显示全部楼层
zywei_09 发表于 2013-12-1 23:36
没有传工程,在一个百度网盘里有人传过。

能发个链接参考一下吗?

出0入0汤圆

 楼主| 发表于 2013-12-5 16:06:56 | 显示全部楼层
baplmqj 发表于 2013-12-2 12:30
能发个链接参考一下吗?

留个邮箱,我给你发。

出0入0汤圆

发表于 2013-12-5 22:59:10 | 显示全部楼层
13349877861@qq.com谢谢

出0入0汤圆

发表于 2013-12-6 22:17:27 | 显示全部楼层

能共享一份吗 ,谢谢

出0入0汤圆

发表于 2013-12-6 22:41:07 | 显示全部楼层
好长呀,慢慢看

出0入0汤圆

发表于 2013-12-10 13:26:05 | 显示全部楼层
顶一个,正想学习飞控

出0入0汤圆

发表于 2013-12-10 13:30:38 | 显示全部楼层
顶顶顶,楼主q方便说下吗?方便找你学习,,谢谢了

出0入0汤圆

 楼主| 发表于 2013-12-11 21:03:08 | 显示全部楼层
soniclidi 发表于 2013-12-10 13:30
顶顶顶,楼主q方便说下吗?方便找你学习,,谢谢了

日志里有

出0入0汤圆

发表于 2013-12-13 22:35:03 | 显示全部楼层
mark 学习

出0入0汤圆

发表于 2013-12-24 11:48:18 | 显示全部楼层
终于找到了!谢谢分享!学习下!

出0入0汤圆

发表于 2013-12-24 11:57:46 | 显示全部楼层
mark学习

出0入0汤圆

发表于 2013-12-24 15:29:13 | 显示全部楼层
mark         

出0入0汤圆

发表于 2014-2-18 09:46:11 | 显示全部楼层
感谢楼主,但是里面没有工程文件,不方便直接打开看代码,能分享一下工程文件吗?

出0入0汤圆

发表于 2014-2-18 12:48:22 | 显示全部楼层
好帖 帮顶

出0入0汤圆

发表于 2014-2-18 13:00:44 | 显示全部楼层
mark,楼主无私!

出0入0汤圆

发表于 2014-2-18 14:21:12 | 显示全部楼层
好东西,mark

出0入0汤圆

发表于 2014-2-18 15:10:44 | 显示全部楼层
mark 感觉四轴好难啊

出0入0汤圆

发表于 2014-2-18 16:21:40 | 显示全部楼层
楼主 给力啊!! 给你顶上额!

出0入0汤圆

发表于 2014-4-25 11:04:02 | 显示全部楼层
楼主好伟大,这些资料对我们新手来说帮助好大的

出0入0汤圆

发表于 2014-4-25 13:15:06 | 显示全部楼层
你好,我看了你的日志里面求解加速度计的加速度是用ADC的值除835.066,为什么是这个数呢,不应该是直接除以4096再乘9.8(等于除415.)吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 07:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表