壹星(YIXING)技术笔记|东莞市壹星自动化设备有限公司
把圆瓶贴附路径画成若干直线段时,第一条弦并不与起点切线重合。段数太少会同时产生径向轮廓误差和首段方向误差,但这属于离散表示误差,不能直接解释真实标签抬头或尾部翘起。纸张弯曲、胶层和压贴过程没有进入这个模型。
本文以理想圆弧为教学示例,推导最大弦高、首段方向偏差及所需分段数,交付可检查的离线几何程序。它适用于图纸、轮廓示意和数值路径的误差预算,不提供剥离板最佳位置、压轮设置或消除缺陷的承诺。
两种误差来自同一圆弧片段
设圆半径R,需表示的总圆心角为Θ,将它均分为n段,每段中心角φ=Θ/n。本文限定总角度不超过半圈,每段都采用连接两端点的弦。角度公式使用弧度,所有长度单位一致。
在每段中点,圆弧相对弦的最大径向距离为弦高:
$$e_n=R[1-\cos(\varphi/2)]=2R\sin^2(\Theta/(4n)).$$
第二种写法避免在小角度下直接相减两个很接近的数。每段弦方向与该段起点切线的夹角为φ/2,因此第一条弦的方向误差为:
$$\delta_n=\Theta/(2n).$$
两者单位不同,不能用一个“误差小于某数”同时描述。弦高小并不自动满足很严格的方向约束;反过来,方向约束满足时仍应回代检查给定的长度误差预算。
从预算反求段数
给定允许的离散弦高ε,且零小于ε小于R,可反解每段允许角度上限为4arcsin√(ε/(2R)),所以:
$$n_e=\left\lceil\frac{\Theta}{4\arcsin\sqrt{\varepsilon/(2R)}}\right\rceil.$$
若另有首段方向预算δ_max,则需要n_δ=ceil(Θ/(2δ_max));最终取两者较大值。这里的预算由离线表示任务指定,不是设备贴标精度、公差或材料允许弯折角。
取R=40毫米、总角度九十度,先只约束弦高,再加入一个独立方向预算。
| 弦高预算,mm | 首段方向预算 | 所需段数 | 实际最大弦高,mm | 首段方向误差 |
|---|---|---|---|---|
| 0.20 | 不限制 | 8 | 0.192611 | 5.625000度 |
| 0.05 | 不限制 | 16 | 0.048182 | 2.812500度 |
| 0.01 | 不限制 | 36 | 0.009519 | 1.250000度 |
| 0.05 | 1度 | 45 | 0.006092 | 1.000000度 |
最后一行展示两个约束为什么不能混用:十六段虽然满足零点零五毫米弦高预算,仍不满足一度的方向预算,因此需要增至四十五段。
还可以独立计算折线总长损失:真实圆弧长度为RΘ,n条弦的总长为2nRsin(Θ/(2n)),两者之差是总长误差。它与最大弦高不是同一个指标;一个在各段累积,一个只看局部最大径向偏离。不能把其中任一个直接叫作真实标签接缝偏差。
完整离线计算与坐标复核
代码只使用标准库;三角函数、向上取整和弧度接口见 Python math文档。除公式回代外,还从第一段两个端点算出弦方向,与起点切线直接比较,避免只验证同一公式的重复表达。
from math import asin, sqrt, ceil, radians, degrees, sin, cos, atan2, isfinite, isclose def choose_segments(radius, arc_deg, error_mm, direction_deg=None): if not all(isfinite(v) for v in (radius, arc_deg, error_mm)): raise ValueError("nonfinite") if not radius > error_mm > 0 or not 0 < arc_deg <= 180: raise ValueError("outside_example_domain") theta = radians(arc_deg) max_step = 4*asin(sqrt(error_mm/(2*radius))) if max_step <= 0: raise ValueError("numeric_resolution") count = max(1, ceil(theta/max_step)) if direction_deg is not None: if not isfinite(direction_deg) or direction_deg <= 0: raise ValueError("invalid_direction_budget") count = max(count, ceil(arc_deg/(2*direction_deg))) error = 2*radius*sin(theta/(4*count))**2 direction = arc_deg/(2*count) assert error <= error_mm + 1e-12 if direction_deg is not None: assert direction <= direction_deg + 1e-12 step = theta/count chord_angle = degrees(atan2(radius*sin(step), radius*cos(step)-radius)) assert isclose(chord_angle-90, direction, abs_tol=1e-10) return count, error, direction for budget in (0.20, 0.05, 0.01): n, error, direction = choose_segments(40.0, 90.0, budget) print(f"eps={budget:.2f} n={n} error={error:.6f} direction={direction:.6f}") n, error, direction = choose_segments(40.0, 90.0, 0.05, 1.0) print(f"joint n={n} error={error:.6f} direction={direction:.6f}") assert n == 45 length_loss = 40*radians(90)-16*80*sin(radians(90)/32) print(f"length_loss_n16={length_loss:.6f}") try: choose_segments(40, 90, 0) except ValueError: print("zero_budget REJECTED") else: raise AssertionError("zero error budget accepted")输出:
eps=0.20 n=8 error=0.192611 direction=5.625000 eps=0.05 n=16 error=0.048182 direction=2.812500 eps=0.01 n=36 error=0.009519 direction=1.250000 joint n=45 error=0.006092 direction=1.000000 length_loss_n16=0.025230 zero_budget REJECTED怎样使用这些误差量
例如一张放大示意图只画八条弦,首段与理论切线有五点六二五度差异,这是绘图选择造成的,不能据此判断实体出标方向偏了同样角度。比较两份离线路径时,应先统一半径、角度范围、段数和误差定义,再讨论几何差异。
十六段时,总长损失约零点零二五二三毫米,最大弦高约零点零四八一八毫米。即使两个数值使用相同单位,比较的对象仍不同。若任务约束的是路径总长,应直接校核总长损失,不能仅凭最大弦高通过就认为所有长度指标都已满足。
零弦高预算意味着要求折线与连续圆弧完全重合,有限个非零长度弦段做不到,程序因此拒绝零预算。随着ε减小,段数增多,但这不增加原始轮廓测量的准确度;如果圆心和半径本身不可靠,细分只是更精细地表示了一个不可靠模型。
各段角度不相等时,应逐段检查弦高和方向误差,不能直接用平均角度套入均分公式。比较导出的两份折线时,也应确认端点是否一致:端点发生位移属于另一类几何误差,增加中间点并不能自动修复。
本模型没有材料厚度、弯曲刚度、背胶、接触压力和实际送料轨迹。不能把弦高当成真实标签悬空量,也不能用首段方向误差代替实体切入角。若目标是分析抬头或翘尾,应另行记录真实轮廓、接触状态和材料条件,而不是把这套离散误差预算当作调机规则。