1. 这不是教科书笔记,是林沛群在实验室白板上擦了七遍才定稿的运动学手稿
你手上如果有一本《机器人学导论》或者翻过Craig那本经典教材,大概率会发现:D-H参数表列得工整漂亮,正向运动学推导像解一道线性代数题,逆解公式写得密密麻麻还带下标i-1和i+1。但当你真把这段代码烧进机械臂控制器、让末端执行器去抓一个30cm外的螺丝时——它要么抖得像帕金森患者,要么直接撞墙,报错“奇异位形”四个字冷冰冰地挂在示教器屏幕上。
林沛群的这份《机器人运动学笔记2》不是课堂讲义,也不是课后习题答案集。它是我在2022年夏天参与某型六轴协作臂国产化替代项目时,在深圳南山一间不足20平米的调试间里,亲眼看着他用马克笔在三块并排白板上反复重写、擦除、再重写的产物。第一块板子写完D-H建模流程,被他一把抹掉:“坐标系原点设在关节轴线上?错。应该设在连杆质心投影点上——否则惯性张量后续根本没法算。”第二块板子推正向运动学,写到T₀⁶ = A₁A₂A₃A₄A₅A₆时停住,转身从工具箱里掏出一把游标卡尺,量了量实机第4轴减速器外壳凸缘厚度,说:“这个A₄矩阵里的d₄,手册标的是85.2mm,实测是84.7±0.15mm。差0.5mm,末端位置误差就超1.2mm——已经超过我们视觉引导抓取的容差阈值。”第三块板子专攻逆运动学,没写公式,只画了六个同心圆环,每个环上标着θ₁到θ₆的可行解区间,旁边一行小字:“工业现场不求全解,只求可执行解;不求最短路径,只求关节速度连续、加速度不过载。”
这本笔记真正的价值,从来不在“它写了什么”,而在于“它删掉了什么”。它删掉了教科书里那些理想化假设——比如忽略连杆柔性、假设关节零间隙、认为电机编码器分辨率无限高;它删掉了学术论文中炫技式的多解筛选算法,换成了产线工人能看懂的“θ₃必须避开±92°,否则第4轴电机温度15分钟内飙到98℃”;它甚至删掉了“D-H参数”这个名词本身,通篇只用“连杆描述表”来指代——因为林沛群说:“工程师不关心Denavit和Hartenberg是谁,只关心这张表填错一个数,整条产线停两小时。”
所以如果你正为ABB IRB1200的TCP标定反复失败发愁,如果你在ROS2里跑MoveIt时发现规划路径总在第五轴附近抖动,如果你手头的松灵Piper机械臂抓杯子时杯底总歪斜3度……别急着查文献,先看看这份笔记里怎么用游标卡尺和示波器代替符号计算软件。
提示:本文所有案例均基于真实产线调试数据,参数单位统一为国际单位制(SI),角度制式明确标注“弧度”或“度”,绝不混用。所有矩阵乘法顺序严格遵循“右乘惯例”(即T₀¹·T₁²·T₂³…),与ROS2 tf2库完全一致,避免因约定差异导致坐标变换错误。
2. D-H参数不是填空游戏,而是连杆物理特性的三维快照
很多人把D-H参数表当成一道填空题:四个参数αᵢ、aᵢ、dᵢ、θᵢ,查手册、抄数据、套公式,最后得到一个4×4齐次变换矩阵。这种做法在仿真环境里或许能跑通,但一旦接入真实硬件,立刻暴露本质问题——D-H参数根本不是数学抽象,而是对物理连杆几何构型与装配状态的精确数字化映射。
林沛群在笔记开篇就划了一条红线:“D-H建模的第一步,永远不是打开SolidWorks,而是拿起游标卡尺、深度规和电子水平仪,站在机械臂面前。”
2.1 四个参数的真实物理对应关系
| 参数 | 物理含义 | 实测工具 | 典型误差源 | 笔记中的处理方式 |
|---|---|---|---|---|
| aᵢ(连杆长度) | 沿xᵢ轴从zᵢ₋₁到zᵢ的距离 | 游标卡尺(精度0.02mm)、激光测距仪(±0.1mm) | 加工公差(如铸件收缩)、装配压紧变形 | 对关键连杆(如大臂)实测3次取均值;对薄壁连杆(如小臂)增加温度补偿项:aᵢ(T) = aᵢ₂₀℃ × [1 + α·(T−20)],α取铝合金23×10⁻⁶/℃ |
| αᵢ(连杆扭角) | 绕xᵢ轴从zᵢ₋₁转到zᵢ的角度 | 电子角度仪(±0.05°)、光学自准直仪(±1″) | 减速器壳体加工偏斜、轴承预紧力不均导致轴线微弯 | 不直接测αᵢ,改测zᵢ₋₁与zᵢ的空间夹角β,再通过β=90°−αᵢ反推;对β>85°的关节(如肩部),强制约束αᵢ∈[−5°,5°]并标记“需返厂校准” |
| dᵢ(连杆偏距) | 沿zᵢ₋₁轴从xᵢ₋₁到xᵢ的距离 | 深度规(±0.01mm)、三坐标测量机(CMM) | 关节密封圈压缩量变化、伺服电机安装法兰平面度超差 | 实测dᵢ时,必须在额定负载(如50%最大扭矩)下进行,记录加载前后dᵢ变化量Δd;若Δd>0.03mm,该关节列为“柔性关节”,后续动力学建模需引入弹簧阻尼模型 |
| θᵢ(关节角) | 绕zᵢ₋₁轴从xᵢ₋₁转到xᵢ的角度 | 编码器原始脉冲值(经零点标定)、高精度电位计(±0.02°) | 编码器零点漂移(温漂)、谐波减速器周期性回差 | θᵢ不取绝对值,而取“相对零位偏移量”:θᵢ = θᵢₘₑₐₛ − θᵢ₀,其中θᵢ₀通过激光跟踪仪在10个空间点标定获得,精度优于0.01° |
注意:林沛群特别强调,dᵢ和θᵢ存在强耦合。例如在库卡KR6 R900的第3轴,当θ₃=0°时,d₃实测为125.3mm;但当θ₃=90°时,因连杆弯曲,d₃变为124.8mm。笔记中为此建立了一个查表函数d₃(θ₃),共128个采样点,存储在控制器Flash中实时调用。
2.2 坐标系原点设置的实战陷阱
教科书总说“将坐标系原点设在关节轴线上”,但林沛群在笔记里用红笔圈出三个致命错误:
错误1:原点设在电机输出轴中心
问题:谐波减速器存在输入轴与输出轴的径向偏移(通常0.05~0.15mm),导致理论坐标系与实际传动轴线错位。
解决方案:原点设在减速器输出法兰中心,并通过激光跟踪仪实测该点与电机编码器零点的空间偏移向量Δp = [δₓ, δ_y, δ_z]ᵀ,将其作为额外的齐次变换Tₚ = Trans(δₓ, δ_y, δ_z)插入到Aᵢ矩阵之前。错误2:忽略连杆质心偏移
问题:轻量化连杆(如碳纤维臂)质心常偏离几何中心达15~30mm,导致动力学模型失准,影响力控精度。
解决方案:在D-H表后追加“质心修正行”,记录每个连杆质心相对于其坐标系原点的偏移量cᵢ = [cₓᵢ, c_yᵢ, c_zᵢ]ᵀ。正向运动学仍按标准D-H计算,但末端位姿Tₑₑ需叠加:Tₑₑ = T₀ⁿ · Trans(cₓₙ, c_yₙ, c_zₙ)。错误3:未考虑装配基准面偏差
问题:机械臂底座安装在铝型材框架上,框架平面度误差可达0.2mm/m,导致整个坐标系发生倾斜。
解决方案:在底座安装面贴四枚高精度倾角传感器(±0.01°),实时读取俯仰角φ和滚转角ψ,构建基座修正矩阵Tᵦₐₛₑ = Rotₓ(φ)·Rot_y(ψ),并在所有运动学计算前左乘Tᵦₐₛₑ。
我亲历过一个案例:某汽车焊装线上的FANUC M-10iA机械臂,按手册D-H参数建模后,TCP重复定位精度仅±0.8mm(要求±0.2mm)。重新按笔记方法实测,发现第2轴底座安装面滚转角ψ=0.17°,导致z₀轴实际倾斜,修正后精度提升至±0.15mm。这0.65mm的差距,就是产线良率从92%跃升到99.7%的关键。
2.3 麦克纳姆轮底盘的D-H建模特殊处理
麦克纳姆轮底盘(如松灵Piper的移动平台)常被误认为“不适合D-H建模”,因其运动是轮速耦合而非关节旋转。林沛群在笔记附录中给出了颠覆性方案:将每个麦克纳姆轮视为一个“虚拟关节”,其“关节变量”是轮速ωᵢ,而“连杆”是轮心到机器人质心的刚性连接。
具体操作:
- 设机器人质心为O,四轮轮心分别为P₁~P₄(按前左、前右、后右、后左顺序)
- 对每个轮i,定义局部坐标系{xᵢ,yᵢ,zᵢ},其中zᵢ垂直于地面,xᵢ沿轮轴方向,yᵢ由右手定则确定
- “连杆参数”取为:aᵢ = |OPᵢ|(质心到轮心距离),αᵢ = 轮安装角(如前左轮为45°),dᵢ = 0(轮心与质心同高),θᵢ = ωᵢ·t(时间积分后的轮转角)
- 则机器人整体位姿T₀ᵇ = ∑ᵢ₌₁⁴ wᵢ·Tᵢᵇ,其中wᵢ为轮速权重系数,Tᵢᵇ为轮i对质心的贡献矩阵
这个模型成功解释了为何Piper底盘在斜向移动时会出现“画弧”现象——并非控制算法缺陷,而是四轮安装角存在±0.3°偏差,导致∑wᵢ·Tᵢᵇ的合成轨迹偏离直线。实测调整安装角后,轨迹直线度从±8mm提升至±0.5mm。
3. 正向运动学:从矩阵乘法到实时性硬约束的工程妥协
正向运动学(Forward Kinematics, FK)的数学表达极其简洁:T₀ⁿ = A₁(θ₁)·A₂(θ₂)·…·Aₙ(θₙ)。但林沛群在笔记中用了整整12页纸,详细记录了如何在200Hz控制周期内,让这段公式在ARM Cortex-A53处理器(主频1.2GHz)上稳定运行——而不仅是MATLAB里跑出一个漂亮结果。
3.1 矩阵乘法的三种实现层级与性能对比
| 实现方式 | 单次计算耗时(μs) | 内存占用 | 适用场景 | 笔记评价 |
|---|---|---|---|---|
| 符号计算(MATLAB/SymPy) | >50000 | >2MB | 离线建模、参数敏感性分析 | “纸上谈兵,无法部署” |
| 通用浮点矩阵库(Eigen/BLAS) | 1850 | 1.2KB | 仿真验证、非实时调试 | “精度够,但周期超标” |
| 手工展开+SIMD优化(笔记推荐) | 210 | 256B | 实时控制、嵌入式部署 | “唯一能落地的方案” |
为什么手工展开如此重要?以六轴机械臂为例,标准Aᵢ矩阵含sin/cos运算各2次,6个矩阵相乘共需12次三角函数调用。而林沛群通过三角恒等式展开T₀⁶,得到一个包含128项的多项式表达式,其中所有sin/cos均以θ₁~θ₆的显式形式出现,完全消除运行时三角函数调用。
他给出的优化技巧:
- 预计算公共子表达式:令s₁=sin(θ₁), c₁=cos(θ₁), s₂=sin(θ₂), c₂=cos(θ₂)…,共12个变量
- 利用对称性合并同类项:T₀⁶的(1,4)元素(x坐标)中,c₁c₂c₃s₄与c₁c₂c₃s₄完全相同,合并系数
- 定点数加速:对sᵢ,cᵢ做Q15格式量化(-1~1映射到-32768~32767),乘法用
__builtin_arm_qmul指令,比浮点乘快3.2倍
实测数据:在树莓派4B上,通用Eigen库计算T₀⁶平均耗时1850μs;手工展开+SIMD优化后降至210μs,满足200Hz控制周期(5000μs/帧)要求,且余量达95.8%。
3.2 实时性保障的三大硬措施
(1)缓存机制:避免重复计算
笔记规定,控制器内存中必须维护两个缓存区:
- 静态缓存:存储当前θᵢ值对应的sᵢ,cᵢ,仅当θᵢ变化超过0.01°时更新
- 动态缓存:存储最近10帧的T₀⁶结果,用于插值计算中间位姿(如轨迹规划需要1000Hz输出,但FK只在200Hz更新)
(2)降阶近似:在精度可接受范围内简化
对第4~6轴(手腕部分),笔记允许使用一阶泰勒展开近似:
T₃⁶ ≈ T₃⁶|θ₄=θ₄₀,θ₅=θ₅₀,θ₆=θ₆₀ + ∂T₃⁶/∂θ₄·Δθ₄ + ∂T₃⁶/∂θ₅·Δθ₅ + ∂T₃⁶/∂θ₆·Δθ₆其中偏导数矩阵∂T₃⁶/∂θⱼ预先计算并固化在ROM中。此举将T₃⁶计算耗时从142μs降至38μs,而末端位姿误差<0.05mm(远低于视觉引导容差0.2mm)。
(3)硬件协同:GPU辅助计算
对于ROS2节点中需高频调用FK的场景(如MoveIt实时碰撞检测),笔记建议将T₀ⁿ计算卸载到Jetson Nano的GPU:
- 使用CUDA C编写矩阵乘法核函数
- 输入:θ₁~θ₆数组(float32×6)
- 输出:T₀ⁿ的12个非冗余元素(float32×12)
- 实测吞吐量:单GPU流处理器每秒可处理24,000次FK计算,延迟<120μs
提示:林沛群强调,“实时性不是目标,而是约束条件”。他曾因过度追求FK速度,牺牲了雅可比矩阵计算精度,导致力控模式下末端力波动超限。最终方案是:FK用210μs,雅可比矩阵用额外350μs,总周期560μs,留出安全余量。
4. 逆向运动学:放弃“解析解幻觉”,拥抱工程可执行解
逆向运动学(Inverse Kinematics, IK)是机器人工程师的分水岭。有人沉迷于推导六轴机械臂的封闭解析解,写出上百行符号运算代码;有人则直接调用数值解法(如Jacobian伪逆),却在产线上遭遇“解震荡”、“关节突变”、“奇异点卡死”三大噩梦。林沛群的笔记彻底抛弃“完美解析解”执念,提出IK的本质是“在约束空间内寻找第一个可用解”,而非“求出所有数学解”。
4.1 六轴机械臂的解析解失效场景实录
笔记中记录了7类导致解析解崩溃的物理现实:
| 场景 | 数学表现 | 物理原因 | 笔记对策 |
|---|---|---|---|
| 关节限位硬冲突 | 解出θ₂=135°,但机械臂实际限位为120° | 减速器内部机械止挡、线缆缠绕半径限制 | 在解析解后增加“限位滤波器”:θᵢ' = clamp(θᵢ, θᵢₘᵢₙ, θᵢₘₐₓ) |
| 编码器量化误差放大 | θ₁计算值1.234567rad,但编码器分辨率为0.001rad | 12位编码器仅4096格,对应0.0015rad/格 | 对θᵢ做“分辨率对齐”:θᵢ' = round(θᵢ / Δθ) × Δθ,Δθ=2π/4096 |
| 连杆热膨胀漂移 | 室温20℃建模,车间实测35℃,a₂膨胀0.023mm | 铝合金连杆热胀系数23×10⁻⁶/℃ | 建立温度补偿表,实时修正D-H参数后再解IK |
| TCP标定残差 | 解出位姿Tₑₑ,但实际TCP位置偏差Δp=[0.3,-0.1,0.2]mm | 末端工具安装偏心、磨损 | 在IK求解前,先应用TCP补偿:Tₑₑ' = Tₑₑ · Trans(−0.3,0.1,−0.2) |
| 奇异位形邻域 | 解出θ₅≈0°,此时雅可比矩阵秩亏缺 | 第5轴接近零位,手腕失去一个自由度 | 强制θ₅∈[±5°, ±175°],若解落入禁区,则启动“扰动重试”:θ₅' = θ₅ + δ,δ∈[−0.1,0.1]rad随机 |
| 多解选择失准 | 解出8组解,选第3组,但实际运行时第2轴电机过热 | 未考虑关节力矩分布,第2组解使τ₂超限 | 增加“力矩代价函数”:cost = ∑ᵢ₌₁⁶ (τᵢ/τᵢₘₐₓ)²,选cost最小解 |
| 视觉反馈延迟 | 相机帧率30Hz,IK计算10ms,但图像采集到处理完成共120ms | 图像传输、特征提取、位姿解算链路延迟 | 引入“预测IK”:Tₑₑₚᵣₑd = Tₑₑₜ + Ṫₑₑₜ·Δt,Δt=0.12s |
最典型的案例是ABB IRB1200在电池模组装配线上的应用。初始解析解在θ₅=0°附近频繁触发奇异保护,产线停机。按笔记方法加入θ₅禁区约束和扰动重试后,连续运行72小时无一次奇异报警,节拍时间稳定在3.2s。
4.2 数值解法的工程化改造:Levenberg-Marquardt的产线适配
当解析解不可靠时,笔记推荐改良版Levenberg-Marquardt(LM)算法,但做了三项关键改造:
代价函数重构:
标准LM最小化 ||f(θ) − x_d||²,其中f(θ)是FK函数,x_d是目标位姿。笔记改为:cost(θ) = w₁·||fₚₒₛ(θ) − x_dₚₒₛ||² + w₂·||f_𝑜𝑟𝑖(θ) − x_d_𝑜𝑟𝑖||² + w₃·∑(θᵢ − θᵢₜₐᵣgₑₜ)²
其中w₁=1.0(位置权重),w₂=0.3(姿态权重,因姿态误差对抓取影响较小),w₃=0.05(关节平滑权重,防突变)雅可比矩阵的实时近似:
不用符号微分,而用中心差分:Jᵢⱼ = [f(θ+ε·eⱼ) − f(θ−ε·eⱼ)] / (2ε)
ε取0.001rad(编码器分辨率的1倍),避免数值噪声。同时缓存J的LU分解,加速迭代。收敛判据的物理化:
不用数学残差<1e-6,而用:||fₚₒₛ(θ) − x_dₚₒₛ|| < 0.1mm AND ||f_𝑜𝑟𝑖(θ) − x_d_𝑜𝑟𝑖|| < 0.2° AND max|Δθᵢ| < 0.01rad
即位置误差<0.1mm(视觉引导精度)、姿态误差<0.2°(螺丝拧紧容差)、单步关节变化<0.01rad(防抖动)
在松灵Piper机械臂上实测,改良LM算法平均收敛迭代次数从12次降至4.3次,单次IK耗时从850μs降至320μs,且100%避免解震荡。
4.3 麦克纳姆轮底盘的逆运动学:速度空间到轮速空间的映射
麦克纳姆轮底盘的IK不是求“关节角”,而是求“四个轮子该以多快转”。笔记给出的映射关系异常简洁:
设机器人期望线速度[vₓ, v_y, ω_z]ᵀ(世界坐标系),轮速[ω₁, ω₂, ω₃, ω₄]ᵀ,则:
[ω₁] [ 1 -1 -L] [vₓ] [ω₂] = [ 1 1 L] [v_y] [ω₃] [ 1 1 -L] [ω_z] [ω₄] [ 1 -1 L]其中L为轮距(如Piper底盘L=0.28m)。
但笔记重点指出三个工程陷阱:
- 轮速饱和处理:当计算ωᵢ > ωₘₐₓ时,不直接截断,而采用“比例缩放”:
scale = min(1, ωₘₐₓ / max(|ω₁|,|ω₂|,|ω₃|,|ω₄|)),然后ωᵢ' = ωᵢ × scale - 打滑补偿:在湿滑地面,实测轮速与理论速度偏差达15%,笔记引入在线辨识:
vₓₐᶜᵗ = k₁·ω₁ + k₂·ω₂ + k₃·ω₃ + k₄·ω₄,kᵢ通过最小二乘在线更新 - 零速保持:当vₓ=v_y=ω_z=0时,轮子并非静止,而是以微速(±0.5rpm)反向转动,抵消静摩擦死区
这套方案让Piper底盘在瓷砖地面的定位精度从±15mm提升至±3mm,且启停无顿挫。
5. 从笔记到产线:林沛群调试法的七个动作规范
林沛群的笔记最终价值,体现在它是一套可复现、可传承的调试方法论。他总结出七个标准化动作,每个动作都有明确输入、输出、工具和验收标准,已固化为某国产机器人厂商的《运动学调试SOP V3.2》。
5.1 动作1:D-H参数初筛(耗时≤2h)
- 输入:机械臂整机、游标卡尺、深度规、电子水平仪、出厂D-H表
- 输出:修订版D-H表(标注实测值、手册值、偏差量、是否需返厂)
- 关键动作:
① 用深度规测d₁(基座高度),对比手册值,偏差>0.1mm则检查底座安装面平面度;
② 用电子水平仪测θ₂轴线倾角,若>0.2°,标记“第2轴需重新校准”;
③ 对a₃(大臂长度)实测3次,标准差>0.05mm则判定“大臂铸造应力未释放”,暂停调试。 - 验收标准:所有参数偏差在笔记允许公差内,且无“需返厂”项
5.2 动作2:TCP标定五点法(耗时≤1.5h)
- 输入:激光跟踪仪、球杆仪、标定靶(直径10mm钢球)
- 输出:TCP位姿Tₜcₚ(含x,y,z,roll,pitch,yaw六维)
- 关键动作:
① 在空间选取5个非共面点,机械臂末端以不同姿态触碰同一钢球中心;
② 每点采集10组数据,剔除离群值(>3σ);
③ 用最小二乘拟合球心,计算Tₜcₚ;
④ 验证:用Tₜcₚ驱动机械臂画边长100mm正方形,测量实际边长误差<0.1mm。 - 验收标准:正方形边长误差≤0.1mm,对角线误差≤0.15mm
5.3 动作3:FK精度验证(耗时≤1h)
- 输入:高精度激光干涉仪(分辨率0.01μm)、目标点阵(10×10网格,间距50mm)
- 输出:FK误差热力图(x,y,z三向误差)
- 关键动作:
① 机械臂按网格点序号移动,每点停留2s,记录激光干涉仪读数;
② 计算FK预测位置与实测位置偏差;
③ 若z向误差>0.3mm,检查d₃实测值;若x向误差呈系统性偏移,检查α₂。 - 验收标准:95%测点误差<0.2mm,最大误差<0.3mm
5.4 动作4:IK稳定性测试(耗时≤2h)
- 输入:目标位姿序列(含奇异点邻域、关节极限、高速运动段)
- 输出:IK成功率报告(含失败原因分类)
- 关键动作:
① 运行1000次随机位姿IK求解,记录失败次数及原因;
② 对失败案例,人工介入,用笔记方法手动修正参数;
③ 更新D-H表或IK配置,重测。 - 验收标准:IK成功率≥99.8%,奇异点邻域成功率≥95%
5.5 动作5:轨迹跟踪验证(耗时≤3h)
- 输入:激光跟踪仪、标准轨迹(直线、圆弧、S形曲线,速度0.1~1.0m/s)
- 输出:轨迹跟踪误差RMS值
- 关键动作:
① 以0.2m/s匀速跟踪直线,采样1000点,计算位置误差RMS;
② 以0.5m/s跟踪半径200mm圆弧,计算径向误差RMS;
③ 若RMS>0.15mm,检查FK实时性或IK收敛性。 - 验收标准:直线RMS≤0.12mm,圆弧RMS≤0.15mm
5.6 动作6:温漂补偿激活(耗时≤0.5h)
- 输入:环境温度传感器、连杆温度传感器(贴片式)、温漂补偿表
- 输出:温漂补偿启用状态
- 关键动作:
① 将机械臂置于20℃恒温室2h,记录基准D-H参数;
② 升温至35℃,运行FK验证,若z向漂移>0.2mm,启用补偿表;
③ 补偿表每5℃一个档位,插值计算。 - 验收标准:35℃下FK误差≤0.15mm(较20℃基准)
5.7 动作7:产线联调签核(耗时≤1h)
- 输入:产线PLC、视觉系统、末端执行器、工件
- 输出:《运动学调试签核单》(三方签字:调试工程师、产线主管、质量工程师)
- 关键动作:
① 连续运行典型工件抓取-装配-检测循环100次;
② 记录单次节拍时间、成功率、异常报警;
③ 若成功率<99.5%或节拍超差>5%,返回动作1。 - 验收标准:100次循环成功率≥99.5%,平均节拍时间≤设计值105%
这套方法论已在12家客户现场落地,平均缩短调试周期从14天降至3.2天,运动学相关故障率下降76%。林沛群在笔记末页写道:“运动学不是数学游戏,它是钢铁与代码握手时,必须达成的物理契约。每一次擦掉白板重写,都是在向现实低头,也是在向精度致敬。”
我最后一次见他,是在深圳湾科技生态园的深夜。他面前的白板上,新的草稿已经写满三分之二,标题是《机器人运动学笔记3:动力学与力控的边界》。粉笔灰沾在他眼镜片上,像一层薄雾。我知道,那雾后面,又一个更硬的坎,正在等待被擦掉、重写、再擦掉。