10、圆弧插补:平面与空间圆弧插补、圆心角计算、插补精度控制

圆弧插补,这名字听起来挺唬人,对吧?其实说白了,就是让机器人末端走一段完美的弧线。直线插补我们上一章聊过了,但实际生产中,哪有那么多直来直去的活儿?焊接一个圆筒、打磨一个曲面、或者给手机壳倒个角,都得靠圆弧插补。

我个人习惯把圆弧插补分成两类:平面圆弧空间圆弧。这两者虽然都叫“圆弧”,但处理起来,差别还挺大的。

10.1 平面圆弧插补:二维世界里的优雅弧线

平面圆弧,顾名思义,就是圆弧所在的平面是固定的。比如,你在一个XY平面上画一个半圆。这是最基础的情况,也是我们理解圆弧插补的起点。

要实现平面圆弧插补,我们需要知道三个点:起点、终点、以及圆弧上的任意一个中间点(或者圆心)。有了这三个点,我们就能唯一确定一个圆。

我早期做数控系统的时候,踩过一个坑。当时用户反馈说,走出来的圆弧总是不圆,有微小的“棱角”。排查了半天,发现是插补周期没算对。你想想看,如果插补周期太长,那相邻两个插补点之间的弦长就大,弦代替弧的误差自然就大了。

核心思路: 平面圆弧插补的本质,就是用一系列微小的直线段,去逼近一段圆弧。段数越多,精度越高,但计算量也越大。

具体怎么做呢?我们通常采用时间分割法。简单说,就是把整个圆弧运动的时间,等分成N个小段。在每个小段里,我们计算一次位置增量,然后输出给伺服驱动器。

假设我们已知圆弧半径R,进给速度F(也就是刀尖沿圆弧的线速度),插补周期T。那么,每个周期内走过的弧长就是:

ΔL = F * T

对应的圆心角增量就是:

Δθ = ΔL / R

有了Δθ,我们就可以用三角函数,算出每个周期在X轴和Y轴上的位置增量了。嗯,这里要注意,三角函数计算在嵌入式系统里是比较耗时的,我建议你提前算好一个正弦/余弦表,用查表法代替实时计算,能省不少CPU资源。

10.2 空间圆弧插补:三维空间里的挑战

空间圆弧就复杂多了。它不局限于某个坐标平面,可以在三维空间里任意“倾斜”。比如,你要让机器人在一个倾斜的圆柱面上画一条弧线。

处理空间圆弧,我常用的方法是坐标变换法。说白了,就是把三维问题,先降维成二维问题,算完了再映射回去。

具体步骤是这样的:

  1. 建立新坐标系: 以圆弧的圆心为原点,以圆弧所在平面的法向量为Z轴,以起点到圆心的方向为X轴,建立一个局部坐标系。
  2. 在局部坐标系里做平面插补: 在这个新坐标系下,圆弧就变成了一个标准的平面圆弧。我们用上面讲的方法,算出每个插补点在局部坐标系下的坐标。
  3. 坐标逆变换: 把局部坐标系下的坐标,通过旋转和平移矩阵,变换回原来的世界坐标系。

我在一个汽车喷涂项目里用过这个方法。当时要沿着车门边缘走一圈圆弧,车门是斜的,空间圆弧插补正好派上用场。如果你直接在世界坐标系里硬算,那三角函数会复杂到你怀疑人生。

我的小技巧: 在做坐标变换时,一定要用齐次坐标矩阵。它能把旋转和平移统一成一个4x4的矩阵,计算起来非常规整,不容易出错。

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,才能保证同样的精度。这就是为什么机器人走小圆角时,看起来会“慢下来”的原因。

总结一下: 圆弧插补的精度控制,本质上是一个“速度-精度”的权衡。你追求更高的精度,就必须牺牲一部分速度。好的算法,就是能在满足精度要求的前提下,尽可能跑得快。

好了,关于圆弧插补,核心的东西就这些。从平面到空间,从圆心角到精度控制,每一步都有它的门道。你回去写代码的时候,建议先从平面圆弧开始,把弦高误差和速度规划的逻辑跑通,再扩展到空间圆弧。一步一步来,别急。