ELAI S.r.l.

机器人朝反方向?直接平均角度为什么会出错

两个几乎相同的方向,平均后却可能相反。通过可复现计算理解圆均值、集中程度及其歧义。

机器人朝反方向?直接平均角度为什么会出错

两个接近的测量,答案却指向反面

设想旋转台上零件的两个方向估计分别为 +179° 和 −179°。箭头几乎重合,都指向左侧,距 180° 仅一度。算术平均把两数相加再除以二,却得到指向右侧的 0°。程序的加法和除法都可能正确,却把几乎一致的观测转换成相反方向。

问题不仅是避免错误结果,还包括在计算哪种平均、它最小化什么,以及何时无法给出可靠平均方向。我们从单位圆向量建立方法,完整计算案例,并比较两种距离。标题描述数学模型中的风险,不是事故报道或 EL-AI 机器人测试。观测全部为合成,计算可复现。

角度不是直线上的点

对于长度,179 与 −179 相距很远;对于方向,加一整圈不改变箭头,−179° 与 181° 表示同一朝向。把第二个数改写为 181°,普通平均就变成 180°。零件未变,只变了数值表示。方向均值应在任一观测增减 360° 后仍等价,而数值代表的算术平均不满足这一性质。

本文研究平面方向,不是轴的累计转数。转过三圈的关节可能与未转圈的关节同向,但展开位置、机械限制和电缆状态不同,此时去掉圈数会丢信息。必须先明确数据含义再选择方法。本分析针对方向圆,不是全部关节变量的通用解。

将测量转换为箭头

将 theta 映射为单位向量 u(theta)=(cos theta, sin theta),长度一,表示方向而非任意大小。三角函数使用弧度,角度乘 pi/180 即可转换。用非负权重 w_i 分别平均水平与垂直分量,总权重 W 必须为正,结果记为 c、s。相等权重对应普通圆均值。

W = sum_i w_i > 0\nc = (1/W) sum_i w_i cos(theta_i)\ns = (1/W) sum_i w_i sin(theta_i)\nrho = sqrt(c^2+s^2)\nmu = atan2(s,c), provided rho > 0

atan2 使用两个分量判断象限;单用 arctan(s/c) 会丢失象限信息,还需除以 c。rho 是平均向量长度,位于零到一之间:同向箭头叠加,反向箭头抵消。只有合向量非零时 mu 才有方向含义。代码用数值阈值处理浮点残差,后文会区分它与物理质量阈值。

逐步计算核心案例

+179° 与 −179° 的余弦均约为 −0.9998476952,正弦约为 +0.0174524064 与 −0.0174524064,互相抵消。等权时 c≈−0.9998476952、s≈0、rho≈0.9998476952。较长的合向量朝左,atan2 返回 180°,等价于 −180°。两观测沿最短弧仅相差 2°。−180° 与 +180° 的跳变是数值标签变化,不是实际转动。

给第一个观测加 360° 后方向不变,代码已验证。若第一观测权重是第二个的三倍,结果约为 179.4999619°,更接近第一观测。权重是融合模型的选择,不能仅因命名为“置信度”就获得合理性。要解释为可靠性,需要误差及依赖模型。两个传感器若有相同系统偏差,rho 也能接近一,却共同指错方向。

这个均值最小化什么误差?

为何它是平均而不只是配方?测量单位箭头端点之间的直线距离,即圆的弦长,寻找使加权平方距离和最小的 mu。目标函数无量纲,既不是米制位置误差,也不是角距离平方。选择距离本身就是统计问题的一部分。

J_chord(mu) = sum_i w_i ||u(theta_i)-u(mu)||^2 ||u(theta)-u(mu)||^2 = 2 - 2 cos(theta-mu) J_chord(mu) = 2W - 2W[c cos(mu)+s sin(mu)] = 2W - 2W rho cos(mu-alpha) alpha = atan2(s,c), if rho > 0

第一恒等式来自单位向量内积:各范数平方为一,内积等于角差余弦。展开 cos(theta−mu) 后,得到 c、s。rho 为正时,末项余弦等于一使成本最小,即 mu=alpha 模一整圈。rho=0 时,任意 mu 成本均为 2W。推导同时给出公式和不确定情形。

在 +179°/−179°、两个单位权重下,0° 算术均值的弦成本约为 7.99939078,180° 圆均值成本约为 0.0006092194。这些是目标函数数值,不是机器人成功率。差异展示本例的表示错误,不衡量碰撞距离或视觉系统质量。

当合向量消失

0° 与 180° 等权时精确抵消,模型中 c=s=0,数据不偏好任何弦均值方向。算术得到 90° 并未发现隐藏信息,只是选了与表示有关的数。浮点 sin(pi) 可能残留约 10⁻¹⁶,让 atan2 返回一个数,却无法解决数学歧义。

本实现对 rho≤10⁻¹² 返回 None,这是明确的实验策略,不是认证融合阈值或统计置信结论。应用需根据噪声及无法估计时的预期行为制定标准。SciPy circmean 文档说明零合向量结果依赖实现;本例明确采用不同策略,未执行 SciPy,也不编造比较。

有定义的结果也可能非常敏感

把 180° 改为 179.999°,rho≈8.72665×10⁻⁶,均值约 +89.9995°。若改用 −179.999°,其物理方向与前者仅差 0.002°,均值却约为 −89.9995°,两个平均几乎相反。这不只是标签跳变,箭头也不同。反向抵消附近,小扰动会从许多近似等价方向中选出最小者。

atan2 的导数解释敏感性:分量小变化 dc、ds 一阶产生 dmu=(c ds−s dc)/rho²,单位弧度。对 (c, s) 的梯度范数为 1/rho,合向量越短,相同分量误差可能放大为越大的角误差。它仅在 rho 为正、扰动足够小时局部成立,不是置信区间。代码扫描 epsilon 从 1° 到 0.001°。

左:单位圆上的 ±179° 向量、180° 圆均值和 0° 算术均值。右:0° 与 180°−epsilon 的合向量长度,双轴对数。数据为合成及 Python 计算,不是机器人测量。
左:单位圆上的 ±179° 向量、180° 圆均值和 0° 算术均值。右:0° 与 180°−epsilon 的合向量长度,双轴对数。数据为合成及 Python 计算,不是机器人测量。

沿圆周距离产生另一种均值

弦沿直线连接两点,弧沿圆周。小偏差时近似,大偏差时不同。内蕴均值可最小化最短角偏差的平方和,将角差折回一整圈区间,通常不等于弦均值。“圆形平均”一词不能唯一说明目标,必须看惩罚哪种距离。

取 0°、0°、180°,两个右向箭头胜过一个左向,rho=1/3,弦均值为 0°。角距离在 0°≤mu≤180° 时成本为 2mu²+(180°−mu)²,导数 6mu−360° 给出 60°,负半圆另有 −60° 最小值。两最小值角成本均为 21,600 度平方,零点为 32,400。反之弦成本零点为 4,±60° 约为 5。不同目标产生不同结果,并无矛盾。

以度表示便于阅读。转换弧度只将角成本乘相同的 (pi/180)²,不改变最小点。代码比较这些数值,两个半圆上的推导说明最小性。不存在普遍更“真实”的平均,需选择应用要降低的误差。多峰数据可能应保留多个假设,而不是单值总结。

案例,度算术均值圆弦均值rho
179, -17901800.9998476952
179, 181180-1800.9998476952
0, 18090—~0
0, 179.99989.999589.99950.00000872665
0, 0, 18060~01/3

横线表示方法在数值阈值以下不返回方向,+180° 与 −180° 等价。普通均值会依赖区间切口,圆均值则可能优化正确却不够有信息或敏感。保留 rho 及观测有助区分,rho 本身不能重建完整分布。

角度展开是另一种操作

角度展开通过添加整圈使时间序列连续。若轴从 179° 小幅前进到 −179°,可将后者写为 181°,但这使用时间关系或先验。无参考的同时测量不一定能唯一分配圈数。采样间运动若可能超过半圈,最小跳变规则也会选错。本文未执行展开算法或轨迹模拟,只区分其前提。

几何参考系也必须一致。相机相对角与机器人基座相对角,即使都以度表示也不能直接融合。轴、正方向及参考变换必须一致。圆均值不修复错误标定或时间戳错位。本文假设平面观测已可比较,研究如何总结它们。

代码执行了什么,范围之外有什么

experiment.py 使用 Python 3.14.0 和 math,保存观测、权重、分量、rho、均值及成本。过程确定,无随机种子。fsum 累加相关量,拒绝空输入、负或非有限权重、零总和。断言使用明确容差,对跖抵消另有精确算术解释。文末短代码隔离核心例子,归档增加全部案例和目标比较。plot.py 用 Matplotlib 生成四种语言图,并说明中文字体处理。

单遍操作量与观测数成正比,聚合状态恒定:权重和、余弦和、正弦和。脚本为核对保存更多数据,因此该算法性质不等于程序总内存。未测微控制器耗时、编码器精度或控制器行为,不能由三个求和推断整机延迟。

查阅的 SciPy 1.18.0 一手文档区分基于复合向量的 circmean 与基于旋转矩阵弦损失的 Rotation.mean。这避免把平面方向和一般三维旋转混淆,本文不证明可分别平均三个欧拉角。未执行这些 API,也不把结果归于 SciPy。不声称读过文档所列书籍或论文。本文是数学教学分析,不是新同行评审研究。

回答最初的问题

将圆坐标当直线数字会使机器人收到相反方向。单位箭头和圆均值消除 +179°、−179° 案例中的错误,得到 180°。但小合向量、相反群组、距离选择、参考系和累计圈数仍限制解释。解决之道是选择数据几何,并识别单一方向何时不足以总结观测,而非盲信公式。

用户将工业及协作机器人列为 EL-AI 探索方向。此处应用联系仍是假设;计算不是机器人试验、安全证明,也不证明产品、客户或安装。证据仅为推导恒等式与实际执行的合成案例。真实工作单元需要传感协议、标定及具体动态和安全验证,本文不能替代。

来源与复现材料

SciPy 1.18.0 — scipy.stats.circmean, definition and zero-resultant behaviour.

SciPy 1.18.0 — Rotation.mean, chordal objective.

import math
angles=[179,-179]
c=math.fsum(math.cos(math.radians(a)) for a in angles)/len(angles)
s=math.fsum(math.sin(math.radians(a)) for a in angles)/len(angles)
rho=math.hypot(c,s)
mean=math.degrees(math.atan2(s,c)) if rho>1e-12 else None
assert abs(abs(mean)-180)<1e-10
print(sum(angles)/len(angles),mean,rho)

代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 24 日。