书籍《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)
在阻抗控制中,控制器是一个机械阻抗,被控对象被当作导纳对待,如下图所示:
结合公式(1)和公式(2),推导得到阻抗控制律:
F
=
(
m
M
d
−
1
)
F
e
x
t
+
m
x
¨
0
−
m
M
d
(
D
d
e
˙
+
K
d
e
)
(3)
在导纳控制中,受控对象基于位置控制,而不再像阻抗控制器那样基于力控制,如下图所示:
其中,位置控制器可采用
P
D
PD
PD 控制器实现:
F
=
k
p
(
x
d
−
x
)
−
k
d
x
˙
(4)
m
x
¨
+
k
d
x
˙
+
k
p
(
x
−
x
d
)
=
F
e
x
t
(5)
M
d
(
x
¨
d
−
x
¨
0
)
+
D
d
(
x
˙
d
−
x
˙
0
)
+
K
d
(
x
d
−
x
0
)
=
F
e
x
t
(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)
在实际应用场景中,不论是定点导纳控制,还是在轨迹跟踪任务中加入导纳柔顺控制策略,这些机器人受控运动都是具有预定义的参考轨迹 (期望平衡轨迹) 的,因此,公式 (9) 形式描述的阻抗模型更为实用:
M
d
e
¨
+
D
d
e
˙
+
K
d
e
=
F
e
x
t
(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)
e
˙
t
+
1
=
e
˙
t
+
e
¨
t
Δ
t
(11)
e
t
+
1
=
e
t
+
e
˙
t
+
1
Δ
t
(12)
如果机器人底层控制器是速度接口,则下一周期速度控制指令
x
˙
d
t
+
1
=
e
˙
t
+
1
+
x
˙
0
t
+
1
(13)
x
d
t
+
1
=
e
t
+
1
+
x
0
t
+
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”