三轴无刷云台锁定模式跟随模式介绍
目前市面上的手持云台,大概都有两种使用模式:
锁定模式
跟随模式
锁定模式即云台锁定欧拉角,镜头始终锁定Pitch,Roll,Yaw。
跟随模式即云台锁定编码器角度,镜头跟随着电机的固定位置。
一般情况下,功能的实现都是先实现锁定模式,相当于无人机的姿态控制原理,无论云台怎么动,镜头的欧拉角始终不变,这个功能实现之后才好实现跟随模式。
跟随模式的实现
做过云台的工程师知道,云台的实现用的也是串级PID控制。外环用欧拉角角度环,内环用陀螺仪角速度环。而跟随模式的实现,则是用外环的角度期望值时刻更新成编码器的角度值,具体怎么实现呢,先来上一段代码:
EncoderLockAngleErr[0] = (float)MA730_Angle2 / 10 - EncoderLockAngle[0];
if (EncoderLockAngleErr[0] > 180) EncoderLockAngleErr[0] -= 360;
if (EncoderLockAngleErr[0] < -180) EncoderLockAngleErr[0] += 360;
//(float)MA730_Angle2 / 10 为编码器的角度值,我这里是0.1°,除以10是为了转换成1.0°的单位,以跟欧拉角同步
//EncoderLockAngle[0]为需要锁定的编码器的角度,这个角度会根据用户需要(比如打杆)而进行更新
//EncoderLockAngleErr[0]为当前编码器角度跟需要锁定的角度的误差,if (EncoderLockAngleErr[0] > 180) EncoderLockAngleErr[0] -= 360;误差范围-180~180
上面代码我们把误差值计算出来了,然后要怎么利用这个误差值来更新欧拉角的期望角度呢:
Con_Tar_AngleFollow1[0] += (EncoderLockAngleErr[0]) * 0.01f;
//这里做误差值的积分
为啥误差值需要做积分?
我们知道,欧拉角跟编码器角度的相对位置是时刻改变的,并没有固定的相对位置,所以欧拉角只能通过旋转找到EncoderLockAngleErr[0]这个误差值变为0的地方即表示跟随到了编码器的目标角度。
在这,因为用的是积分,所以肯定会存在积分值过大的问题,我们这里给积分值做一个限值处理:
if (Con_Tar_Angle[0] + Con_Tar_AngleFollow1[0] > Euler_Angle_Original[0] + 10)
Con_Tar_AngleFollow1[0] = Euler_Angle_Original[0] + 10 - Con_Tar_Angle[0];
if (Con_Tar_Angle[0] + Con_Tar_AngleFollow1[0] < Euler_Angle_Original[0] - 10)
Con_Tar_AngleFollow1[0] = Euler_Angle_Original[0] - 10 - Con_Tar_Angle[0];
以上代码是我的积分值限值,意思是外环实际欧拉角跟给定期望值的误差不能大于10,若大于10则等于10,这样就避免了积分值过大而引起的一系列的问题。
实际上对于云台还需要有很多细节需要处理,比如有些地方编码器并不是每个角度都能转到的,编码器角度在一些角度内是安全的,在一些角度外是会出问题的,这时候取药对编码器做限值处理;比如云台需要360度全方位控制,而实际上云台在每一个方位的控制都需要做一定的变换;这些细节都是很重要的,后续我会持续更新有关云台的细节处理。