插值法解决非线性结构的控制问题

插值法解决非线性结构的控制问题_第1张图片
插值法解决非线性结构的控制问题_第2张图片

横轴是电机转动圈数,纵轴是实际机构末端的实际位置,由于没有实际机构末端的位置反馈,所以只能采用开环控制,通过电机转动圈数和实际机构末端的实际位置间的关系,根据机构末端的位置得出电机圈数,控制电机转动的圈数来控制实际位置。
可以采用通过公式去直接计算电机转动圈数的方法,但需要将公式直接写在程序里面,这会直接导致程序只能适配这一种机械结构,没有兼容性。而且实际机构,由于生产和装配等因素一致性也不是很好,需要进行校准和标定,如果直接对公式进行标定比较麻烦,也比较复杂,不适合给一线生产和实施人员使用。此外如果想从电机转动圈数推导出此时的机构末端实际位置,在关系比较复杂的条件下也是比较麻烦的,该公式法并不直接可解,需要通过搜索算法来寻找到一个满足精度要求的值,需要的运算量较大。
此外也可以直接使用多项式拟合的方式直接对关系进行近似,不过实际使用来看,该方法只适用于非线性不是很大的情况,非线性很强的情况,拟合的进度比较差。使用七阶多项式进行拟合,获取机构位置和电机转动圈数间的关系系数。再通过该关系系数,根据实际位置计算得出电机转动圈数。下图横轴是机构高度,纵轴是理论电机转动圈数和计算得出的电机转动圈数间的偏差。可以看到偏差比较大。再提升阶数对精度也没有提升,反而会增大计算量。
插值法解决非线性结构的控制问题_第3张图片

目前使用插值法,通过公式生成一些数据,在各个数据段之间计算线性近似。简单起见,取四组数据进行说明。
height = [310, 335.58, 359.86, 382.68]
circle = [0,3,6,9]
将上述数据读取至vector height和circle,在各段上进行线性近似,各段上的斜率
coef1[i] = (height[i] - height[i-1])/(circle[i] - circle[i-1])
coef2[i] = (circle[i] - circle[i-1])/(height[i] - height[i-1])
得到各个线性近似后,就可以根据高度推到得出电机转动圈数,或者根据电机转动圈数推到得出实际高度。

你可能感兴趣的:(算法)