书籍《Modern Robotics - Mechanics , Planning, and Control》中关于阻抗控制和导纳控制的部分:
下面结合上边的内容谈一谈我对导纳控制的理解。
首先,不论是阻抗控制,还是导纳控制,他们同根同源,都是基于质量-弹簧-阻尼动力学模型而产生的。下图所示是一个单自由度质量-弹簧-阻尼虚拟环境:
对其进行受力分析:
根据牛顿第二定律,有 m x ¨ = f − k x − b x ˙ , m \ddot x = f - kx - b \dot x, mx¨=f−kx−bx˙,表明物块的运动状态(位移 x x x、速度 x ˙ \dot x x˙、加速度 x ¨ \ddot x x¨)和 其所受外力 f f f 之间满足: m x ¨ + b x ˙ + k x = f , m\ddot x + b \dot x + kx = f, mx¨+bx˙+kx=f,对该动力学方程左右两侧进行拉普拉斯变换,得到 ( m s 2 + b s + k ) X ( s ) = F ( s ) . (ms^2+bs+k)X(s) = F(s). (ms2+bs+k)X(s)=F(s).阻抗被定义为位置扰动到力的传递函数 Z ( s ) = F ( s ) / X ( s ) Z(s) = F(s)/X(s) Z(s)=F(s)/X(s)(输入位置、输出力),所以阻抗是频率相关的,低频响应由弹簧决定,高频响应由质量决定。
导纳被定义为力扰动到位置的传递函数,是阻抗的倒数, Y ( s ) = X ( s ) / F ( s ) Y(s) = X(s)/F(s) Y(s)=X(s)/F(s)(输入力,输出位置)。
不论是阻抗还是导纳控制器,都是为了实现柔顺控制。
传统的误差驱动的位置控制器,例如 P D PD PD 控制器、 P I D PID PID 控制器…就是为了消除外部扰动带来的跟踪偏差,然而外力的引入势必会导致偏差的增大,两者相互对抗,机器人就像一个钢铁直男宁折不弯;
而基于阻抗/导纳控制器的柔顺体现在,当机器人受到外力干扰,机器人不会像在位置控制器模式下一样和外力作用硬碰硬,而是会顺应外力运动,当外力撤销,机器人便会恢复到原始的运动状态,主打一个接化发。
重点在于,机器人顺应外力运动的原则就是:呈现弹簧-质量-阻尼的动力学特性。
回到公式,阻抗/导纳控制的目标是实现任务空间行为 M d x ¨ + B d x ˙ + K d x = f e x t , M_d \ddot x + B_d \dot x + K_d x = f_{ext}, Mdx¨+Bdx˙+Kdx=fext,其中 x ∈ R n x \in \mathbb R^n x∈Rn 是最小坐标集中的任务空间配置,例如 x ∈ R 3 x \in \mathbb R^3 x∈R3; M d M_d Md、 B d B_d Bd 和 K d K_d Kd 是期望的正定虚拟质量、阻尼和刚度矩阵, f e x t f_{ext} fext 是施加到机器人上的力,可能是由用户施加的,还可以在机器人的受控运动中用相对于参考值的小位移 e ¨ \ddot e e¨、 e ˙ \dot e e˙ 和 e e e 替换 x ¨ \ddot x x¨、 x ˙ \dot x x˙ 和 x x x ,即 M d e ¨ + B d e ˙ + K d e = f e x t , M_d \ddot e + B_d \dot e + K_d e = f_{ext}, Mde¨+Bde˙+Kde=fext,其中, e = x − x 0 e = x-x_0 e=x−x0, x x x 是机器人位置, x 0 x_0 x0 是期望平衡轨迹 (desired equilibrium trajectory),举个例子,假设机器人末端在笛卡尔空间跟踪一个椭圆轨迹,那么这个椭圆轨迹就是这里提到的期望平衡轨迹,此时它是随时间变化的;再举个例子,假设机器人末端在笛卡尔空间保持不动,那么机器人保持不动的这个位置就是这里提到的期望平衡轨迹,准确的说,其实是一个期望平衡点(desired equilibrium point),此时它不随时间变化。但是, x 0 x_0 x0 不是指机器人的初始位置!
下面还是以一个与环境交互的单自由度质量块系统为例,阐述阻抗控制和导纳控制。
假设质量块的质量为 m m m, x x x 是质量块的位移, F F F 是控制力, F e x t F_{ext} Fext 为环境作用在质量块上的外力,质量块的运动方程表达为:
m x ¨ = F + F e x t (1) \begin{aligned} m \ddot x = F + F_{ext} \\ \end{aligned}\tag{1} mx¨=F+Fext(1)导纳和阻抗控制的控制目标都是设计控制力 F F F 使外部力 F e x t F_{ext} Fext 和 e = ( x − x 0 ) e = (x-x_0) e=(x−x0)之间建立质量-弹簧-阻尼动力学关系: M d e ¨ + D d e ˙ + K d e = F e x t (2) \begin{aligned} M_d \ddot e + D_d \dot e + K_d e = F_{ext} \\ \end{aligned}\tag{2} Mde¨+Dde˙+Kde=Fext(2)
在阻抗控制中,控制器是一个机械阻抗,被控对象被当作导纳对待,如下图所示:
结合公式(1)和公式(2),推导得到阻抗控制律: F = ( m M d − 1 ) F e x t + m x ¨ 0 − m M d ( D d e ˙ + K d e ) (3) \begin{aligned} F = (\frac{m}{M_d}-1)F_{ext} + m \ddot x_0 - \frac{m}{M_d}(D_d \dot e + K_d e) \\ \end{aligned}\tag{3} F=(Mdm−1)Fext+mx¨0−Mdm(Dde˙+Kde)(3)
在导纳控制中,受控对象基于位置控制,而不再像阻抗控制器那样基于力控制,如下图所示:
其中,位置控制器可采用 P D PD PD 控制器实现: F = k p ( x d − x ) − k d x ˙ (4) \begin{aligned} F = k_p(x_d - x) - k_d \dot x \\ \end{aligned}\tag{4} F=kp(xd−x)−kdx˙(4)将公式(4)带入公式(1),得到
m x ¨ + k d x ˙ + k p ( x − x d ) = F e x t (5) \begin{aligned} m \ddot x + k_d \dot x + k_p(x-x_d) = F_{ext} \\ \end{aligned}\tag{5} mx¨+kdx˙+kp(x−xd)=Fext(5)将 x x x 替换为 x d x_d xd 重写公式(2),得到
M d ( x ¨ d − x ¨ 0 ) + D d ( x ˙ d − x ˙ 0 ) + K d ( x d − x 0 ) = F e x t (6) \begin{aligned} M_d (\ddot x_d - \ddot x_0) + D_d (\dot x_d-\dot x_0) + K_d (x_d - x_0) = F_{ext} \\ \end{aligned}\tag{6} Md(x¨d−x¨0)+Dd(x˙d−x˙0)+Kd(xd−x0)=Fext(6)公式(5)(6) 便是导纳控制系统的完整动力学。
在导纳控制算法中,用户/环境施加的外力 f e x t f_{ext} fext 由末端 F/T 传感器测量并转换到机器人基座标系下而获得,机器人以满足方程式 M d x ¨ + B d x ˙ + K d x = f e x t M_d \ddot x + B_d \dot x + K_d x = f_{ext} Mdx¨+Bdx˙+Kdx=fext 的末端执行器加速度响应,一种简单的方法是根据下式计算期望的末端执行器加速度 x ¨ d \ddot x_d x¨d: M d x ¨ d + B d x ˙ + K d x = f e x t (7) \begin{aligned} M_d \ddot x_d + B_d \dot x + K_d x = f_{ext} \\ \end{aligned}\tag{7} Mdx¨d+Bdx˙+Kdx=fext(7)其中 ( x , x ˙ ) (x,\dot x) (x,x˙) 是当前状态。求解,我们得到 x ¨ d = M d − 1 ( f e x t − B d x ˙ − K d x ) (8) \begin{aligned} \ddot x_d = M_d^{-1}(f_{ext} - B_d \dot x - K_d x) \\ \end{aligned}\tag{8} x¨d=Md−1(fext−Bdx˙−Kdx)(8)说白了,就是为了使机器人满足质量-弹簧-阻尼二阶动力学,根据机器人当前控制周期的状态 ( x , x ˙ ) (x,\dot x) (x,x˙) 和外部力 f e x t f_{ext} fext,计算得到满足该动力学的加速度值,而后以计算出来的加速度值进行积分,得到下一控制周期的速度指令 (适用于机器人底层是速度控制器) ;如果对得到的速度指令再进行积分,就会得到下一控制周期的位置指令 (适用于机器人底层是位置控制器) 。
在实际应用场景中,不论是定点导纳控制,还是在轨迹跟踪任务中加入导纳柔顺控制策略,这些机器人受控运动都是具有预定义的参考轨迹 (期望平衡轨迹) 的,因此,公式 (9) 形式描述的阻抗模型更为实用: M d e ¨ + D d e ˙ + K d e = F e x t (9) \begin{aligned} M_d \ddot e + D_d \dot e + K_d e = F_{ext} \\ \end{aligned}\tag{9} Mde¨+Dde˙+Kde=Fext(9)
// compute error to desired equilibrium pose
pos_error.head(3) << curr_position_ - desired_position_; // 位置偏差,直接相减
if (desired_pose_orientation_.coeffs().dot(curr_orientation_.coeffs()) < 0.0) { // 四元数形式确认符号
curr_orientation_.coeffs() << -curr_orientation_.coeffs();
}
// "difference" quaternion // 姿态偏差求解为四元数形式
Eigen::Quaterniond quat_rot_err (curr_orientation_ * desired_pose_orientation_.inverse());
if(quat_rot_err.coeffs().norm() > 1e-3)
{
quat_rot_err.coeffs() << quat_rot_err.coeffs()/quat_rot_err.coeffs().norm();
}
Eigen::AngleAxisd err_arm_des_orient(quat_rot_err); // 四元数转轴角
pos_error.tail(3) << err_arm_des_orient.axis() * err_arm_des_orient.angle(); // 从轴角获取 3*1 向量
参照公式 (7)(8)的导纳控制实现理念,将公式 (9) 所示的阻抗模型改写为如下表达形式:
e ¨ t = M d − 1 ( F e x t − D d e ˙ t + K d e t ) (10) \begin{aligned} \ddot e_t = M_d^{-1}(F_{ext} - D_d \dot e_t + K_d e_t) \\ \end{aligned}\tag{10} e¨t=Md−1(Fext−Dde˙t+Kdet)(10)积分
e ˙ t + 1 = e ˙ t + e ¨ t Δ t (11) \begin{aligned} \dot e_{t+1} = \dot e_t + \ddot e_t \Delta t \\ \end{aligned}\tag{11} e˙t+1=e˙t+e¨tΔt(11)再积分
e t + 1 = e t + e ˙ t + 1 Δ t (12) \begin{aligned} e_{t+1} = e_t + \dot e_{t+1} \Delta t \\ \end{aligned}\tag{12} et+1=et+e˙t+1Δt(12)
如果机器人底层控制器是速度接口,则下一周期速度控制指令
x ˙ d t + 1 = e ˙ t + 1 + x ˙ 0 t + 1 (13) \begin{aligned} \dot x_d^{t+1} = \dot e_{t+1} + \dot x_0^{t+1} \\ \end{aligned}\tag{13} x˙dt+1=e˙t+1+x˙0t+1(13)如果机器人底层控制器是位置接口,则下一周期的位置控制指令:
x d t + 1 = e t + 1 + x 0 t + 1 (14) \begin{aligned} x_d^{t+1} = e_{t+1} + x_0^{t+1} \\ \end{aligned}\tag{14} xdt+1=et+1+x0t+1(14)
举例来说,对于定点导纳控制,机器人的期望平衡轨迹实际上只有位姿,由于机器人保持不动,速度和加速度都为零,公式 (10)~(14) 就简化为:
x ¨ d t = M d − 1 ( F e x t − D d x ˙ t + K d ( x t − x 0 t ) ) x ˙ d t + 1 = x ˙ t + x ¨ d t Δ t x d t + 1 = x t + x ˙ d t + 1 Δ t \ddot x_d^{t} = M_d^{-1}(F_{ext} - D_d \dot x_t + K_d (x_t-x_0^t)) \\ \dot x_d^{t+1} = \dot x_t + \ddot x_d^t \Delta t \\ x_d^{t+1} = x_t + \dot x_d^{t+1} \Delta t x¨dt=Md−1(Fext−Ddx˙t+Kd(xt−x0t))x˙dt+1=x˙t+x¨dtΔtxdt+1=xt+x˙dt+1Δt
但是在以上积分求解过程中应该注意,公式 (11) 由 e ¨ t \ddot e_t e¨t 到 e ˙ t + 1 \dot e_{t+1} e˙t+1 的位置和姿态积分直接叠加即可;但是公式 (12) 由 e ˙ t + 1 \dot e_{t+1} e˙t+1 到 e t + 1 e_{t+1} et+1 的位置积分可以直接叠加,姿态积分不可以直接叠加,必须转换成姿态旋转矩阵描述后进行旋转矩阵姿态运算叠加,叠加表达式: R t + 1 = Δ R R t R_{t+1} = \Delta R R_t Rt+1=ΔRRt,其中, Δ R \Delta R ΔR 由 e ˙ t + 1 Δ t \dot e_{t+1} \Delta t e˙t+1Δt 的等效转轴姿态描述转换而来,并且矩阵乘法不满足交换律,注意先后顺序。公式 (14)的姿态叠加处理方式相同。所以注意,姿态求解过程中涉及到的姿态偏差求解和姿态叠加求解,是能否正确实现姿态导纳控制的关键。
Github 上找到的一些开源代码是仿真或者是基于实际机械臂的,但都是基于速度控制接口的机械臂,导纳控制器直接计算得到速度指令,供底层速度控制器去跟踪,鲜有看到导纳控制器计算得到位置指令,让底层位置控制器去跟踪,虽然没有什么理论深度,但是涉及到笛卡尔空间下位置和姿态一共6个自由度的时候,还是有很多要注意的点的,特此在此总结。
综上所述,阻抗控制和导纳控制是两种实现弹簧-质量-阻尼动力学的方式,根据实际条件,实际应用场景的不同,应该选择合适的方式实现所需要的柔顺特性。
CSDN博客:【机器人基础】阻抗/导纳控制深度解析
知乎帖_韩冰老师:基于六维力传感器机器人导纳控制
知乎帖_基于位置的阻抗控制——导纳控制
知乎帖_段晋军老师:阻抗控制和导纳控制在机器人中的应用
参考论文:2010 ICRA“Unified Impedance and Admittance Control”