控制器的位置环程序为3ms周期,其中包括一个导纳控制模块
导纳控制模块如下:
//x轴导纳模型
xdd = (fx0 - Bx*vx_now - Kx*(xnow-xbase))/Mx;
//加速度积分得到速度
xd = xd + xdd;
//y轴导纳模型
ydd = (fy0 - By*vy_now - Ky*(ynow-ybase))/My;
//加速度积分得到速度
yd = yd + ydd;
//将导纳模型的位置偏移计入,得到新的x轴y轴位置
xt = xd + xnow;
yt = yd + ynow;
分别计算出x和y轴的导纳模型,将位置偏移量更新到新的目标位置
其中,fx0是笛卡尔坐标系中x轴向的外力,Bx是x轴向的阻尼值,vx_now是末端在x轴向的瞬时速度,Kx是x轴向的刚度,xnow是末端在x轴的瞬时位置,xbase是x轴的虚拟阻抗原点,Mx是x轴向的质量值。
通过导纳模型计算出加速度,由于此模块,是与位置环同周期的,在离散数学中,积分可简化为加法(类似于PID,如果不明白可以自行百度一下)
那么,怎样得到fx0呢?我使用了一个末端的六维力传感器,对传感器受的力进行坐标变换,得到x轴和y轴的外力fx0和fy0;
如何得到vx_now?首先从驱动器获得关节速度,通过雅克比变换,得到末端的x轴和y轴速度;
如何得到xnow?首先从驱动器获得关节位置,通过正运动学计算,得到末端的x和y轴位置
所以,大概是这样:
我们假设机械臂的末端是一个阻尼质量弹簧系统,当有了外力作用时,我们通过模型计算,这个虚拟的MBK系统的加速度,速度,位置应处于什么状态。最后,通过直接篡改位置环,去模拟一个MBK系统;
并且,你可以看出,x和y轴的MBK系统是解耦的,各自独立计算的。由于我的实验机械臂,只具有在xy轴平面内运动的能力,所以只考虑了x和y轴,一般的六自由度机械臂,应分别对x,y,z,rx,ry,rz六个自由度进行MBK解耦;