完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近刚看完姿态解算的一些资料,然后现在卡在PID控制这里了。以X型四轴为例,X左上为1号电机X1(对应1号电调),右上2号X2、右下3号,机头在1、2号电机间,假定姿态解算出了三个欧拉角roll、pitch、yaw,此时遥控器只加了某个油门值(能悬停)和俯仰方向的某个值(向前飞),问题:
1.据看到的资料,遥控器接收机最终的通道输出是50Hz的PWM信号,脉宽在1~2ms间(或0.5~2.5,假定是前者),PID控制需要目标角度(期望值)与当前测量值(即pitch,单位度)作差得到偏差值,假定为err.pitch(单位度),那么遥控器接收机俯仰通道的脉宽值(单位ms)如何转化为一个PID控制时的期望角度(单位度)?这里面有什么关系吗?还是我看的资料理解错了 2.偏差值err.pitch(单位是度),如何进行PID控制的运算,直接套公式out=err*Kp+Ki*∫err+Kd*D(err)吗?假定在合适的P、I、D值正确计算得到了一个out.pitch的输出值,这个输出值是什么意义(单位是什么)? 3.网上有提到,四轴的四个电机X1=throttle-out.roll+out.pitch+out.yaw,X2=throttle+out.roll+out.pitch-out.yaw.........以1号电机来说,这里的throttle-out.roll+out.pitch+out.yaw得到的是一个什么值?其与传送到1号电调的脉宽值有什么关系? 油门通道的脉宽值又如何与这里的throttle对应上? 因为没学过什么控制理论,以上问题不知道成不成立、或者是否太肤浅,还望知道的朋友指点一下 |
|
相关推荐
13个回答
|
|
......................................似乎并没有大神解惑(* ̄︿ ̄)
|
|
|
|
帮顶.....
|
|
|
|
我参考STC开源小四轴写的PID,自我感觉还行吧!!!
/****************************X轴,正方向1、4电机;负方向2、3电机************************************************/ if(YM>YMbit) { PError_pitch=AngleX+X_angle+angle_X*-1;//比例P等于当前角度+遥控器角度+补偿角度 IError_pitch+=PError_pitch;//积分I if(IError_pitch>1000)IError_pitch=1000;//积分限幅 if(IError_pitch<-1000)IError_pitch=-1000; out_2x=out_p*PError_pitch+out_i*IError_pitch+(AngleX-Last_pitch)*KD_X;//角度PID Last_pitch=AngleX;//保留上次角度 IError_GY_rox+=GY_rox-out_2x;//角速度I等于当前角速度减去角度PID输出 if(IError_GY_rox>1000)IError_GY_rox=1000;//角速度I限幅 if(IError_GY_rox<-1000)IError_GY_rox=-1000; out_X=kp*(GY_rox+out_2x)+ki*IError_GY_rox+kd*(GY_rox-Last_GY_rox);//角速度PID计算 Last_GY_rox=GY_rox;//保留上次角速度 if(out_X>2000){out_X=2000;} //限制最终输出 if(out_X<-2000){out_X=-2000;} //2000等于最高速4000-零速度2000 } else {IError_pitch=0;IError_GY_rox=0;}//积分清零 |
|
|
|
我也准备做到pid啦加油
|
|
|
|
你好,谢谢你的指导!看了下您的这个程序,但似乎有很多疑问:
1.  Error_pitch=AngleX+X_angle+angle_X*-1;// 这里的AngleX是解算出来的绕Y轴的俯仰pitch吗?这个AngleX单位是度? 如果遥控器的通道信号脉宽为1ms~2ms,这里的遥控器角度X_angle是按1ms对应-90°(反向),2ms对应+90°(正向)换算得到的吗?补偿角度是不是指校准传感器时的得到的偏差角度、且单位是度? 这里的PError_pitch应该是PID控制算法中所指的偏差e(t)吧?偏差值e(t)=期望值-测量值。所以PError_pitch是一个单位为“度”(角度)的数值,可以这样理解吗? 2. IError_pitch+=PError_pitch;//积分I 好像.....积分累加需要乘以时间,可算在这里没有看到,不应该是 IError_pitch+=PError_pitch*dt;dt即上次姿态解算时刻到当前时刻的时间间隔dt吗? 3. if(IError_pitch>1000)IError_pitch=1000;//积分限幅 if(IError_pitch<-1000)IError_pitch=-1000; 根据这两句积分限幅,猜测IError_pitch应该在-1000到1000之间才是合理的值,这里的1000这个限幅数值是怎么来的?(比如为什么不是100,不是1W?) 4. out_2x=out_p*PError_pitch+out_i*IError_pitch+(AngleX-Last_pitch)*KD_X;//角度PID 这句应该是指PID运算,那么其输出值out_2x在这里是一个什么意义的数值?(比如单位是什么?可以理解为目标角速度吗?——毕竟根据后面的程序,这个数值似乎还要进行内环的角速度PID,且是当前的角速度减去out_2x作为角速度PID的输入值,也就是偏差)。out_2x这个数值,大概上来说,可能会是一个多少的数值?可能是500吗?1000? 5. out_X=kp*(GY_rox+out_2x)+ki*IError_GY_rox+kd*(GY_rox-Last_GY_rox);//角速度PID计算 正2000是根据什么确定的? 后面是不是还会有这样的一个运算: motor1=throttle+out_X-out_Y+out_Z; motor2=throttle-out_X|+out_Y-out_Z; motor3=throttle-out_X+out_Y+out_Z; motor4=throttle+out_X-out_Y-out_Z; 如果是,这里的motor1这个数值对应于什么?对应于输送到该电机对应的电调、的PWM信号的高电平脉宽值吗?还是定时器的定时时长什么的? 一下子问了好多,感觉自己不明白的太多了 如果可以,还希望您能解答一下 谢谢啦ヽ(??▽?)ノ |
|
|
|
我解释一下吧!我也是个半瓶水,不对的地方见谅。
我这里,1毫秒对应2000,2毫秒对应4000.相减等于2000.后面积分正负1000、输出限幅正负2000就是根据这个2000来的。 这样也把油门分为2000份,感觉这样好操控一些。你也可以改小或者该大 PError_pitch直接等于当前该轴的角度。如果四轴水平,当前角度就为0或者在0附近,那么PError_pitch就为0或者在0附近。AngleX(只能是pitch和roll其中一个,主要看你把那个轴定位前后,那个轴定为左右),X_angle(如果遥控最高的时候为255(AD转换得来),那么该值等于(当前AD值减去128)除以某个系数),例如:现在四轴水平。当前AD值为150,系数为2.那么X_angle=(150-128)/2.这样四轴就会倾斜一定角度,具体系数自己定。 angle_X(角度补偿是飞起来后你需要打一点摇杆才能让四轴水平的值) 积分时间我这里直接舍去了,因为整个程序放在定时器5毫秒的中断里面.积分时间=0.005秒。这么小的一个值我直接忽略了。 对于输出motor1=2000+油门+out_X-out_Y+out_Z;(2000对应1毫秒,4000对应2毫秒) 当占空小于1毫秒时,电调会报警,大于2毫秒也一样。所以最终输出限幅 if (motor1>4000)motor1=4000;if (motor1<2000)motor1=2000; 最后把motor1加载到控制PWM波占空比的寄存器 我是按上面这样理解的,具体的代码你可以参考STC单片机开源的小四轴。传感器的代码参考原子哥的MPU6050/DMP输出 |
|
|
|
再次谢谢!能有人讨论真的比自己一个人百度到处乱看各种资料好多了
花了点时间看了下STC的那个四轴代码,感觉......并没有豁然开朗的感觉,我没看他的遥控信号部分,所以不是很了解那个遥控AD值,还有就是,那个PID运算的积分项和微分项都没有时间项dt或者PID控制运算的周期T,这里我不认为是可以忽略的。 Besides,他这个四轴好像是“十”字型的,不是"X"型的..... 我预想的对象是“X”型大四轴,也就是电机是由电调控制的,电调从飞控得到的控制信号假定为400hz的PWM信号,四个(横滚roll,俯仰pitch,偏航yaw,油门throttle)通道的PWM信号的高电平脉宽表(1~2ms)征通道控制量。 /************************************************************************************************************************************************/ 1.我注意到你在回复里说,PError_pitch直接等于当前该轴的角度,“该轴的角度”是指该轴PID控制运算的输入偏差角,对吗?(根据后面的程序,PError_pitch与P值相乘)一开始还以为你说的是当前姿态下该轴欧拉角。 2.angle_X(角度补偿是飞起来后你需要打一点摇杆才能让四轴水平的值)——你这么说,还是不太理解。这个角度来自遥控器吗?还是类似于航模固定翼的那个遥控器校准吗?(这个遥控器上的校准,使得舵机处于平衡位置(如副翼不平,调节遥控器该通道的基准值.....)) 3.对了,按你这样写的PID控制,你的四轴(小四轴)能飞吗? /************************************************************************************************************************************************/ 我将你的这段程序重新注释并理解了一下,您帮看下对不对: if(YM>YMbit) //假如油门大于解锁阀值(可以起飞) { PError_pitch=AngleX+X_angle+angle_X*-1;//算出PID控制运算公式中的偏差输入{e(t)=期望值-测量值}中的偏差e(t),PError_pitch即Y轴俯仰通道PID控制运算中的偏差值,等于AngleX(姿态解算得到的欧拉角,单位度,即 测量值)+X_angle(来自遥控俯仰通道的控制量,由控制量以一定系数转换得到的某个角度,此即期望值)+angle_X*-1(这个我不太理解) IError_pitch+=PError_pitch;//PID控制运算的积分项 if(IError_pitch>1000)IError_pitch=1000;//积分限幅 if(IError_pitch<-1000)IError_pitch=-1000; out_2x=out_p*PError_pitch+out_i*IError_pitch+(AngleX-Last_pitch)*KD_X;//out=比例系数P*偏差值+积分系数I*偏差值的积分+微分系数*偏差值的微分 Last_pitch=AngleX;//保留上次角度 IError_GY_rox+=GY_rox-out_2x;//内环角速度PID控制运算的偏差值e(t),偏差值e(t)=期望值-测量值,这里将外环的角度PID控制的输出控制量out_2x作为测量值??期望值是陀螺仪测得的该轴的角速度? if(IError_GY_rox>1000)IError_GY_rox=1000;//角速度I限幅 if(IError_GY_rox<-1000)IError_GY_rox=-1000; out_X=kp*(GY_rox+out_2x)+ki*IError_GY_rox+kd*(GY_rox-Last_GY_rox);//角速度PID计算 Last_GY_rox=GY_rox;//保留上次角速度 if(out_X>2000){out_X=2000;} //限制最终输出 if(out_X<-2000){out_X=-2000;} //2000等于最高速4000-零速度2000 } else {IError_pitch=0;IError_GY_rox=0;}//积分清零 |
|
|
|
我做的大四轴,具体的你可以加我***;
if(YM>YMbit) //指的是大于阀值进行PID运算; angle_X*-1(乘以-1是把angle_X转为负数,这个参数调整时和串口输出时为正数) IError_GY_rox+=GY_rox-out_2x;//角速度积分项 角速度P项为GY_rox+out_2x; |
|
|
|
输入的是实际角度和理想角度的偏差值,输出的话看用位置式还是增量式,位置式输出的是PWM的比较值,增量式输出的就是PWM比较值的增量
|
|
|
|
你好!
您这里所指的“理想角度”,具体是多少?可以认为你说的这个“理想角度”是我表述的“期望角度”吗?我的理解,期望角度是来自于遥控器的控制信号转化得到的。 如果使用的是位置式PID,那么输出的就是定时器生成PWM时设置的那个、与CNT寄存器比较的那个比较值吗?实际上应该是PID_OUT_PITCH、PID_OUT_ROLL、PID_OUT_YAW和THROTLLE按公式叠加,然后才送到定时器PWM四个通道的比较值,这样理解对吗? 即位置式PID各轴的输出PID_OUT_PITCH、PID_OUT_ROLL、PID_OUT_YAW 根据公式叠加到油门,得到总输出: PID_OUTPUT=THROTTLE+PID_OUT_PITCH-PID_OUT_ROLL-PID_OUT_YAW; 根据以上得到的总输出,设置定时器对应通道的PWM比较值: TIM_SetCompare1(TIM3,PID_OUTPUT);,PID_OUTPUT=THROTTLE+PID_OUT_PITCH-PID_OUT_ROLL-PID_OUT_YAW; 以上,理解和写法对吗? |
|
|
|
理想角度就是四轴平衡的时候的pitch,yaw,roll角,三个轴每个都有一个PID,调PID的时候要一个轴一个轴的调,然后把三个PID的输出值累加到一起,就是最终的PWM输出。
|
|
|
|
#在这里快速回复#楼主问题解决了没,我有一样的困惑
|
|
|
|
帮顶 。。。。。。。
|
|
|
|
只有小组成员才能发言,加入小组>>
请问下图大疆lightbridge2遥控器主板电源芯片型号是什么?
4474 浏览 1 评论
使用常见的二极管、三极管和mos做MCU和模组的电平转换电路,但是模组和MCU无法正常通信,为什么?
346浏览 2评论
为了提高USIM卡电路的可靠性和稳定性,在电路设计中须注意的点有哪些?
349浏览 2评论
372浏览 2评论
366浏览 2评论
416浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 04:11 , Processed in 1.209893 second(s), Total 100, Slave 84 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号