在学习机器人动力学相关内容时看到MATLAB论坛上一个有意思的仿真项目Impedance Control for a 2-Link Robot Arm - User-interactive,一个用MATLAB实现的平面二连杆机械臂阻抗控制仿真。用户可以点击并拖拽鼠标来实时改变机械臂的目标位置,在控制力矩作用下机械臂会跟随目标点运动。按空格键可以切换控制模式,此时拖拽鼠标用来给末端施加一个扰动力,由于阻抗控制的作用末端表现得像弹簧阻尼器一样,扰动力消失后末端回复到目标位置。
让我们来关注一下实现的细节。如下图所示,连杆1和连杆2在XY平面上通过旋转关节串联构成一个二自由度的机械臂(忽略关节摩擦等因素),重力加速度g沿着Y轴负方向(向量形式可写为g=[0,−g,0]T)。机械臂关节a固定在坐标原点,末端为e,F为作用在末端的力。c1与c2分别为两个连杆的质心,杆长分别为l1、l2,杆的质量分别为m1、m2,质心到关节的距离分别为d1、d2。θ1为与Y轴正方向的夹角(θ1=θ2=0时机器人保持竖直状态),θ2为连杆2与连杆1之间的夹角,是一个相对角度。

定义上述变量后根据理论力学等知识开始一系列计算。首先计算连杆上各点的位置坐标:
连杆1与连杆2在坐标系中的方向向量与角度θ1、θ2相关,其中连杆1的方向向量为er1=⎡⎢⎣−sinθ1cosθ10⎤⎥⎦,连杆2的方向向量为er2=⎡⎢⎣−sin(θ1+θ2)cos(θ1+θ2)0⎤⎥⎦
rac1=d1⋅er1rbc2=d2⋅er2rbe=l2⋅er2rab=l1⋅er1rac2=rab+rbc2rae=rab+rbe
然后计算各点速度:连杆1上线速度的方向向量为ev1=⎡⎢⎣−cosθ1−sinθ10⎤⎥⎦,连杆2上线速度的方向向量为ev2=⎡⎢⎣−cos(θ1+θ2)−sin(θ1+θ2)0⎤⎥⎦
vc1=d1⋅˙θ1⋅ev1vb=l1⋅˙θ1⋅ev1vc2=vb+d2⋅(˙θ1+˙θ2)⋅ev2ve=vb+l2⋅(˙θ1+˙θ2)⋅ev2
接着对速度求导计算各点加速度:
ac1=˙vc1=d1⋅¨θ1⋅ev1−d1⋅˙θ12⋅er1ab=˙vb=l1⋅¨θ1⋅ev1−l1⋅˙θ12⋅er1ac2=˙vc2=d2⋅(¨θ1+¨θ2)⋅ev2−d2⋅(˙θ1+˙θ2)2⋅er2+ab
根据受力情况可计算出关节处的力矩,对于关节b来说出除了电机力矩τ2外,杆件2自身重量以及末端上的作用力F都会对b点产生力矩,因此b点的合力矩为:
Mb=(rbc2×m2g)+(rbe×F)+τ2
根据动量矩定理,杆2对b点的动量矩变化率dL2dt=Mb,dL2dt=I2(¨θ1+¨θ2)+rbc2×m2ac2(质点系对任一固定点O的动量矩等于质点系的动量(位于质心)对O点之矩与质点系相对质心的动量矩的矢量和),其中I2为杆2绕其质心c2的转动惯量,I2=112m2l22。根据动量矩定理可得到角加速度¨θ2与力矩Mb的关系式。
对于关节a,外力的合力矩为:
Ma=(rac2×m2g)+(rac1×m1g)+(rae×F)+τ1dL1dt=I2(¨θ1+¨θ2)+I1¨θ1+(rac2×m2ac2)+(rac1×m1ac1)
其中I1为杆1绕其质心c1的转动惯量,I1=112m1l12。根据动量矩定理dL1dt=Ma可得到角加速度¨θ1与力矩Ma的关系式。
通常可将根据动量矩定理或牛顿-欧拉法推导出的等式写为如下形式:τ=M(θ)¨θ+C(θ,˙θ)+G(θ)
如果机械臂自由度为n,M(θ)为n×n阶正定对称矩阵,M(θ)¨θ代表惯性力项。M(θ)中的主对角线元素表示各连杆本身的有效惯量,代表给定关节上的力矩与产生的角加速度之间的关系,非对角线元素表示连杆之间的耦合惯量,即是某连杆的加速运动对另一关节产生的耦合作用力矩的度量 ;C(θ,˙θ)为n×1阶向心力和科氏力项;G(θ)为n×1阶的重力项,与机器人的形位θ有关。
在纯位置控制下施加在机械臂末端的外力并不会影响末端的运动,因为这种情况可以认为机械臂是完全刚性的。而如果要实现主动柔顺控制,即使机械臂表现出一定的柔性就需要考虑其与环境之间的相互作用。这时关节驱动力矩可写为:τ=M(θ)¨θ+C(θ,˙θ)+G(θ)+JT(θ)Ftip
上面等式中,Ftip为机械臂末端与外界环境之间的交互力,J为机械臂的雅可比矩阵,用于将关节空间速度映射到操作空间:v=J˙θ,雅可比矩阵的转置也可将操作空间中的力映射到关节空间中:τ=JTF。对于本例,机器人雅可比矩阵可用MATLAB中的函数jacobian来计算,J=jacobian(rae,[θ1,θ2])。JT(θ)Ftip代表作用于机器人关节上的外界环境力矩,等式左边的τ为机器人关节驱动力矩,计算出该力矩后就可以输入给机器人驱动系统,实现期望的运动。
机械臂与环境交互产生的力矩可写为τext=JT(θ)Ftip=JT(θ)[M(¨xd−¨x)+D(˙xd−˙x)+K(xd−x)]––––––––––––––––––––––––––––––––––––––––––––––––,xd和x分别代表目标位置和实际位置,˙xd和˙x分别代表目标速度和实际速度。矩阵K和D代表与环境交互的刚度和阻尼。机械臂末端的加速度¨x一般难以测量,如果直接对速度进行微分又会产生大量噪声。通常对于协作型机械臂,自身重量设计的较轻,因此可以忽略其惯性,即令M=0。
下面开始对动力学系统进行迭代计算,按照仿真步长对求解出的角加速度进行积分,更新机器人的关节位置和速度,并在图形界面中动态显示。

改变刚度和阻尼系数后(Kp=100, Kd=10),明显可以看出机器人刚性变大,在末端施加力只产生很小的形变,而且控制末端运动到目标位置时更迅速。

参考:
机器人阻抗与导纳控制
机器人单关节力矩控制
物理引擎中的刚体转动2
机器人力控制概述
Integration Basics
Impedance control—Wikipedia
Impedance Control for a 2-Link Robot Arm
Numerical Integration in Games Development
Physics for Game Programmers : Numerical Methods
Modern Robotics Mechanics, Planning, and Control
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律