接触与摩擦Contact & Friction
走路、抓取、推、拧、插:机器人真正“做事”的时刻几乎都发生在接触里。接触力有三个怪脾气:地面只能推、不能拉(单边);摩擦有上限,超过 \(\mu\) 乘法向力就打滑(摩擦锥,半角 \(\arctan\mu\));力可以在一瞬间出现或消失(非光滑,互补条件)。这一节从斜面上的方块出发,造出摩擦锥,再看三维锥为什么在求解器里变成金字塔,惩罚法与冲量法为什么在刚度与步长上互相拉扯,最后让一根手指在关节力矩上限与摩擦锥的双重约束下压桌子。 Walking, grasping, pushing, screwing, inserting: nearly every moment when a robot actually does something happens in contact. Contact forces have three odd habits: the ground can only push, never pull (unilateral); friction has a ceiling, and beyond \(\mu\) times the normal force the surface slips (the friction cone, half-angle \(\arctan\mu\)); and forces can appear or vanish in an instant (non-smooth, complementarity). Starting from a block on a ramp we build the friction cone, see why the 3D cone becomes a pyramid inside solvers, why penalty and impulse contact pull stiffness and time step against each other, and finally let a finger press on a table under the double limit of joint torques and the friction cone.
1为什么机器人需要它Why robots need this
在自由空间里挥舞手臂,反而是机器人的例外。脚踩地面才能走路,手指夹住物体才能抓取,推箱子、拧螺丝、插接头、擦桌子,都是靠接触把力传给世界。接触也是仿真与真实机器人之间差距的主要来源:同样的动力学方程(8.1、8.3 节的 \(M\ddot{\mathbf q}+\mathbf b=\boldsymbol\tau\) 加上接触项)\(M\ddot{\mathbf q}+\mathbf b=\boldsymbol\tau+J_c^\top\mathbf f\),自由运动时误差很小,一旦出现接触,\(\mathbf f\) 这一项就成了最难算准的部分。接触力有三个特点:
- 单边:地面只能推机器人,不能拉它。法向力 \(\lambda_n\ge 0\)。所有“拉不住”的现象(脚离地、手指松开)都从这里来。
- 有上限:切向的摩擦力不超过 \(\mu\) 倍的法向力,\(\|\mathbf f_t\|\le\mu f_n\);超过就打滑。它在力空间里画出一个摩擦锥,腿式机器人的足底力、抓取的接触力都必须待在锥里。
- 非光滑:碰撞瞬间速度突变,力在零与正值之间“开关”,黏着变成滑动。力不是状态的光滑函数,所以光滑的 ODE(2.5 节)、梯度(3.2 节)这些工具在这里需要小心使用。
这一节把这三件事一件件拆开:先用斜面上的方块建立摩擦锥的直觉,再把锥放进三维与求解器,然后看“互补”条件和两种常见的接触模型(惩罚法、冲量法),最后用机械臂压桌子的例子把接触与 7.6 节的静力学接起来。
Swinging an arm through free space is the exception for a robot. A foot must press on the ground to walk, fingers must squeeze an object to grasp it, and pushing a box, driving a screw, plugging in a connector or wiping a table all work by passing force to the world through contact. Contact is also the main source of the gap between simulation and real robots: the same dynamics \(M\ddot{\mathbf q}+\mathbf b=\boldsymbol\tau+J_c^\top\mathbf f\) (the \(M\ddot{\mathbf q}+\mathbf b=\boldsymbol\tau\) of Lessons 8.1 and 8.3 plus a contact term) is accurate in free motion, but as soon as contact appears, the \(\mathbf f\) term becomes the hardest part to get right. Contact forces have three traits:
- Unilateral: the ground can push the robot but never pull it, so the normal force obeys \(\lambda_n\ge 0\). Every "cannot hold on" phenomenon (a foot leaving the ground, a finger letting go) comes from here.
- Bounded: the tangential friction force cannot exceed \(\mu\) times the normal force, \(\|\mathbf f_t\|\le\mu f_n\); beyond that the contact slips. In force space this draws a friction cone, and the foot forces of a legged robot or the contact forces of a grasp must stay inside it.
- Non-smooth: at an impact the velocity jumps, the force "switches" between zero and positive, and sticking turns into sliding. The force is not a smooth function of the state, so tools such as smooth ODEs (Lesson 2.5) and gradients (Lesson 3.2) need care here.
This lesson takes the three apart one by one: a block on a ramp builds the intuition for the friction cone, then the cone goes into 3D and into solvers, then we meet the complementarity condition and the two common contact models (penalty and impulse), and finally a robot arm pressing on a table ties contact to the statics of Lesson 7.6.
2直觉:斜面上的方块什么时候开始滑Intuition: when does a block on a ramp start to slide?
把一块方块放在木板上,慢慢抬高木板。方块在某个角度突然开始下滑。是什么决定了这个角度?先把力画出来:重力 \(m\mathbf g\) 竖直向下,把它分解到木板的法向和切向:法向分量 \(mg\cos\alpha\) 压住木板,切向分量 \(mg\sin\alpha\) 想把方块拉下去。木板用法向力 \(N\) 顶住前者,用摩擦力 \(f\) 顶住后者。库仑的经验定律说:只要不打滑,摩擦力可以是任何大小,直到上限 \(\mu_s N\):
Put a block on a plank and slowly raise the plank. At some angle the block suddenly starts to slide. What sets that angle? Draw the forces first: gravity \(m\mathbf g\) points straight down; split it into the plank's normal and tangential directions. The normal part \(mg\cos\alpha\) presses into the plank, and the tangential part \(mg\sin\alpha\) tries to pull the block down. The plank resists the first with a normal force \(N\) and the second with a friction force \(f\). Coulomb's empirical law says that as long as the block does not slip, the friction force can be anything up to the ceiling \(\mu_s N\):
质量 \(m\) 两边约掉了:临界角 \(\alpha_{\text{crit}}=\arctan\mu_s\) 只与材料有关,与方块多重无关。下面的图让你自己试。方块受三种力:重力、法向力 \(N\)(蓝)、摩擦力 \(f\)(红);法向力与摩擦力合起来是木板对方块的接触力 \(\mathbf R\)(紫)。围绕法线的青色扇形就是摩擦锥,半角是 \(\arctan\mu_s\)。只要接触力 \(\mathbf R\) 落在锥里,方块就黏着不动;要它落到锥外,木板就给不出这个力,方块便开始打滑。拖动倾角,看紫色箭头如何一点点倒向锥的边界。你也可以用滑块再加一个推力:往斜面里压会让方块更稳,往外拉则会让它离开斜面。
The mass \(m\) cancels: the critical angle \(\alpha_{\text{crit}}=\arctan\mu_s\) depends only on the materials, not on how heavy the block is. The figure below lets you try it. The block feels three forces: gravity, the normal force \(N\) (blue) and the friction force \(f\) (red); the normal and friction forces together are the plank's contact force \(\mathbf R\) (purple). The cyan fan around the surface normal is the friction cone, with half-angle \(\arctan\mu_s\). As long as the contact force \(\mathbf R\) lies inside the cone, the block sticks; to push it outside the cone, the plank would have to supply a force it cannot, and the block starts to slide. Drag the tilt and watch the purple arrow tip over toward the boundary of the cone. You can also add a push with the sliders: pressing into the surface makes the block more stable, and pulling away lets it leave the surface.
- 不加推力,把倾角调到刚好超过 \(\arctan\mu_s\)(在 1.5° 之内):方块刚好开始下滑。临界角读数与你的发现吻合吗?With no push, set the tilt just beyond \(\arctan\mu_s\) (within 1.5°): the block starts to slide. Does the critical angle in the readout match what you found?
- 让倾角明显超过临界角(\(\tan\alpha>\mu_s\) 且多出 3° 以上,方块本来会滑),再沿法线向里压(\(\beta<0\)),让它重新黏住。为什么变稳了?Tilt well beyond the critical angle (more than 3° past it, so the block would slide), then press into the surface (\(\beta<0\)) until it sticks again. Why does that help?
- 向外拉(\(\beta>0\))直到法向力降到 0,方块离开斜面。此时还有摩擦力吗?Pull away from the surface (\(\beta>0\)) until the normal force reaches 0 and the block lifts off. Is there still friction?
接触面能提供的力,不是一个数,而是一个集合:以法线为轴、半角为 \(\arctan\mu\) 的锥。静止的物体需要接触面提供“刚好够”的力;这个需求落在锥里就黏着,落在锥外就打滑。斜面的临界角 \(\arctan\mu\) 就是锥的半角:重力的反方向恰好擦着锥的边。
What a contact surface can supply is not a number but a set: a cone around the normal with half-angle \(\arctan\mu\). A resting body needs the surface to provide "just enough" force; if that demand falls inside the cone, the contact sticks, and if it falls outside, the contact slips. The ramp's critical angle \(\arctan\mu\) is the half-angle of the cone: the opposite of gravity just grazes the edge of the cone.
3动手玩:拖动接触力,看摩擦锥Play: drag the contact force and meet the friction cone
把斜面拿掉,只留一个接触点:地面在下,法线 \(\hat{\mathbf n}\) 朝上。琥珀色手柄是接触点必须提供的力 \(\mathbf f=(f_t,f_n)\),也就是让物体保持不动、其余所有外力的相反数。你来拖,接触面来回答:
- \(f_n<0\):接触面必须拉物体,办不到,物体会分离(离地)。
- \(f_n>0\) 且 \(|f_t|\le\mu f_n\):力在锥内,接触黏着,摩擦力等于需求。
- \(f_n>0\) 且 \(|f_t|>\mu f_n\):力在锥外,接触打滑。接触面只能给出锥边界上的力 \((\pm\mu f_n,\,f_n)\),差额(红色箭头)成为不平衡力,推着物体滑动。
注意锥的半角是 \(\arctan\mu\),不是 \(\mu\):\(\mu=1\) 对应 45°,\(\mu=0.5\) 对应 26.6°,\(\mu\) 大于 1 也完全合理(橡胶对粗糙地面),锥只是更宽,但半角始终小于 90°。
Take the ramp away and keep a single contact point: the floor is below and the normal \(\hat{\mathbf n}\) points up. The amber handle is the force the contact must supply, \(\mathbf f=(f_t,f_n)\), i.e. whatever keeps the body still, the negative of all other forces on it. You drag, and the surface answers:
- \(f_n<0\): the surface would have to pull the body, which it cannot; the body separates (leaves the floor).
- \(f_n>0\) and \(|f_t|\le\mu f_n\): the force is inside the cone, the contact sticks, and friction equals the demand.
- \(f_n>0\) and \(|f_t|>\mu f_n\): the force is outside the cone, the contact slips. The surface can only give the force on the cone boundary \((\pm\mu f_n,\,f_n)\), and the shortfall (red arrow) becomes an unbalanced force that makes the body slide.
Note that the half-angle of the cone is \(\arctan\mu\), not \(\mu\): \(\mu=1\) is 45°, \(\mu=0.5\) is 26.6°, and \(\mu>1\) is perfectly reasonable (rubber on a rough floor); the cone is just wider, but its half-angle always stays below 90°.
- 依次让接触处于黏着、打滑、分离三种状态。Put the contact into each of the three states in turn: stick, slip, separate.
- 把 \(\mu\) 调到 1.5 以上,让力偏离法线超过 50° 仍然黏着。半角是 \(1.5\) 弧度吗?Raise \(\mu\) above 1.5 and make the force deviate more than 50° from the normal while still sticking. Is the half-angle 1.5 radians?
把接触力与法线的夹角记为 \(\psi=\arctan(|f_t|/f_n)\),摩擦锥的半角叫摩擦角 \(\gamma=\arctan\mu\)。“黏着”等价于 \(\psi\le\gamma\)。这个说法把摩擦的大小之比(\(|f_t|/f_n\le\mu\))换成了一个角度的比较:接触力的方向只要不偏离法线太多,接触就是稳的。足式机器人的“防滑”、抓取的“握力够不够”,都是这个角度的比较。
Call the angle between the contact force and the normal \(\psi=\arctan(|f_t|/f_n)\); the half-angle of the cone is the friction angle \(\gamma=\arctan\mu\). "Sticking" is equivalent to \(\psi\le\gamma\). This turns a ratio of magnitudes (\(|f_t|/f_n\le\mu\)) into a comparison of angles: as long as the contact force does not lean too far from the normal, the contact is stable. A legged robot's "no slipping" and a grasp's "is the squeeze enough" are both this angle comparison.
4第二、第三视角:三维金字塔与非光滑的接触Second and third views: the 3D pyramid and non-smooth contact
三维:圆锥与求解器里的金字塔In 3D: the round cone and the pyramid inside solvers
三维接触点有两个切向方向,摩擦锥是圆锥 \(\|\mathbf f_t\|\le\mu f_n\),\(\mathbf f_t\in\mathbb R^2\)。圆锥是二阶锥,不能直接放进线性互补问题(LCP)或线性规划(6.8 节)。常见做法是用一个有 \(k\) 条棱的多面体金字塔去逼近它,使摩擦约束变成线性不等式:\(\mathbf f_t=\sum_i\beta_i\mathbf d_i\),\(\beta_i\ge0\),\(\sum_i\beta_i\le\mu f_n\),其中 \(\mathbf d_i\) 是 \(k\) 个单位切向方向。有两种逼近:
- 内接(紫色,棱在锥面上):金字塔在圆锥里面,是保守的。能证明防滑的力,真实情况下一定不滑;但它低估了摩擦。
- 外切(琥珀色,面与锥相切):金字塔包住圆锥,是乐观的。\(k=4\) 时就是熟悉的方盒 \(|f_x|\le\mu f_n,\ |f_y|\le\mu f_n\),沿对角线方向多给了 \(\sqrt2-1\approx41\%\) 的摩擦。
以 \(f_n=1\) 的截面看,圆的半径是 \(\mu\);正 \(k\) 边形内接时,最短的半径是 \(\mu\cos(\pi/k)\),外切时最长的半径是 \(\mu/\cos(\pi/k)\)。所以最坏误差分别是 \(1-\cos(\pi/k)\) 与 \(1/\cos(\pi/k)-1\)。拖动 \(k\),看误差怎样随棱数迅速缩小。
A 3D contact point has two tangential directions, and the friction cone is a round cone \(\|\mathbf f_t\|\le\mu f_n\) with \(\mathbf f_t\in\mathbb R^2\). A round cone is a second-order cone, which cannot go directly into a linear complementarity problem (LCP) or a linear program (Lesson 6.8). The usual fix is to approximate it by a polyhedral pyramid with \(k\) edges, so that friction becomes linear inequalities: \(\mathbf f_t=\sum_i\beta_i\mathbf d_i\), \(\beta_i\ge0\), \(\sum_i\beta_i\le\mu f_n\), where the \(\mathbf d_i\) are \(k\) unit tangent directions. There are two ways to approximate:
- Inscribed (purple, edges on the cone surface): the pyramid sits inside the round cone and is conservative. A force proven not to slip really does not slip, but friction is underestimated.
- Circumscribed (amber, faces tangent to the cone): the pyramid wraps the round cone and is optimistic. For \(k=4\) it is the familiar box \(|f_x|\le\mu f_n,\ |f_y|\le\mu f_n\), which grants an extra \(\sqrt2-1\approx41\%\) of friction along the diagonal.
In the cross-section \(f_n=1\) the circle has radius \(\mu\); an inscribed regular \(k\)-gon has shortest radius \(\mu\cos(\pi/k)\), and a circumscribed one has longest radius \(\mu/\cos(\pi/k)\). The worst-case errors are therefore \(1-\cos(\pi/k)\) and \(1/\cos(\pi/k)-1\). Drag \(k\) and watch how fast the errors shrink with the number of edges.
- 找出让两种逼近的最坏误差都低于 5% 的最小棱数 \(k\)。Find the smallest number of edges \(k\) for which both approximations have worst-case error below 5%.
非光滑:接触力是“开关”,不是弹簧Non-smooth: contact force is a switch, not a spring
现在看法向。小球落到地上,间隙 \(\phi\ge0\)(球离地面的距离),法向力 \(\lambda\ge0\)。要么分离(\(\phi>0,\ \lambda=0\)),要么接触(\(\phi=0,\ \lambda\ge0\)),两者不会同时为正,写成互补条件:
Now the normal direction. A ball falls to the floor, with gap \(\phi\ge0\) (the distance from ball to floor) and normal force \(\lambda\ge0\). Either they are apart (\(\phi>0,\ \lambda=0\)) or in contact (\(\phi=0,\ \lambda\ge0\)); the two are never both positive. This is the complementarity condition:
在 \((\phi,\lambda)\) 平面上,它是一条直角折线:沿 \(\phi\) 轴(没接触,力为零)和沿 \(\lambda\) 轴(接触,力任意)。折线在拐角处不可导,而且 \(\lambda\) 不是 \(\phi\) 的函数(\(\phi=0\) 时 \(\lambda\) 可以是任意正数)。这就是“刚体接触”的数学含义。要在计算机里处理它,常见有两条路。惩罚法:允许穿透 \(\delta=\max(0,-\phi)\),用弹簧-阻尼 \(\lambda=k\delta+c\dot\delta\) 把折线“压弯”成一条陡峭的斜线,简单,但 \(k\) 越大系统越硬,显式积分的步长就必须越小。冲量法:不模拟接触期间的力,在碰撞时刻直接把法向速度改成 \(\dot\phi^+=-e\dot\phi^-\)(\(e\) 是恢复系数),并把物体放回接触面上,步长不受刚度限制,但要处理一连串的碰撞事件(弹跳次数无穷多,有限时间内停下,叫 Zeno 现象)。
下图让你同时看这两个模型。左边是小球的高度(上)和穿透深度(下,毫米);右边是互补折线,圆点是模拟中每一步的 \((\phi,\lambda)\)。
In the \((\phi,\lambda)\) plane this is a right-angle corner: along the \(\phi\)-axis (no contact, zero force) and along the \(\lambda\)-axis (contact, any force). The corner is not differentiable, and \(\lambda\) is not a function of \(\phi\) (at \(\phi=0\) the force can be any positive number). This is what "rigid contact" means mathematically. A computer has two common ways to handle it. Penalty: allow penetration \(\delta=\max(0,-\phi)\) and use a spring-damper \(\lambda=k\delta+c\dot\delta\) to "bend" the corner into a steep slope; simple, but the larger \(k\) the stiffer the system, and explicit integration then demands a smaller time step. Impulse: do not simulate the force during contact; at the impact instant simply set the normal velocity to \(\dot\phi^+=-e\dot\phi^-\) (\(e\) is the coefficient of restitution) and put the body back on the surface. The step is not limited by stiffness, but one must handle a chain of impact events (infinitely many bounces that stop in finite time, called Zeno behaviour).
The figure below shows both models side by side. On the left are the ball height (top) and the penetration depth (bottom, in millimetres); on the right is the complementarity corner, with a dot for the \((\phi,\lambda)\) of every simulation step.
- 用惩罚法,把步长调大,让模拟炸掉:小球弹得比起始高度还高(能量凭空增加)。读数里的 \(\omega\,\Delta t\) 是多少时开始发生?With the penalty model, raise the time step until the simulation blows up: the ball bounces higher than where it started (energy created from nothing). At what value of \(\omega\,\Delta t\) does it begin?
- 仍用惩罚法,在保持稳定(\(\omega\Delta t<0.5\))的前提下,让最大穿透小于 2 mm。代价是什么?(看 \(k\) 与步数。)Still with the penalty model, keep it stable (\(\omega\Delta t<0.5\)) while making the maximum penetration below 2 mm. What does it cost? (Look at \(k\) and the number of steps.)
- 切换到冲量法,把恢复系数 \(e\) 调到 0.8 以上:小球弹跳无穷多次,却在有限时间内停住。读数里预测的静止时刻与模拟吻合吗?Switch to the impulse model and raise the restitution \(e\) to 0.8 or more: the ball bounces infinitely often yet stops in finite time. Does the predicted rest time in the readout match the simulation?
几何:接触力活在一个锥里,\(\mathbf f\in K_\mu\)(FIG 1–3)。互补:每个接触在“分离/黏着/滑动”几种模式里选一种,力与间隙(或滑动速度)满足 \(0\le a\perp b\ge0\)(FIG 4)。优化:这些条件正是某个凸优化问题的 KKT 条件(6.7 节),锥是它的可行集,\(\lambda\) 是拉格朗日乘子。三个视角说的是同一件事,不同的接触模型和求解器,只是选了其中一条路来算。
Geometry: the contact force lives in a cone, \(\mathbf f\in K_\mu\) (FIG 1–3). Complementarity: each contact picks one of several modes, "separate / stick / slide", with force and gap (or slip speed) satisfying \(0\le a\perp b\ge0\) (FIG 4). Optimization: these conditions are exactly the KKT conditions of a convex optimization problem (Lesson 6.7), the cone is its feasible set and \(\lambda\) a Lagrange multiplier. The three views say the same thing; different contact models and solvers simply choose one road to compute it.
5再看数学The math
提示:把鼠标悬停在公式中带底色的符号上,FIG 2 中对应的元素会被高亮。Tip: hover the highlighted symbols in the formulas; the matching element in FIG 2 lights up.
库仑摩擦与摩擦锥Coulomb friction and the friction cone
设接触点的法线 \(\hat{\mathbf n}\) 从表面指向物体,接触力分解为 \(\mathbf f=f_n\hat{\mathbf n}+\mathbf f_t\)(作用在物体上)。库仑定律(Amontons–Coulomb)有两种情形,\(\mathbf v_t\) 是接触点的相对切向速度:
Let the contact normal \(\hat{\mathbf n}\) point from the surface into the body and split the contact force (acting on the body) as \(\mathbf f=f_n\hat{\mathbf n}+\mathbf f_t\). Coulomb's law (Amontons–Coulomb) has two cases, with \(\mathbf v_t\) the relative tangential velocity of the contact point:
滑动时摩擦力大小为 \(\mu_k f_n\),与速度大小无关,方向与滑动方向相反。一般 \(\mu_k\le\mu_s\);仿真器常常取 \(\mu_k=\mu_s=\mu\),下面都这样写。黏着时的摩擦力是未知数,由其他力决定,只受不等式约束。两条合起来是一个集值关系 \(\mathbf f_t\in-\mu f_n\,\mathrm{Sgn}(\mathbf v_t)\),在 \(\mathbf v_t=\mathbf 0\) 处 \(\mathrm{Sgn}\) 取整个单位球。摩擦锥就是黏着条件的集合:
While slipping, the friction magnitude is \(\mu_k f_n\), independent of speed, directed opposite to the sliding. Usually \(\mu_k\le\mu_s\); simulators often take \(\mu_k=\mu_s=\mu\), as we do below. During sticking the friction force is an unknown fixed by the other forces and only constrained by the inequality. Together they form a set-valued relation \(\mathbf f_t\in-\mu f_n\,\mathrm{Sgn}(\mathbf v_t)\), where at \(\mathbf v_t=\mathbf 0\) the \(\mathrm{Sgn}\) takes the whole unit ball. The friction cone is the set of sticking conditions:
在三维中 \(\mathbf f_t\in\mathbb R^2\),\(K_\mu\) 是二阶锥(Lorentz 锥的缩放),是凸锥。回到斜面:物体静止要求 \(mg\sin\alpha\le\mu\,mg\cos\alpha\),即 \(\alpha\le\gamma\)。带推力 \(F\)(FIG 1)时,只要把法向与切向的平衡改写,黏着条件就是 \(|F\cos\beta-mg\sin\alpha|\le\mu\,(mg\cos\alpha-F\sin\beta)\),且 \(mg\cos\alpha-F\sin\beta>0\)(否则离开表面)。
In 3D \(\mathbf f_t\in\mathbb R^2\), and \(K_\mu\) is a second-order cone (a scaled Lorentz cone), a convex cone. Back on the ramp: staying at rest requires \(mg\sin\alpha\le\mu\,mg\cos\alpha\), i.e. \(\alpha\le\gamma\). With the push \(F\) of FIG 1, rewriting the normal and tangential balances gives the sticking condition \(|F\cos\beta-mg\sin\alpha|\le\mu\,(mg\cos\alpha-F\sin\beta)\) together with \(mg\cos\alpha-F\sin\beta>0\) (otherwise the block leaves the surface).
单边约束、互补与刚体接触的动力学Unilateral constraints, complementarity and rigid-contact dynamics
设 \(\phi(\mathbf q)\) 是第 \(c\) 个接触的间隙函数(有符号距离),\(J_n=\partial\phi/\partial\mathbf q\) 是法向的接触雅可比。接触点速度与关节速度的关系是 \(\mathbf v_c=J_c\dot{\mathbf q}\)(3.4 节雅可比的同一个思想,只是这里取的是接触点),\(J_c=[J_n;\,J_t]\)。把接触力当成未知的“约束力”加进 8.1 节的方程,得到接触隐式的操作臂方程:
Let \(\phi(\mathbf q)\) be the gap function (signed distance) of contact \(c\) and \(J_n=\partial\phi/\partial\mathbf q\) the normal contact Jacobian. The contact-point velocity relates to joint velocity by \(\mathbf v_c=J_c\dot{\mathbf q}\) (the Jacobian idea of Lesson 3.4, evaluated at the contact point), with \(J_c=[J_n;\,J_t]\). Adding the contact forces as unknown "constraint forces" to the equation of Lesson 8.1 gives the contact-implicit manipulator equation:
\(\mathbf b=C\dot{\mathbf q}+\mathbf g\) 是 8.3 节的偏置项,\(S\) 是驱动选择矩阵(浮动基机器人只有部分自由度有电机)。互补条件正是约束优化 \(\min\,\text{能量}\ \text{s.t.}\ \phi(\mathbf q)\ge0\) 的 KKT 条件(6.7 节):\(\lambda_n\) 是不等式约束的乘子,\(\lambda_n\phi=0\) 是互补松弛。未知数是 \(\ddot{\mathbf q}\) 与所有 \(\boldsymbol\lambda_c\),方程里有不等式,所以每一步要解的不是线性方程组,而是一个互补问题。碰撞(\(\phi=0\) 且 \(\dot\phi<0\))还要加一条速度跳变的规律,牛顿恢复律 \(\dot\phi^+=-e\,\dot\phi^-\)。
\(\mathbf b=C\dot{\mathbf q}+\mathbf g\) is the bias term of Lesson 8.3 and \(S\) the actuation selection matrix (a floating-base robot has motors on only some of its degrees of freedom). The complementarity condition is exactly the KKT condition of the constrained problem \(\min\,\text{energy}\ \text{s.t.}\ \phi(\mathbf q)\ge0\) (Lesson 6.7): \(\lambda_n\) is the multiplier of the inequality and \(\lambda_n\phi=0\) is complementary slackness. The unknowns are \(\ddot{\mathbf q}\) and all the \(\boldsymbol\lambda_c\); because the equations contain inequalities, each step solves not a linear system but a complementarity problem. An impact (\(\phi=0\) and \(\dot\phi<0\)) also needs a velocity-jump law, Newton's restitution law \(\dot\phi^+=-e\,\dot\phi^-\).
时间步进的 LCP(Stewart–Trinkle)The time-stepping LCP (Stewart–Trinkle)
处理碰撞有两条路。事件驱动:用 ODE 积分到碰撞或模式切换的时刻,在那里处理跳变,再继续;精确,但事件很多(Zeno、多点接触)时会卡死。时间步进(Moreau;Stewart–Trinkle 1996):不找事件,每个小步 \(\Delta t\) 在速度层面解一次互补问题,把冲量 \(\mathbf c=\Delta t\,\boldsymbol\lambda\) 当未知数。取摩擦锥的 \(k\) 棱金字塔,\(J_d\) 的每一行是接触点速度沿第 \(i\) 个切向 \(\mathbf d_i\) 的分量,\(\boldsymbol\beta\ge0\) 是各棱上的冲量,\(\sigma\ge0\) 是滑动速度:
There are two ways to handle impacts. Event-driven: integrate the ODE up to the moment of an impact or mode switch, handle the jump there, then continue; precise, but it stalls when events pile up (Zeno behaviour, multiple contacts). Time-stepping (Moreau; Stewart–Trinkle 1996): do not look for events; in each small step \(\Delta t\), solve one complementarity problem at the velocity level, with the impulses \(\mathbf c=\Delta t\,\boldsymbol\lambda\) as unknowns. Take a \(k\)-edge pyramid for the friction cone: each row of \(J_d\) is the contact-point velocity component along the \(i\)-th tangent \(\mathbf d_i\), \(\boldsymbol\beta\ge0\) are the impulses along the edges and \(\sigma\ge0\) is the slip speed:
第二行是线性化的不穿透条件;第三、四行是“最大耗散原理”:摩擦冲量在满足 \(\mathbf 1^\top\boldsymbol\beta\le\mu c_n\) 的前提下,尽量减慢接触点的滑动,滑动速度 \(\sigma\) 只在锥的边界上才可以不为 0。消去 \(\mathbf v^{+}\) 后,这是一个标准的线性互补问题(LCP)。Stewart 与 Trinkle 提出了这类格式;Anitescu 与 Potra(1997)给出了一个与之密切相关的写法,并证明在金字塔摩擦下它总有解(Lemke 算法能求出),这对仿真器的鲁棒性至关重要。该问题的另一种写法是二次规划(QP):把乘子视为变量,在锥的约束下最小化“能量”,这就是 MuJoCo 等求解器所用的凸形式。
The second line is the linearized non-penetration condition; lines three and four are the "maximum dissipation principle": subject to \(\mathbf 1^\top\boldsymbol\beta\le\mu c_n\), the friction impulses slow the contact-point slip as much as they can, and the slip speed \(\sigma\) can be non-zero only on the boundary of the cone. Eliminating \(\mathbf v^{+}\) gives a standard linear complementarity problem (LCP). Stewart and Trinkle proposed this kind of scheme; Anitescu and Potra (1997) gave a closely related formulation and proved that with pyramid friction it always has a solution (Lemke's algorithm finds it), which matters a great deal for the robustness of a simulator. The problem can also be written as a quadratic program (QP): treat the multipliers as variables and minimize an "energy" subject to the cone constraints, which is the convex formulation that solvers such as MuJoCo's use.
软接触:惩罚法的稳定性与 MuJoCo 的凸模型Soft contact: stability of penalty and MuJoCo's convex model
惩罚法把接触当成一个很硬的弹簧-阻尼:质量 \(m\) 的小球,\(m\ddot x=-mg+k\delta+c\dot\delta\)(接触期间)。这是一个二阶线性系统,固有频率 \(\omega=\sqrt{k/m}\),阻尼比 \(\zeta=c/(2\sqrt{km})\)。后面三个结论都能在 FIG 4 里验证:
Penalty contact treats the contact as a very stiff spring-damper: a ball of mass \(m\) obeys \(m\ddot x=-mg+k\delta+c\dot\delta\) during contact. This is a linear second-order system with natural frequency \(\omega=\sqrt{k/m}\) and damping ratio \(\zeta=c/(2\sqrt{km})\). The next three facts can all be checked in FIG 4:
要让穿透小,必须让 \(k\) 大;\(k\) 大则 \(\omega\) 大,显式积分的步长上限 \(\Delta t<2/\omega=2\sqrt{m/k}\) 就小:刚度每增大 100 倍,步长要缩小 10 倍,计算量涨 10 倍。刚度与步长就这样互相拉扯。MuJoCo 走了另一条路(Todorov 2014):每一步把接触力作为凸优化问题的解,在摩擦锥约束下最小化一个带正则化的二次代价(衡量约束空间加速度偏离参考值的程度),正则化让约束有一定柔软度(solref/solimp 调节),同时保证解唯一、可微分求逆。它既不是严格的刚性接触,也不是传统的惩罚法:没有一个必须用极小步长去积分的僵硬 ODE。
Small penetration needs a large \(k\); a large \(k\) means a large \(\omega\), so the step limit of explicit integration, \(\Delta t<2/\omega=2\sqrt{m/k}\), becomes small: every 100-fold increase in stiffness shrinks the step by 10 and raises the cost 10-fold. Stiffness and step size pull against each other. MuJoCo takes another road (Todorov 2014): each step computes the contact force as the solution of a convex optimization problem, minimizing a regularized quadratic cost (how far the constraint-space accelerations deviate from their reference values) under the friction-cone constraints; the regularization gives the constraint some softness (tuned with solref/solimp) and makes the solution unique and analytically invertible. It is neither strictly rigid contact nor classic penalty: there is no stiff ODE that must be integrated with a tiny step.
刚体加库仑摩擦并不总是自洽。1895 年 Painlevé 指出:一根细杆在粗糙表面上滑动,当 \(\mu\) 足够大、杆与表面夹角足够小时,加速度层面的方程可能无解(相容性被破坏)或有多解(不确定性):摩擦力通过转动耦合,使维持接触所需的法向力变成负值或无界,物体似乎要自己跳起来。时间步进的冲量格式总有解(上面的 Anitescu–Potra),但解的物理含义取决于冲击是否被允许。实践中这意味着:高摩擦系数、细长物体、近乎平行的接触,是仿真行为最不可信的地方。
Rigid bodies plus Coulomb friction are not always self-consistent. In 1895 Painlevé pointed out that for a slender rod sliding on a rough surface, when \(\mu\) is large enough and the rod is close enough to the surface, the acceleration-level equations may have no solution (consistency fails) or several (indeterminacy): friction couples through the rotation so that the normal force needed to keep contact becomes negative or unbounded, as if the body wanted to jump by itself. The impulse-based time-stepping scheme always has a solution (Anitescu–Potra above), but the physical meaning of that solution depends on whether impacts are allowed. In practice it means that high friction, slender bodies and nearly parallel contacts are where simulated behaviour is least trustworthy.
6机器人中的它:手指压桌子,锥与力矩上限的交集In robotics: a finger pressing on a table, where the cone meets the torque limits
一个两连杆的机械臂用指尖压在桌面上。接触点就是指尖,接触雅可比 \(J_c\) 就是指尖位置的雅可比(3.4 节的 \(J\))。桌子对指尖的力 \(\mathbf f_c=(f_t,f_n)\) 必须同时满足两个条件:
- 接触允许:\(f_n\ge0\) 且 \(|f_t|\le\mu f_n\),即落在摩擦锥里(FIG 2)。
- 电机做得到:缓慢(准静态)并且重力已补偿时,8.3 节的方程加上接触项 \(M\ddot{\mathbf q}+\mathbf b=\boldsymbol\tau+J_c^\top\mathbf f_c\) 退化成 \(\mathbf 0=\boldsymbol\tau+J_c^\top\mathbf f_c\),所以电机力矩是 \(\boldsymbol\tau=-J_c^\top\mathbf f_c\)(手指对桌子的力是 \(\mathbf F=-\mathbf f_c\),就是 3.4 节的 \(\boldsymbol\tau=J^\top\mathbf F\))。每个关节要满足 \(|\tau_i|\le\tau_{\max}\)。
两个条件都是 \(\mathbf f_c\) 的线性不等式,所以可行的接触力是一个凸多边形:锥与力矩上限形成的平行四边形的交集。右图画的就是这个力空间。手指能用多大的力压桌子,就是在这个多边形上求 \(\max f_n\),这是一个线性规划(6.8 节),解在多边形的顶点上。拖动指尖的位置、切换肘的方向,看这个多边形怎样随姿态变化:当前臂的最后一节对准了力的方向时,肘关节几乎不用出力,同样的力矩就能压得更重。
A two-link arm presses its fingertip on a table. The contact point is the fingertip, and the contact Jacobian \(J_c\) is simply the fingertip-position Jacobian (the \(J\) of Lesson 3.4). The table's force on the fingertip, \(\mathbf f_c=(f_t,f_n)\), must satisfy two things at once:
- The contact allows it: \(f_n\ge0\) and \(|f_t|\le\mu f_n\), i.e. it lies in the friction cone (FIG 2).
- The motors can produce it: when moving slowly (quasi-statically) with gravity compensated, the equation of Lesson 8.3 plus the contact term, \(M\ddot{\mathbf q}+\mathbf b=\boldsymbol\tau+J_c^\top\mathbf f_c\), reduces to \(\mathbf 0=\boldsymbol\tau+J_c^\top\mathbf f_c\), so the motor torques are \(\boldsymbol\tau=-J_c^\top\mathbf f_c\) (the finger pushes on the table with \(\mathbf F=-\mathbf f_c\), which is \(\boldsymbol\tau=J^\top\mathbf F\) of Lesson 3.4). Each joint must satisfy \(|\tau_i|\le\tau_{\max}\).
Both conditions are linear inequalities in \(\mathbf f_c\), so the feasible contact forces form a convex polygon: the intersection of the cone with the parallelogram cut by the torque limits. The right panel draws exactly this force space. How hard the finger can press on the table is \(\max f_n\) over this polygon, a linear program (Lesson 6.8) whose solution sits at a vertex. Drag the fingertip and flip the elbow to watch the polygon change with posture: when the last link points along the force, the elbow joint hardly has to work, and the same torque presses much harder.
- 把 \(\mathbf f_c\) 拖出摩擦锥(保持 \(f_n>0.5\) N):这时是桌面“给不出”这个力,与电机无关。Drag \(\mathbf f_c\) out of the friction cone (keeping \(f_n>0.5\) N): now it is the table that "cannot give" this force, whatever the motors do.
- 让 \(\mathbf f_c\) 留在锥里,却因为电机力矩不够而不可行:状态读数应显示哪一个关节超限。Keep \(\mathbf f_c\) inside the cone yet make it infeasible because the motors are too weak: the status readout should name the joint over its limit.
- 调整指尖位置与肘的方向,让“竖直向下压”的能力超过 2 N 每 N·m 力矩(读数“每 N·m 能压的力”)。提示:让小臂(第二节)接近竖直。Adjust the fingertip position and elbow side until the straight-down pressing capacity exceeds 2 N per N·m (the "force per N·m" readout). Hint: bring the forearm (link 2) close to vertical.
足式机器人(9.2 节):每只脚的地面反力必须在摩擦锥内,且法向力非负;全身控制器把它写成 QP 里的约束,\(\mu\) 取比真实值小的“安全”值。人在平地上行走所需的摩擦系数大约只有 0.2。抓取与灵巧手(9.3 节):每个接触点一个锥,力封闭就是“这些锥里的力能平衡任意外力矩”;多指抓取的力分配也是 LP/QP。推、插、拧:用接触约束做规划,把“接触模式的切换”当作离散变量(接触隐式轨迹优化)。触觉传感:GelSight 一类传感器可以估计法向与切向力,监视 \(|f_t|/f_n\) 是否逼近 \(\mu\),在滑脱之前加大握力。仿真到真实(Part VI):摩擦系数是最常被随机化的物理参数之一,因为 \(\mu\) 取决于表面材质、污染和速度,很难精确测量。
Legged robots (Lesson 9.2): each foot's ground reaction force must stay inside the friction cone with non-negative normal force; whole-body controllers write this as constraints in a QP, using a "safe" \(\mu\) smaller than the real value. Level walking in humans needs a friction coefficient of only about 0.2. Grasping and dexterous hands (Lesson 9.3): each contact point has a cone, and force closure means "forces inside these cones can balance any external wrench"; force distribution among fingers is again an LP/QP. Pushing, inserting, screwing: planning with contact constraints, treating the switching of contact modes as discrete variables (contact-implicit trajectory optimization). Tactile sensing: sensors such as GelSight can estimate normal and shear force, watching whether \(|f_t|/f_n\) approaches \(\mu\) and raising the grip before the object slips. Sim-to-real (Part VI): the friction coefficient is among the most commonly randomized physical parameters, because \(\mu\) depends on surface material, contamination and speed and is hard to measure accurately.
友情提示:典型的摩擦系数Ballpark friction coefficients
下面是教科书里常见的量级,干燥、洁净的表面。同一对材料的实际值随表面粗糙度、污染、湿度、压力和滑动速度变化,可以相差 2 倍以上,使用前应当实测。\(\mu\) 描述的是一对表面,而不是某一个物体。
These are textbook orders of magnitude for dry, clean surfaces. For the same pair of materials the real value changes with roughness, contamination, humidity, pressure and sliding speed, and can differ by a factor of two or more, so measure before relying on it. \(\mu\) describes a pair of surfaces, not a single object.
| 表面对Surface pair | 静摩擦系数 \(\mu_s\) 的大致范围Rough range of \(\mu_s\) |
|---|---|
| 橡胶 对 干燥混凝土/沥青rubber on dry concrete or asphalt | 0.6 – 1.0 (轮胎可超过 1tires can exceed 1) |
| 硅胶/弹性体指垫 对 光滑塑料、玻璃silicone or elastomer finger pad on smooth plastic or glass | 0.7 – 1.5+ (随压力和接触面积变化)(varies with pressure and contact area) |
| 钢 对 钢(干)steel on steel (dry) | 0.5 – 0.8 |
| 钢 对 钢(润滑)steel on steel (oiled) | 0.05 – 0.15 |
| 木 对 木wood on wood | 0.25 – 0.5 |
| 聚四氟乙烯(PTFE)对 钢PTFE (Teflon) on steel | 0.04 – 0.1 |
| 冰 对 冰/钢ice on ice or steel | 0.03 – 0.15 |
主流仿真器怎么处理接触How common simulators handle contact
不同仿真器对同一个场景给出的结果可能明显不同(Erez 等,2015)。下表是各自的主要思路,版本之间细节会变,使用时请查对应文档。
Different simulators can give noticeably different answers for the same scene (Erez et al., 2015). The table lists each one's main idea; details change between versions, so check the documentation of the one you use.
| 仿真器Simulator | 接触模型与摩擦锥Contact model and friction cone |
|---|---|
| MuJoCo / MJX | 软的凸优化接触(Todorov 2014);摩擦锥默认为金字塔,可选椭圆锥;solref/solimp 调节软度;condim 选择是否含扭转与滚动摩擦(默认摩擦参数 1, 0.005, 0.0001)。Soft convex-optimization contact (Todorov 2014); the friction cone is pyramidal by default with an elliptic option; solref/solimp tune softness; condim selects whether torsional and rolling friction are included (default friction parameters 1, 0.005, 0.0001). |
| Bullet / PyBullet | 刚体接触,顺序冲量(投影 Gauss–Seidel 型 LCP 迭代);摩擦沿两个切向,各自以法向冲量乘 \(\mu\) 为界。Rigid contact with sequential impulses (a projected Gauss–Seidel LCP iteration); friction along two tangents, each bounded by \(\mu\) times the normal impulse. |
| PhysX / Isaac Sim / Isaac Gym | GPU 上的迭代求解器(PGS/TGS),两种材料的摩擦系数按规则合并;高度并行,适合强化学习大批量仿真。Iterative solvers (PGS/TGS) on the GPU, with the two materials' friction coefficients combined by a rule; massively parallel, good for large-batch reinforcement learning. |
| Drake | 柔顺接触(点接触或水弹性接触)加凸的时间步进求解器;摩擦用“黏着容差”正则化。Compliant contact (point or hydroelastic) with a convex time-stepping solver; friction regularized by a "stiction tolerance". |
| ODE | LCP 型求解器;摩擦沿两个切向分别限幅,具体是固定的力上限还是按法向力缩放的方盒金字塔,取决于接触标志,请查所用版本的文档。LCP-type solver; friction is limited separately along two tangents, either as a fixed force bound or as a box pyramid scaled by the normal force depending on the contact flags; check the documentation of the version you use. |
7常见误区Common pitfalls
\(\mu_s N\) 只是静摩擦的上限。黏着时摩擦力是“刚好够用”的那个值(FIG 1 里平放时摩擦力是 0,抬到 20° 才是 \(mg\sin20^\circ\)),可以远小于上限。只有真的在滑动时,摩擦才等于 \(\mu_k N\),而且 \(\mu_k\) 通常略小于 \(\mu_s\),所以一旦滑起来,方块还会加速。如果你的控制器假定“摩擦力 = \(\mu N\)”去做前馈,就会在静止的物体上凭空算出一个力。
\(\mu_s N\) is only the ceiling of static friction. While sticking, friction is whatever is "just enough" (in FIG 1 it is 0 when the plank is flat and \(mg\sin20^\circ\) at 20°), and may be far below the ceiling. Friction equals \(\mu_k N\) only while really sliding, and \(\mu_k\) is usually a little smaller than \(\mu_s\), so once the block starts to slide it also accelerates. A controller that feed-forwards "friction = \(\mu N\)" invents a force on a body that is at rest.
摩擦力是切向的,它不能提供让物体靠近表面的力;法向力 \(\lambda_n\ge0\)。FIG 2 里手柄拖到地面以下,接触就分离了:锥只有一个朝上的半边。QP 里如果忘了写 \(f_n\ge0\),求出来的接触力可能会“吸住”地面。真实世界也有例外:吸盘、壁虎式干黏附、静电吸附和磁力,它们在法向上有一个额外的吸力,不再属于普通的库仑接触。
Friction is tangential and cannot pull the body toward the surface; the normal force obeys \(\lambda_n\ge0\). In FIG 2, dragging the handle below the floor separates the contact: the cone has only an upward half. A QP that forgets \(f_n\ge0\) may return contact forces that "suck" onto the floor. The real world has exceptions (suction cups, gecko-style dry adhesion, electroadhesion, magnets), which add an extra attractive normal force and are no longer plain Coulomb contacts.
粘性摩擦 \(f=-bv\) 是光滑的,速度越大摩擦越大,速度为零时摩擦为零,直接塞进 ODE 就行。库仑摩擦的大小与速度无关,且在 \(v=0\) 处是集值的(FIG 2 里的整段锥)。为了让 ODE 求解器接受它,常见做法是用 \(\tanh(v/v_s)\) 之类的光滑函数代替符号函数,但这样机器人在“应该黏着”的时候会缓慢蠕滑(creep),并且 \(v_s\) 越小系统越僵硬。真实表面的摩擦还会随速度变化(Stribeck 效应)和随接触时间变化,库仑定律只是一个有用的近似。
Viscous friction \(f=-bv\) is smooth: friction grows with speed and vanishes at rest, so it drops straight into an ODE. Coulomb friction has a magnitude independent of speed and is set-valued at \(v=0\) (the whole span of the cone in FIG 2). To make an ODE solver accept it, a common trick is to replace the sign function with a smooth one such as \(\tanh(v/v_s)\), but then a robot that should be sticking slowly creeps, and the smaller \(v_s\) the stiffer the system. Real surfaces also change friction with speed (the Stribeck effect) and contact time, so Coulomb's law is a useful approximation, nothing more.
刚性接触的力是状态的非光滑(甚至不连续、集值)函数:物体没碰到地面时,对接触位置的梯度处处为零;碰到的那一瞬间力从 0 跳到很大。把仿真器当作可微函数、直接对轨迹或策略求梯度,得到的梯度要么是 0(看不到将要发生的接触),要么极大、方差很大(Suh 等 2022)。常见的补救办法是平滑接触(软化互补条件)、改用不依赖梯度的采样优化(6.11 节)、或者把接触模式当作离散变量一起优化。选哪一种取决于任务,没有免费午餐。
The force of rigid contact is a non-smooth (even discontinuous or set-valued) function of the state: before a body touches the floor the gradient with respect to the contact position is zero everywhere, and at the instant of touch the force jumps from 0 to something large. Treating a simulator as a differentiable function and taking gradients of a trajectory or policy therefore gives gradients that are either 0 (blind to the contact about to happen) or huge and high-variance (Suh et al. 2022). Usual remedies: smooth the contact (soften the complementarity), switch to gradient-free sampling-based optimization (Lesson 6.11), or optimize the contact modes as discrete variables. Which one to pick depends on the task; there is no free lunch.
FIG 4 显示,惩罚接触的刚度和步长必须配套:\(\omega\Delta t\ge2\) 时能量凭空增长,仿真爆炸;即使没爆炸,大步长也会让接触力在 \(\omega\Delta t\sim1\) 附近抖动、看起来“能用”但已经失真。降低刚度会允许更大的穿透,物体“陷进”地面。另外,点接触的库仑模型只有切向的滑动摩擦。真实的接触面还有扭转摩擦(绕法线转)与滚动摩擦(球、轮子滚动时的阻力),忽略它们会让物体在地面上永远转下去或滚下去,MuJoCo 的默认摩擦参数里就有这两项(0.005 和 0.0001)。
FIG 4 shows that a penalty contact's stiffness and step size must be matched: at \(\omega\Delta t\ge2\) energy is created from nothing and the simulation explodes; even without exploding, a large step makes the contact force jitter around \(\omega\Delta t\sim1\), which looks "usable" but is already distorted. Lowering the stiffness permits more penetration, and bodies "sink" into the floor. Moreover, the point-contact Coulomb model has only tangential sliding friction. Real contact patches also have torsional friction (about the normal) and rolling friction (the resistance of a ball or wheel that rolls); ignoring them lets a body spin or roll on the floor forever, and MuJoCo's default friction parameters include both (0.005 and 0.0001).
8小练习Check yourself
9延伸阅读Further reading
- K. Lynch & F. Park, Modern Robotics, Ch. 12 — 抓取与操作:接触运动学、接触力与摩擦锥、力封闭Grasping and manipulation: contact kinematics, contact forces and the friction cone, force closure
- M. T. Mason, Mechanics of Robotic Manipulation, MIT Press, 2001 — 推、抓取与摩擦力学的经典教材,包含平面推动与极限曲面The classic text on pushing, grasping and the mechanics of friction, including planar pushing and limit surfaces
- D. E. Stewart & J. C. Trinkle, “An implicit time-stepping scheme for rigid body dynamics with inelastic collisions and Coulomb friction”, Int. J. Numerical Methods in Engineering 39(15), 1996 — 时间步进 LCP 的原始论文The original time-stepping LCP paper
- M. Anitescu & F. A. Potra, “Formulating dynamic multi-rigid-body contact problems with friction as solvable linear complementarity problems”, Nonlinear Dynamics 14, 1997 — 带金字塔摩擦的 LCP 总有解LCPs with pyramid friction are always solvable
- D. E. Stewart, “Rigid-body dynamics with friction and impact”, SIAM Review 42(1), 2000 — 综述:Painlevé 佯谬、事件驱动与时间步进A survey: Painlevé's paradox, event-driven and time-stepping methods
- E. Todorov, “Convex and analytically-invertible dynamics with contacts and constraints: Theory and implementation in MuJoCo”, ICRA 2014 — MuJoCo 软接触模型的理论基础The theory behind MuJoCo's soft contact model
- T. Erez, Y. Tassa & E. Todorov, “Simulation tools for model-based robotics: Comparison of Bullet, Havok, MuJoCo, ODE and PhysX”, ICRA 2015 — 不同仿真器的接触行为对比A comparison of the contact behaviour of several simulators
- H. J. T. Suh, M. Simchowitz, K. Zhang & R. Tedrake, “Do differentiable simulators give better policy gradients?”, ICML 2022 — 接触的非光滑性如何影响梯度How the non-smoothness of contact affects gradients