OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13178|回复: 14

四轴的PID控制运算中,输入的期望值、输出的控制值具体意义是什么?遥控器传到单片机的脉宽值、解算得到的姿态角如何与输给四个电调的脉宽对上关系

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-20
在线时间
5 小时
发表于 2015-10-8 10:51:06 | 显示全部楼层 |阅读模式
5金钱
最近刚看完姿态解算的一些资料,然后现在卡在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对应上?
因为没学过什么控制理论,以上问题不知道成不成立、或者是否太肤浅,还望知道的朋友指点一下

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-20
在线时间
5 小时
 楼主| 发表于 2015-10-8 14:23:27 | 显示全部楼层
......................................似乎并没有大神解惑(* ̄︿ ̄)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-8 22:47:06 | 显示全部楼层
帮顶.....
回复

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-6-23
在线时间
15 小时
发表于 2015-10-9 00:12:03 | 显示全部楼层
我参考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;} //积分清零
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-10-6
在线时间
0 小时
发表于 2015-10-9 08:08:07 | 显示全部楼层
我也准备做到pid啦加油
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-20
在线时间
5 小时
 楼主| 发表于 2015-10-9 15:26:19 | 显示全部楼层
回复【4楼】jsxh538:
---------------------------------
你好,谢谢你的指导!看了下您的这个程序,但似乎有很多疑问:

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信号的高电平脉宽值吗?还是定时器的定时时长什么的?

一下子问了好多,感觉自己不明白的太多了
如果可以,还希望您能解答一下
谢谢啦ヽ(??▽?)ノ
回复

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-6-23
在线时间
15 小时
发表于 2015-10-9 22:29:16 | 显示全部楼层
回复【6楼】Jayq:
---------------------------------
我解释一下吧!我也是个半瓶水,不对的地方见谅。
我这里,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输出
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-20
在线时间
5 小时
 楼主| 发表于 2015-10-10 17:15:53 | 显示全部楼层
回复【7楼】jsxh538:
---------------------------------
再次谢谢!能有人讨论真的比自己一个人百度到处乱看各种资料好多了
花了点时间看了下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;} //积分清零
回复

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-6-23
在线时间
15 小时
发表于 2015-10-10 21:35:20 | 显示全部楼层
回复【8楼】Jayq:
---------------------------------
我做的大四轴,具体的你可以加我Q;625572776;
if(YM>YMbit) //指的是大于阀值进行PID运算;
angle_X*-1(乘以-1是把angle_X转为负数,这个参数调整时和串口输出时为正数)
IError_GY_rox+=GY_rox-out_2x;//角速度积分项
角速度P项为GY_rox+out_2x;
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-10-17
在线时间
0 小时
发表于 2015-10-17 20:49:05 | 显示全部楼层
输入的是实际角度和理想角度的偏差值,输出的话看用位置式还是增量式,位置式输出的是PWM的比较值,增量式输出的就是PWM比较值的增量
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-20
在线时间
5 小时
 楼主| 发表于 2015-10-20 08:57:19 | 显示全部楼层
回复【10楼】能量除以光速:
---------------------------------
你好!
您这里所指的“理想角度”,具体是多少?可以认为你说的这个“理想角度”是我表述的“期望角度”吗?我的理解,期望角度是来自于遥控器的控制信号转化得到的。
如果使用的是位置式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;

以上,理解和写法对吗?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-10-17
在线时间
0 小时
发表于 2015-10-21 18:15:32 | 显示全部楼层
回复【11楼】Jayq:
---------------------------------
理想角度就是四轴平衡的时候的pitch,yaw,roll角,三个轴每个都有一个PID,调PID的时候要一个轴一个轴的调,然后把三个PID的输出值累加到一起,就是最终的PWM输出。
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-7-3
在线时间
11 小时
发表于 2017-7-11 11:54:09 | 显示全部楼层
#在这里快速回复#楼主问题解决了没,我有一样的困惑
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-7-19
在线时间
4 小时
发表于 2017-7-21 11:07:10 | 显示全部楼层
帮顶     。。。。。。。
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-3-7
在线时间
13 小时
发表于 2019-3-7 22:40:19 | 显示全部楼层
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;
各位大佬,我不能理解这里的代码。为什么throttle要按这样的规则加减PID输出项才能赋值给电机。?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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