1. 接触的距离区间
仍取 \rho=0.2\,\mathrm m、m_c=0.02\,\mathrm m、g=0.005\,\mathrm m。球心高度为 0.222\,\mathrm m 时,求物理距离、恢复误差,并判断候选接触与 EFC 激活状态。
解答接触的距离区间
有 s<m_c+g=0.025,因此存在候选接触;同时 s>m_c,所以接触被排除在约束行之外。球面仍有 2.2 厘米的真实间隙。
一个质量为 2\,\mathrm{kg} 的球体向平面落下。动力学方程能够算出重力引起的加速度;接触计算还需要知道球面离平面多远、两侧怎样相对运动,以及一个接触力会怎样改变这些运动。本章把这些关系依次写成残差、约束雅可比和约束空间逆惯量,再将它们对应到 MuJoCo 的 EFC 数组。
沿用球—平面模型:球半径 \rho=0.2\,\mathrm m,姿态固定,仅有平移自由度。广义速度按世界坐标排列为 v=(v_x,v_y,v_z)^{\mathsf T};平面为接触的第一侧,球体为第二侧。法线由平面指向球体,接触坐标轴依次为 (n,t_1,t_2)=(e_z,e_x,e_y)。一般刚体的转动贡献会在接触雅可比一节中补齐。
设球心高度为 z。球面与平面的有符号距离为 s=z-\rho:分离时为正,相切时为零,重叠时为负。理想的几何限制写成 s\geq0。为提前产生接触响应,MuJoCo 用进入约束的边界 m_c 定义恢复误差 r=s-m_c。因此,接触行开始起作用时,两个表面仍可能保有正间隙。
本地 MuJoCo 3.10.0 中,窄相位按 s\leq m_c+g 搜集候选接触,其中 g 是 gap;随后用 s<m_c 决定该接触是否进入约束。边界 s=m_c 被排除。处于两条边界之间的接触保留几何信息,尚未分配有效 EFC 行。具体几何算法对候选外边界的浮点判定也会影响恰好位于边界的接触。
| 量 | 模型数值 | 含义 |
|---|---|---|
| s=\texttt{dist} | 0.19-0.2=-0.01\,\mathrm m | 表面重叠深度为一厘米 |
| m_c=\texttt{includemargin} | 0.02\,\mathrm m | 进入约束的距离边界 |
| g | 0.005\,\mathrm m | 候选接触带的额外宽度 |
| r=s-m_c | -0.03\,\mathrm m | 参考恢复项使用的位置误差 |
球心下降时,会先经过候选边界,再经过激活边界,最后才到达真实表面。下面比较三种时刻,特别注意 s>0 与 r<0 可以同时成立:这对应尚有物理间隙、已经需要恢复的接触。
可以。例如 s=0.01\,\mathrm m、m_c=0.02\,\mathrm m,则 r=s-m_c=-0.01\,\mathrm m。几何表面仍有间隙,但已越过进入约束的边界。物理间隙与恢复误差使用不同的零点。实际是否承载还取决于后续力求解。
移动球心,比较表面位置、进入约束的边界与候选外边界。图中高度与边界均按真实比例绘制,球体姿态保持固定;边界状态按滑块的毫米刻度判定。
图中的两条阈值只改变接触何时进入数据和方程。进入约束之后,法向运动的符号仍由同一个距离行确定:球向上运动使 s 与 r 同时增大。
关节限位也可以取“允许区域为正”的残差。下限用 r=q-q_{\min},上限用 r=q_{\max}-q,对应的雅可比符号分别为 +1 与 -1。正的限位力经雅可比转置返回后,分别增大和减小关节坐标。双边位置约束则要求 r=0,恢复力可取两个符号。
下限行的功率为 \lambda\dot r=\lambda\dot q,故广义力为 +\lambda。上限行满足 \dot r=-\dot q,于是
当 \lambda\geq0 时,两种选择都将运动推回允许区域。关节 margin 继续从相应距离中扣除,形成恢复误差。
进入约束的接触还只是一条几何记录。接下来需要把运动接上它:位置怎样改变间隙,速度如何沿接触方向投影,加速度又如何维持这个几何关系。约束雅可比将这三个层次连接起来。
给定可微的几何残差 r(q),它沿系统运动的变化率由链式法则得到。配置含四元数时,速度与配置导数通过第六章的切空间映射 \dot q=N(q)v 联系;由此得到相对于广义速度的雅可比。
式(6.6)把存储配置的导数与广义速度联系起来。这里在这个映射之后,再求几何残差的变化,因此接触雅可比的列数与广义速度维数相同。
两个滑块沿同一直线运动,位置分别为 x_1,x_2。若要求距离为 L,可取 r=x_2-x_1-L,于是 J=(-1,1)。第一个滑块向正方向运动使残差减小;第二个滑块同向运动使残差增大。
沿同一条运动轨迹再求一次导数,会同时得到速度变化和雅可比变化两部分。记 a=\dot v、c=\dot Jv,则 \ddot r=Ja+c;给定几何加速度目标 \alpha 后,投影加速度应取 a_{\rm ref}=\alpha-c。
设 a=\dot v。沿实际运动轨迹对 \dot r=Jv 求导:
若希望几何残差的二阶导数达到 \alpha,则求解器应使
其中 Ja 是当前雅可比投影下的加速度,称为伪加速度。几何残差二阶导数还包含随配置变化的 c。球体仅平移且平面固定时,J_n 恒定,这一行的 c=0。
曲率项可由圆周运动直接看出。平面质点位置为 p,受长度为 L 的杆约束,取 r=(p^{\mathsf T}p-L^2)/2。此残差的单位是面积,雅可比为 p^{\mathsf T}。杆的几何形状保持不变时,径向加速度与切向速度仍同时存在。
对长度固定的杆,平方距离残差始终为零,所以 \ddot r=0。在右端点沿竖直切向运动时,这个条件给出向心加速度 a_x=-u_t^2/L。它来自雅可比随质点位置转动产生的曲率项。
在 p=(L,0)^{\mathsf T}、u=(0,u_t)^{\mathsf T} 处,保持圆周轨迹要求
例如 L=1\,\mathrm m、u_t=2\,\mathrm{m/s} 时,c=4\,\mathrm{m^2/s^2},Ja=-4\,\mathrm{m^2/s^2},两者相加为零。残差乘上一个尺度后,雅可比及其共轭力也要相应换算。
质点在圆周上始终满足位置残差为零,但径向加速度仍非零。图中把加速度投影项 Ja 与速度产生的曲率项 c 分开显示;匀速播放时两项应大小相等、符号相反。
质点按角速度 \omega 在单位圆上运动,播放时长为 4\,\mathrm s。速度与加速度箭头使用同一位置作为起点,显示长度分别按 0.25\,\mathrm s 和 0.20\,\mathrm{s^2} 缩放。读数比较 Ja、c 与 \ddot r。
圆周例把二阶约束的两部分分清了:速度越大,几何曲率要求的向心加速度越大。后续构造参考伪加速度时,要把已知曲率从几何加速度目标中移到右侧。
MuJoCo 的 EFC 统一保存伪加速度目标。当前源码先按位置、速度建立恢复项,再由 mj_Jdotv 为 connect 和 weld 等式行减去相应曲率项。接触行、关节限位行以及其他等式类型遵循各自的装配规则;解释一个目标时,应同时查看该行的残差定义与源码中的修正。
一个球体可以保持质心不动而原地转动,此时接触点仍会沿表面运动。摩擦响应取决于这个局部速度,因此需要先从质心运动恢复接触点运动,再把两侧速度相减。
一般刚体的接触点会同时受到质心平移和刚体转动的影响。在当前接触点 p_c 处,令 c_i 为第 i 侧质心,\ell_i=p_c-c_i。所有量都在世界轴下表示。两侧点速度及其差为
在质心之外测量点速度时,角速度对点速度的贡献由力臂决定。将质心线速度和角速度各自写成广义速度的线性映射,就得到 J_p=J_C-[\ell]_\times J_\omega。
用叉乘矩阵 [\ell]_\times w=\ell\times w,有 \omega\times\ell=-[\ell]_\times\omega。若刚体的速度暂按 (u_C,\omega) 排列,则点速度映射为
对树形关节系统,将质心线速度雅可比 J_C 与角速度雅可比 J_\omega 代入:
接触力作用于点 p_c 时,同一个叉乘块经转置给出质心力矩 \ell\times f。
把相对线速度投影到接触坐标轴,便得到前三条物理方向行。相对角速度为 \omega_2-\omega_1,其投影形成扭转和滚动方向。接触坐标系满足 t_2=n\times t_1。
先记两侧雅可比之差为 J_\Delta=J_{p_2}-J_{p_1}、J_{\omega\Delta}=J_{\omega_2}-J_{\omega_1}。前三行对相对线速度取分量,后三行对相对角速度取分量:
把这六行乘以同一个广义速度,所得各项的物理意义如下。每行的力变量都与该行速度相乘得到功率:
| 行 | 测得的运动 | 速度单位 | 共轭力 |
|---|---|---|---|
| 1 | n^{\mathsf T}u_{\rm rel},接近或分离 | \mathrm{m/s} | 法向力,\mathrm N |
| 2、3 | t_1^{\mathsf T}u_{\rm rel},\ t_2^{\mathsf T}u_{\rm rel},切向滑动 | \mathrm{m/s} | 切向力,\mathrm N |
| 4 | n^{\mathsf T}(\omega_2-\omega_1),绕法线扭转 | \mathrm{rad/s} | 扭转力矩,\mathrm{N\,m} |
| 5、6 | t_1^{\mathsf T}(\omega_2-\omega_1),\ t_2^{\mathsf T}(\omega_2-\omega_1),绕切轴滚动 | \mathrm{rad/s} | 滚动力矩,\mathrm{N\,m} |
模型中的平面静止,球体只有三个平移自由度,故前三行为世界分量的重排。角速度行在这个模型中为零。
法向速度为负,表示两侧正在接近;第一切向速度为正,表示球体相对平面沿世界横轴滑动。滑动方向力的单位为牛顿,扭转与滚动方向的力矩单位为牛顿米。因此滑动摩擦系数无量纲,而把法向力转换为转动力矩界限的摩擦系数具有长度单位。
先在一个刚体上观察这项分解。图中的材料点可以代表当前接触位置;参考点取质心时,它与接触点之间的向量就是本节的力臂。
保持平移不变,改变角速度与力臂,观察接触点速度怎样改变。图中的向量相加对应点雅可比的平移列与转动列。
对接触的另一侧重复同样的计算,再用第二侧减第一侧,便得到相对速度。投影到法线决定接近或离开,投影到两个切向则给出滑动方向。
condim 决定一个接触保留哪些物理方向。椭圆锥直接使用这些方向的力分量;棱锥采用成对的非负棱系数。两种表示由此具有不同的行数。
| condim | 物理方向 | 椭圆行数 | 棱锥行数 |
|---|---|---|---|
| 1 | 法向 | 1 | 1 |
| 3 | 法向、两个滑动切向 | 3 | 4 |
| 4 | 再加绕法线扭转 | 4 | 6 |
| 6 | 再加两个滚动力矩方向 | 6 | 10 |
设物理维数为 d_c>1,第 j 个摩擦方向的系数为 \mu_j。该方向的一对棱行是 J_{j+}=J_n+\mu_jJ_j 与 J_{j-}=J_n-\mu_jJ_j。各棱系数 \beta_{j+},\beta_{j-}\geq0 共同合成物理法向力和摩擦分量。
非负棱系数先分别沿棱行产生广义力。合并它们的法向部分得到法向合力,合并正负切向部分得到摩擦力:每一对系数的和增加法向力,二者的差决定该方向的摩擦分量。
逐项读出
由 |a-b|\leq a+b(a,b\geq0)可得 \sum_j|f_j|/\mu_j\leq f_n。这个截面为棱锥的多面形截面;各向同性椭圆锥的对应条件为 \sqrt{f_1^2+f_2^2}\leq\mu f_n。
同一接触的两种锥表示使用不同的行。固定球体速度后,先看椭圆表示中的纯法向、纯切向速度,再看棱锥行如何把二者相加或相减。图中行数、雅可比和速度由同一次投影得到。
切换接触维数和锥表示,查看当前球体模型的行数、雅可比与行速度。法向和切向贡献可分别显示。球体姿态固定,扭转与滚动方向的雅可比为零;棱行中的法向部分仍然保留。
每条棱行中的法向贡献都保留下来,因此多个非负棱系数可以共同形成一个物理法向力。角速度行在固定姿态的球体中为零,这也说明接触维数规定了可表示的方向,而实际作用还取决于系统自由度。
EFC 中的位置字段按行的用途存放。椭圆接触仅在第一行存放物理距离与 margin,切向行的两个位置字段均为零;所有棱行都复制法向距离和 margin。这使各棱行共享法向恢复误差,同时对不同方向的相对运动做出响应。
| 行 | efc_pos / efc_margin | efc_vel |
|---|---|---|
| 椭圆法向 | s\;/\;m_c | J_nv |
| 椭圆摩擦方向 | 0\;/\;0 | J_jv |
| 棱锥正、负棱 | s\;/\;m_c | (J_n\pm\mu_jJ_j)v |
| 自由度或肌腱干摩擦 | 0\;/\;0 | 相应自由度速度或肌腱长度变化率 |
因此,\dot r=Jv 的链式法则应施加在已定义的几何残差上。存储字段 efc_pos 兼有提供恢复量的用途;椭圆摩擦行虽然存零,其行速度仍能描述滑动,棱行的速度也包含法向位置字段以外的摩擦方向运动。
约束速度 Jv 与约束力分量 f 成为功率共轭的一对量。它们的内积等于各个广义自由度获得的功率,因此广义约束力为 J^{\mathsf T}f。
式(6.5)的雅可比转置曾把一个末端点力传回关节。现在把各个接触方向逐行排列,同一功率关系会把整组约束力一起传回。
对任意允许的广义速度 v,广义力满足 P=\tau^{\mathsf T}v,逐分量比较可得 \tau=J^{\mathsf T}f。两个滑块的 J=(-1,1) 给出 \tau=(-f,f)^{\mathsf T},两侧受到大小相等、方向相反的力。
固定当前配置与速度,把重力、驱动力和速度项先合并成自由加速度 a_u。加入约束力后,动力学方程及其约束空间投影为
A 描述单位约束力引起的行加速度变化,称为约束空间逆惯量。非对角项反映两条约束通过共同刚体或关节发生的耦合。计算时可以解 Mx=J_i^{\mathsf T} 再投影各行,从而复用质量矩阵分解。
对一条独立的距离行,令约束力引起的相对加速度变化为 \Delta a_r。关系 \Delta a_r=Af 可以改写成 f=m_{\rm eff}\Delta a_r,其中 m_{\rm eff}=1/A。这个有效质量描述沿所选相对方向推动系统的难易;两滑块共同运动时,两侧的逆质量相加。
质量矩阵为 M=\operatorname{diag}(m_1,m_2),取距离行 J=(-1,1):
约束力分别产生 -f/m_1 和 f/m_2 的加速度,二者相减恰为 Af。因此此相对方向的有效质量为 m_{\rm eff}=1/A=m_1m_2/(m_1+m_2)。
取 m_1=2\,\mathrm{kg}、m_2=1\,\mathrm{kg},则 A=1.5\,\mathrm{kg^{-1}}、m_{\rm eff}=2/3\,\mathrm{kg}。施加 f=3\,\mathrm N 时,两侧加速度分别改变 -1.5 与 3\,\mathrm{m/s^2},相对加速度改变 4.5\,\mathrm{m/s^2},满足 3=(2/3)(4.5)。
若第一侧质量趋于无穷,1/m_1 趋于零,得到 m_{\rm eff}\to m_2:固定地面只留下可动侧的惯性。若两侧质量相同为 m,两侧都能相向或反向加速,有效质量为 m/2。
质量矩阵正定时,A 对称半正定。若某组行力经 J^{\mathsf T} 恰好相互抵消,这组力处于 A 的零方向;独立的行才能使 A 在整个行空间正定。
设质量矩阵正定。由 M^{-1} 对称可知 A^{\mathsf T}=A。任取行空间向量 y,
等号成立当且仅当 J^{\mathsf T}y=0。例如两条完全相同的行对力系数 (1,-1) 相互抵消,产生零广义力。只有各行线性无关时,A 才在整个行空间正定。正的正则矩阵 R 可使 A+R 正定。
给距离行施加一个单位力,会同时加速两个滑块;第二滑块的位置行也因此感到加速度变化。下面令第二行的力为零,再改变第一行的力和滑块质量,可以直接读出 A 的第一列。交换激励行后,就读出第二列。
两个滑块具有距离行 J_1=(-1,1) 和第二滑块的位置行 J_2=(0,1)。改变质量与两条行上的力,观察两侧加速度及 Af。两支加速度箭头使用图中给出的共同缩放系数 s_a,可直接比较方向和相对大小。
两条行通过第二个滑块共享惯性,所以非对角项为 1/m_2。当两条行同时受力,各列的响应相加得到 Af;逐行独立猜测力值会忽略这一联系,后面的多接触求解必须同时满足所有行。
再把单条距离约束扩展成上下叠放的两个方块:下方块与地面接触,上方块与下方块接触。两方块只沿竖直方向平移,质量各为一千克,高度各为一米,当前两处间隙都为零。地面接触与层间接触共享下方块,因而会互相影响。
以 z_1,z_2 表示下、上两方块的质心高度。两行间隙及其雅可比为
地面支撑力为 f_1,层间支撑力为 f_2,两者正向都规定为向上作用在接触的上侧物体。层间力在下方块上的反作用向下,于是
第一列表示只增加一牛顿地面力:下方块加速度增加一,地面间隙加速度增加一,层间间隙加速度减少一。第二列表示只增加一牛顿层间力:下方块向下、上方块向上,各改变一,层间分离加速度合计增加二。矩阵的每个数都有对应的物体响应。
分别改变地面力与层间力,读出物体加速度及接触相对加速度。静止支撑预设可用于核对两股力的大小。
这个例子在第十三章用于确定哪几处接触承载,在第十五章用于逐行计算接触力。物体模型与力的正方向保持一致。
多条行同时求解时,1/A_{ii} 表示其他行力固定时第 i 行的局部有效质量。其他行若也随之调整,最终响应还含 A 的非对角耦合。几何残差乘以尺度后,这个数值也会改变,因此使用有效质量时必须同时说明残差与力的单位。
为保持同一个物理运动,残差缩放应同时作用于共轭力与行空间惯性。设常数 \gamma>0,取 \widetilde r=\gamma r,则 \widetilde J=\gamma J,共轭力应取 \widetilde f=f/\gamma。
先保持广义力相同:
再将缩放后的雅可比放入逆惯量定义:
恢复目标同样缩放为 \widetilde a_{\rm ref}=\gamma a_{\rm ref}。若软约束正则量取 \widetilde R=\gamma^2R,则缩放后的方程仍等价于原方程。例如将长度残差从米改用厘米,数值放大一百倍,共轭力数值应缩小一百倍,逆惯量和正则量放大一万倍。平方距离残差也有自身的共轭力单位;它与长度残差的比例随配置变化,二阶求导时还须保留这个变化产生的项。
源码还使用 diagApprox 为软约束确定惯性尺度。常规接触分支把两侧刚体的参考平均平移或转动逆惯量相加;棱行再按摩擦系数的平方组合它们。这个近似只提供对角尺度,完整 A 保留当前配置、点偏置及跨行耦合。启用 diagexact 时,源码先由质量分解求出精确对角,再重建阻抗参数;摩擦方向随后仍按锥的规则调整。
对自由刚体,单位法向力既推动质心,也通过力矩转动刚体。沿同一法向测量接触点加速度,平移与转动的贡献相加;因此精确对角会随力臂和接触方向改变。
对一个可自由转动的刚体,法向点力在质心处产生力 n f 和力矩 (\ell\times n)f。在当前状态比较有无这一个增量力的加速度,已知的速度偏置相消。质心和角加速度的增量为
接触点的加速度增量再加上转动部分,并沿法线测量:
最后一步使用标量三重积的循环关系。代入角加速度,并除以 f,得到
第二项来自转动加速度对接触点的贡献,随接触点和方向改变。球体仅平移时此项消失,当前模型满足 A_{nn}=1/2\,\mathrm{kg^{-1}}。一般关节树还需通过完整质量矩阵处理关节耦合。
efc_diagA 在 mj_makeImpedance 末尾还会被重写,使它与最终的 R 和阻抗保持约定关系。读取最终数组时,应结合调用阶段理解该值。
EFC 将等式约束、干摩擦、限位与接触排列在同一行空间中。mj_makeConstraint 的装配顺序依次为等式、自由度与肌腱干摩擦、关节与肌腱限位、接触。ne 和 nf 记录前两组的行数,求解器据此选择双边、饱和摩擦或单边等处理规则。
| 字段 | 数学内容或用途 |
|---|---|
| efc_type / efc_id | 行类型及其所属等式、关节、肌腱或接触对象 |
| efc_pos / efc_margin | 位置恢复量与激活边界 |
| efc_J / efc_vel | J 与 Jv |
| efc_aref | 当前行的目标伪加速度 a_{\rm ref} |
| efc_b | 自由状态相对于目标的差 b=Ja_u-a_{\rm ref} |
| efc_force / qfrc_constraint | 行空间力 f 与广义力 J^{\mathsf T}f |
| efc_R / efc_D | 正则尺度及其逐行倒数 |
| efc_state | 当前行落入的求解分段状态 |
稠密模式按行连续存放 J;稀疏模式用 efc_J_rownnz、efc_J_rowadr、efc_J_colind 描述每行长度、起始地址与广义自由度列号。contact.efc_address 指向该接触的第一条行;被排除或没有可作用自由度的接触保留负地址。
同一个行数组中既有单边接触,也有双边等式。行类型决定允许力的范围,行雅可比决定力作用到哪里;两者要共同解释,才能把数组中的一行还原成具体的力学关系。
connect 等式比较两侧锚点世界位置,生成三个残差。weld 再加入三个姿态残差,形成六行。源码的姿态部分使用相对误差四元数的向量部,并乘以具有长度尺度作用的 torquescale。
weld 将目标相对姿态与当前相对姿态合成一个误差四元数。其向量部等于误差轴乘以半角正弦;乘以长度尺度 \ell 后,与平移残差一起构成六行。姿态雅可比由这个四元数乘积求导,小角附近的比例为 \ell/2。
设两体姿态四元数为 q_1,q_2,目标相对姿态为 q_0。取与源码一致的误差乘积 e=q_2^{-1}\otimes q_1\otimes q_0。姿态残差为 r_\theta=\ell\operatorname{vec}(e),其中 \ell 为 torquescale。若误差角为 \theta、误差轴为 n_e,则
世界角速度满足 \dot q_i=\tfrac12[0,\omega_i]\otimes q_i。对逆四元数由恒等式 q_i^{-1}\otimes q_i=1 求导,得到 \frac{d}{dt}q_i^{-1}=-\tfrac12q_i^{-1}\otimes[0,\omega_i]。逐项代入:
令角速度雅可比之差为 J_{\omega_1}-J_{\omega_2},将每一列作为上式的角速度差,取向量部并乘 \ell,便得到三条姿态行。小误差时 r_\theta\approx\ell\theta n_e/2;误差接近半周时,应保留上述四元数表达及其实际雅可比。
求解误差从自由加速度开始。记目标为 a_{\rm ref},则加入约束力后的目标偏差满足
对于双边软约束,力与目标偏差满足 Rf=-(Ja-a_{\rm ref})。把动力学投影代入后,得到 (A+R)f=-b。因此 A 来自动力学,R 来自选定的软约束关系,b 来自零约束力时的目标偏差。
把动力学关系 Ja=Ja_u+Af 减去目标:
对处于双边二次区域的软约束,恢复关系为 f=-R^{-1}(Ja-a_{\rm ref})。两边乘 R 并移项:
单边接触还要求法向力非负,摩擦接触还要求力落在相应锥内。这些允许力的条件决定哪些行能直接使用这一线性关系。
取球心高度 0.19\,\mathrm m、速度 (0.8,0,-0.1)^{\mathsf T}\,\mathrm{m/s},质量矩阵为 M=2I。此处给定行空间候选力 f=(20,-4,1)^{\mathsf T}\,\mathrm N,用它核对从约束空间到广义加速度的完整关系。
该状态下,候选力投影后的加速度为 a=(-2,0.5,0.19)^{\mathsf T}\,\mathrm{m/s^2}。将同一结果再投影到接触轴,应与先计算 Af 的结果相同;下面把两条计算路径与功率一起核对。
由于 J 是轴次序重排,
自由加速度只有重力,加入候选力后:
取示例目标 a_{\rm ref}=(2,0,0)^{\mathsf T}\,\mathrm{m/s^2},则
功率从两边核对:f^{\mathsf T}Jv=20(-0.1)-4(0.8)+1(0)=-5.2\,\mathrm W,而 (J^{\mathsf T}f)^{\mathsf T}v 给出同一个值。候选力的选择用于检查投影;实际求解器还需结合参考目标、正则项与摩擦模型确定力。
配套程序 efc.py 使用普通 Python 列表实现上述计算,check_efc.py 分别用 Newton 方程、功率和有限差分核对投影。运行目录为 notes/series_html。
python3 examples/efc.py
python3 examples/check_efc.py
model = model_data()
rows = contact_rows(condim=3)
velocity = matvec(rows, model["velocity"])
A = inverse_inertia(rows, [1/model["mass"]]*3)
force = [20, -4, 1]
tau = transpose_product(rows, force)
acceleration = [g + f/model["mass"]
for g, f in zip(model["gravity"], tau)]
以下链接指向当前仓库源码。阅读顺序沿几何接触、约束行、参考量和动力学求解展开。
| 函数 | 与本章关系 |
|---|---|
| mj_narrowphase / mj_setContact | 生成候选接触,记录距离与 includemargin,设置 exclude |
| mj_instantiateContact | 两侧雅可比作差,换到接触轴,生成物理方向行或棱行 |
| mj_instantiateEquality / mj_Jdotv | connect、weld 残差、雅可比与曲率修正 |
| mj_diagApprox / mj_makeImpedance | 参考逆惯量尺度、阻抗和正则项 |
| mj_projectConstraint / mj_makeAR | 由质量分解投影,按需形成 A+R |
| mj_referenceConstraint | 计算 Jv 与参考伪加速度 |
| mj_fwdConstraint | 形成 b、求力,并通过 J^{\mathsf T} 返回广义空间 |
官方 Computation — Constraint model 给出了约束空间形式;本章的字段、函数与边界约定以所链接的本地 3.10.0 源码为准。
仍取 \rho=0.2\,\mathrm m、m_c=0.02\,\mathrm m、g=0.005\,\mathrm m。球心高度为 0.222\,\mathrm m 时,求物理距离、恢复误差,并判断候选接触与 EFC 激活状态。
有 s<m_c+g=0.025,因此存在候选接触;同时 s>m_c,所以接触被排除在约束行之外。球面仍有 2.2 厘米的真实间隙。
关节上限为 q_{\max}=1,当前 q=1.1、v=0.2。取零 margin,求 r,J,Jv 及正限位力 f=3 对广义力的贡献。
负广义力减小关节坐标,与超出上限后的恢复方向一致。
圆周半径 L=2\,\mathrm m,当前 p=(2,0)^{\mathsf T}\,\mathrm m、u=(0,3)^{\mathsf T}\,\mathrm{m/s}。用本章的平方距离残差,求保持约束时的 c、Ja 和径向加速度。
因为 J=(2,0),有 2a_x=-9,所以 a_x=-4.5\,\mathrm{m/s^2}。向心加速度大小也可由 u_t^2/L=9/2 核对。
平面刚体质量 m=2\,\mathrm{kg},绕质心惯量 I=0.5\,\mathrm{kg\,m^2}。接触点相对质心为 (0.3,0),法线向上。按 (v_x,v_y,\omega) 排列速度,求法向雅可比与 A_{nn}。
接触点的竖直速度为 v_y+0.3\omega,故 J_n=(0,1,0.3)。
转动贡献为 0.18;把接触点移到质心正下方时,力臂与法线平行,这一贡献降为零。
三维接触的滑动系数为 \mu=0.6,四个棱系数按第一切向正负、第二切向正负排列为 (3,1,2,2)\,\mathrm N。求物理接触力,并核对两个表示的广义力。
球体模型的物理回投为 (1.2,0,8)^{\mathsf T}\,\mathrm N。四棱行分别为 (0.6,0,1)、(-0.6,0,1)、(0,0.6,1)、(0,-0.6,1),乘上对应系数后相加得到相同向量。
取 M=\operatorname{diag}(2,4),J=\begin{bmatrix}-1&1\\0&1\end{bmatrix}。求 A,并解释第一条行上单位力对第二条行的影响。
第一条行的单位力使第二滑块加速 1/4,因而第二条行的加速度也改变 1/4。非对角项直接记录这个共享自由度的响应。
质量为 2\,\mathrm{kg} 的单自由度系统采用两条相同的行 J=(1,1)^{\mathsf T}。求 A 与其零方向,并解释行力 (3,1) 和 (2,2) 的作用。
两组行力都经 J^{\mathsf T} 合成为 4\,\mathrm N,引起 2\,\mathrm{m/s^2} 的加速度。它们的差沿零方向;加入严格正的正则项后,优化目标可以在这些分配之间作出确定选择。
一个椭圆切向行保存 efc_pos=0,但当前 efc_vel=0.8。说明这一状态的含义。另给 Ja_u=-9.81、a_{\rm ref}=2、A=0.5、f=20,求 b 和最终目标偏差。
切向行的零位置字段用于构造纯速度摩擦响应,行速度由接触点相对速度投影得到。此时沿第一切向发生正向滑动。
目标偏差、最终伪加速度和参考目标是三个各有用途的数值。