运动生成器#
机器人任务通常在任务空间中定义,通常以期望的末端执行器轨迹来表示,而控制动作则在关节空间中执行。这自然导致了 关节空间 和 任务空间 (操作空间)控制方法。然而,使用运动控制成功执行交互任务通常需要一个准确的模型,既包括机器人操纵器,也包括其环境。虽然足够精确的操纵器模型可能是已知的,但环境的详细描述却很难获得 [SSVO09] 。通过在交互过程中引入 顺应性 行为,可以克服由这种不匹配引起的规划错误。
尽管合规性可以通过机器人结构(如弹性驱动器、软体机器人手臂)被动实现,但我们更感兴趣的是专注于主动交互控制的控制器设计。这些大致可分为:
阻抗控制: 一种间接控制方法,其中在交互过程中产生的运动偏差与接触力之间的关系可以通过一个具有可调参数(刚度和阻尼)的质量-弹簧-阻尼器系统来表示。其专门化形式是 刚度 控制,其中仅考虑位置误差与接触力之间的静态关系。
混合力/运动控制: 一种主动控制方法,分别沿着不受约束和受约束的任务方向控制运动和力。在各种混合运动控制方案中,提供的实现基于操作空间中的逆向动力学控制 [Kha87] 。
备注
为了提供更广泛的运动生成器,我们欢迎社区的贡献。如果您感兴趣,请打开一个问题来开始讨论!
关节空间控制器#
扭矩矩控制控制#
动作维度: "n"
(关节数量)
在扭矩控制模式下,输入动作被直接设置为前馈关节扭矩命令,即在每个时间步,
因此,您可以通过通过 ActuatorControlCfg
类将执行器组的命令类型设置为 "t_abs"
来实现这种控制模式。
速度控制#
动作维度: "n"
(关节数量)
在速度控制模式下,需要一个比例控制律来减少当前与期望关节速度之间的误差。基于输入动作,关节扭矩命令计算如下:
在这里 \(k_d\) 是从配置中解析得到的增益。
该控制模式可以通过通过 ActuatorControlCfg
类设置执行器组的命令类型为 "v_abs"
或 "v_rel"
来实现。
注意
在执行速度控制时,在许多情况下,需要进行重力补偿以确保更好地跟踪命令。在这种情况下,我们建议在仿真中禁用关节中链节的重力。
位置控制与固定阻抗#
动作维度: "n"
(关节数量)
在位置控制模式下,采用比例-阻尼 (PD) 控制律来跟踪期望的关节位置,并确保关节保持在期望位置(即期望的关节速度为零)。根据输入动作,关节扭矩命令计算如下:
其中 \(k_p\) 和 \(k_d\) 是从配置中解析出的增益。
在其最简单的上述形式中,控制模式可以通过通过 ActuatorControlCfg
类设置执行器组的命令类型为 "p_abs"
或 "p_rel"
来实现。
然而,一个更完整的公式,考虑到发音的动态,应该是:
其中 \(M\) 是大小为 \(n \times n\) 的关节空间惯性矩阵,\(g\) 是关节空间重力向量。通过将阻抗模式设置为 "fixed"
,可以通过 JointImpedanceController
类来实现此功能。增益 \(k_p\) 从输入配置中解析, \(k_d\) 则在将系统视为解耦的点质量振荡器时计算得出,即,
其中 \(D\) 是系统的阻尼比。当 \(D = 1\) 时,系统达到临界阻尼;当 \(D > 1\) 时,系统为过阻尼;当 \(D < 1\) 时,系统为欠阻尼。
此外,可以通过将配置中的标志 inertial_compensation
和 gravity_compensation
分别设置为 False
来禁用控制器中的惯性补偿或重力补偿。
变位控制与可变刚度#
动作维度: "2n"
(关节数)
在刚度控制中,采用与上述相同的公式,然而,增益 \(k_p\) 是输入命令的一部分。此实现可以通过 JointImpedanceController
类实现,方法是将阻抗模式设置为 "variable_kp"
。
位置控制与可变阻抗#
动作维度: "3n"
(关节数)
在阻抗控制中,采用与上述相同的公式,然而,\(k_p\) 和 \(k_d\) 都是输入命令的一部分。通过将阻抗模式设置为 "variable"
,可以通过 JointImpedanceController
类来实现此功能。
任务空间控制器#
差分逆向运动学 (IK)#
动作维度: "3"
(相对/绝对位置),"6"
(相对姿态),或 "7"
(绝对姿态)
逆向运动学将任务空间的跟踪误差转换为关节空间的误差。在其最典型的实现中,任务空间中的位姿误差,\(\Delta \chi_e = (\Delta p_e, \Delta \phi_e)\) ,被计算为期望任务空间位置与当前任务空间位置之间的笛卡尔距离,以及期望任务空间方向与当前任务空间方向之间在 \(\mathbb{SO}(3)\) 中的最短距离。
使用几何雅可比矩阵 \(J_{eO} \in \mathbb{R}^{6 \times n}\) ,它将任务空间的速度与关节空间的速度关联起来,我们设计控制律以获得期望的关节位置,如下所示:
其中 \(\eta\) 是一个缩放参数,而 \(J_{eO}^{-}\) 是雅可比矩阵的伪逆。
可以使用不同的公式计算雅可比矩阵的伪逆:
摩尔-彭罗斯伪逆: \(A^{-} = A^T(AA^T)^{-1}\) 。
Levenberg-Marquardt 伪逆 (阻尼最小二乘法): \(A^{-} = A^T (AA^T + \lambda \mathbb{I})^{-1}\).
转置伪逆: \(A^{-} = A^T\) 。
自适应奇异值分解(SVD)伪逆来自 Buss [Bus04] 。
这些实现可以通过 DifferentialInverseKinematics
类访问。
阻抗控制器#
它使用任务空间位姿误差和雅可比矩阵,通过质量-弹簧-阻尼系统计算关节扭矩,其中包括 a) 固定刚度,b) 变量刚度(刚度控制),以及 c) 变量刚度和阻尼(阻抗控制)。
操作空间控制器#
类似于任务空间阻抗控制,但使用运动方程(EoM)来计算任务空间力
闭环比例力控制器#
它使用比例项来跟踪相对于末端执行器当前扭矩的期望扭矩命令。
混合力-运动控制器#
它结合了闭环力控制和操作空间运动控制,以计算末端执行器所需的扭矩。它使用选择矩阵来定义无约束和受约束的任务方向。
反应式规划器#
典型的任务空间控制器并没有考虑诸如关节限制、自碰撞和环境碰撞等运动约束。相反,它们依赖于高级规划器(例如 RRT )来处理这些非欧几里得约束,并将关节/任务空间的路径点传递给控制器。然而,这些方法通常比较保守,并且在靠近物体时会出现不理想的减速。最近,不同的方法将约束直接整合到优化问题中,从而为运动生成和控制提供了一个整体解决方案。
我们当前支持以下规划器:
RMPFlow (lula): 一种基于加速度的策略,通过组合各种黎曼运动策略(RMPs)来解决任务层次结构 [CMI+21] 。它能够在将末端执行器导航到目标的同时执行动态避碰。
MPC (OCS2): 一种基于顺序线性二次 (SLQ) 编程的后退式控制策略。它通过软惩罚将各种约束条件公式化为一个单一的优化问题,并使用自动微分计算系统动态、约束和成本的导数。目前,我们支持固定臂和移动机械臂中末端执行器轨迹跟踪的MPC公式。该公式考虑了具有关节限制和自碰撞避免的运动学系统模型 [MHF+22] 。
警告
我们围绕这些反应式规划器的 Python 绑定进行包装,以执行机器人动作的批处理计算。然而,它们当前的实现是基于 CPU 的,这可能会导致学习过程中的某些性能下降。