10、圆弧插补:平面与空间圆弧插补、圆心角计算、插补精度控制
圆弧插补,这名字听起来挺唬人,对吧?其实说白了,就是让机器人末端走一段完美的弧线。直线插补我们上一章聊过了,但实际生产中,哪有那么多直来直去的活儿?焊接一个圆筒、打磨一个曲面、或者给手机壳倒个角,都得靠圆弧插补。
我个人习惯把圆弧插补分成两类:平面圆弧和空间圆弧。这两者虽然都叫“圆弧”,但处理起来,差别还挺大的。
10.1 平面圆弧插补:二维世界里的优雅弧线
平面圆弧,顾名思义,就是圆弧所在的平面是固定的。比如,你在一个XY平面上画一个半圆。这是最基础的情况,也是我们理解圆弧插补的起点。
要实现平面圆弧插补,我们需要知道三个点:起点、终点、以及圆弧上的任意一个中间点(或者圆心)。有了这三个点,我们就能唯一确定一个圆。
我早期做数控系统的时候,踩过一个坑。当时用户反馈说,走出来的圆弧总是不圆,有微小的“棱角”。排查了半天,发现是插补周期没算对。你想想看,如果插补周期太长,那相邻两个插补点之间的弦长就大,弦代替弧的误差自然就大了。
具体怎么做呢?我们通常采用时间分割法。简单说,就是把整个圆弧运动的时间,等分成N个小段。在每个小段里,我们计算一次位置增量,然后输出给伺服驱动器。
假设我们已知圆弧半径R,进给速度F(也就是刀尖沿圆弧的线速度),插补周期T。那么,每个周期内走过的弧长就是:
ΔL = F * T
对应的圆心角增量就是:
Δθ = ΔL / R
有了Δθ,我们就可以用三角函数,算出每个周期在X轴和Y轴上的位置增量了。嗯,这里要注意,三角函数计算在嵌入式系统里是比较耗时的,我建议你提前算好一个正弦/余弦表,用查表法代替实时计算,能省不少CPU资源。
10.2 空间圆弧插补:三维空间里的挑战
空间圆弧就复杂多了。它不局限于某个坐标平面,可以在三维空间里任意“倾斜”。比如,你要让机器人在一个倾斜的圆柱面上画一条弧线。
处理空间圆弧,我常用的方法是坐标变换法。说白了,就是把三维问题,先降维成二维问题,算完了再映射回去。
具体步骤是这样的:
- 建立新坐标系: 以圆弧的圆心为原点,以圆弧所在平面的法向量为Z轴,以起点到圆心的方向为X轴,建立一个局部坐标系。
- 在局部坐标系里做平面插补: 在这个新坐标系下,圆弧就变成了一个标准的平面圆弧。我们用上面讲的方法,算出每个插补点在局部坐标系下的坐标。
- 坐标逆变换: 把局部坐标系下的坐标,通过旋转和平移矩阵,变换回原来的世界坐标系。
我在一个汽车喷涂项目里用过这个方法。当时要沿着车门边缘走一圈圆弧,车门是斜的,空间圆弧插补正好派上用场。如果你直接在世界坐标系里硬算,那三角函数会复杂到你怀疑人生。
10.3 圆心角计算:别小看这个“角”
圆心角,就是圆弧起点和终点相对于圆心所张的角度。这个角度的计算,直接决定了圆弧是走“小弧”还是“大弧”。
举个例子,从12点钟方向走到6点钟方向。你可以顺时针走半圈(圆心角180°),也可以逆时针走一圈半(圆心角540°)。如果不指定圆心角的方向和大小,机器人就懵了。
计算圆心角,我们通常用向量点积和叉积。
// 假设有向量 OA (起点到圆心) 和 OB (终点到圆心)
// 计算点积,得到夹角的余弦值
cosθ = (OA · OB) / (|OA| * |OB|)
// 计算叉积,得到夹角的正弦值和方向
// 叉积的方向,由右手定则决定
sinθ = |OA × OB| / (|OA| * |OB|)
// 结合正弦和余弦,就能得到0~2π范围内的唯一角度
θ = atan2(sinθ, cosθ)
这里有个坑,我必须要提醒你。如果你只用点积算arccos,那只能得到0~π之间的角度。你无法区分是顺时针转了30°,还是逆时针转了330°。所以,一定要结合叉积来判断方向。
10.4 插补精度控制:弦高误差与速度规划
精度控制,是圆弧插补里最见功力的地方。你不可能让机器人走出完美的数学圆弧,因为我们的指令是离散的。我们能做的,就是让实际路径无限逼近理论圆弧。
衡量逼近精度的指标,叫弦高误差。就是理论圆弧和实际直线段之间的最大垂直距离。
弦高误差δ的计算公式很简单:
δ ≈ R - sqrt(R² - (L/2)²)
其中,R是圆弧半径,L是每个插补周期内走过的弦长。
从公式可以看出,半径R越小,弦长L越大,误差就越大。所以,在走小半径圆弧时,我们必须减小弦长,也就是降低进给速度,或者缩短插补周期。
我常用的策略是自适应速度规划。在进入圆弧之前,提前减速;在圆弧内部,根据当前曲率半径动态调整速度;在出圆弧时,再加速恢复。
| 圆弧半径 (mm) | 允许弦高误差 (mm) | 最大弦长 (mm) | 建议进给速度 (mm/s) |
|---|---|---|---|
| 100 | 0.01 | 2.83 | 283 |
| 10 | 0.01 | 0.89 | 89 |
| 1 | 0.01 | 0.28 | 28 |
你看,半径从100mm缩小到1mm,速度必须从283mm/s降到28mm/s,才能保证同样的精度。这就是为什么机器人走小圆角时,看起来会“慢下来”的原因。
好了,关于圆弧插补,核心的东西就这些。从平面到空间,从圆心角到精度控制,每一步都有它的门道。你回去写代码的时候,建议先从平面圆弧开始,把弦高误差和速度规划的逻辑跑通,再扩展到空间圆弧。一步一步来,别急。