首页 > 解决方案 > 给定卷筒的旋转,如何计算绞盘上电缆的长度

问题描述

我有一个电缆绞盘系统,我想知道考虑到已经发生的旋转次数,还剩下多少电缆,反之亦然。该系统将在具有低计算资源的低成本微控制器上运行,并且应该能够快速更新,长时间的 for/while 循环迭代并不理想。

输入是电缆直径、内滚筒直径、内滚筒宽度和滚筒旋转。输出应该是卷筒上电缆的长度。

起初,我根据电缆直径和内卷筒宽度计算每层电缆的最大缠绕数,然后我可以用它来计算每层电缆的长度。当我计算总长度时问题就来了,因为我必须遍历每一层,这是一项昂贵的操作(可能是 100 层)。

我的下一个方法是预先计算每个层的表格,然后执行 3-5 度多项式回归到一个易于计算的公式。

这似乎在大多数情况下都有效,但是,在低端和高端有轻微的不准确(0 旋转可能是 + 或 - 几个单位的电缆长度)。当我尝试反转函数以获得给定长度的鼓的当前旋转时,真正的问题出现了。到目前为止,我的反转公式似乎不等于正向公式(我在计算多项式之前反转 X 和 Y)。

我看了高低,似乎找不到任何不使用递归或循环的旋转电缆长度公式。我不知道如何反转我的多项式函数以获得反向值而不损失精度。如果有人碰巧有见解/想法或可以帮助指导我朝着最有帮助的正确方向发展。请在下面查看我的尝试。

// Units are not important

CableLength = 15000
CableDiameter = 5
DrumWidth = 50
DrumDiameter = 5

CurrentRotations = 0
CurrentLength = 0
CurrentLayer = 0

PolyRotations = Array
PolyLengths = Array
PolyLayers = Array

WrapsPerLayer = DrumWidth / CableDiameter

While CurrentLength < CableLength // Calcuate layer length for each layer up to cable length
  CableStackHeight = CableDiameter * CurrentLayer
  DrumDiameterAtLayer = DrumDiameter + (CableStackHeight * 2) // Assumes cables stack vertically
  WrapDiameter = DrumDiameterAtLayer + CableDiameter // Center point of cable
  WrapLength = WrapDiameter * PI
  LayerLength = WrapLength * WrapsPerLayer
  
  CurrentRotations += WrapsPerLayer // 1 Rotation per wrap
  CurrentLength += LayerLength
  CurrentLayer++
  
  PolyRotations.Push(CurrentRotations)
  PolyLengths.Push(CurrentLength)
  PolyLayers.Push(CurrentLayer)

End


// Using 5 degree polynomials, any lower = very low precision

PolyLengthToRotation = CreatePolynomial(PolyLengths, PolyRotations, 5) // 5 Degrees
PolyRotationToLength = CreatePolynomial(PolyRotations, PolyLengths, 5) // 5 Degrees

// 40 Rotations should equal about 3141.593 units
RealRotation = 40
RealLength = 3141.593
CalculatedLength = EvaluatePolynomial(RealRotation,PolyRotationToLength)
CalculatedRotations = EvaluatePolynomial(RealLength,PolyLengthToRotation)

// CalculatedLength = 3141.593 // Good
// CalculatedRotations = 41.069 // No good
// CalculatedRotations != RealRotation // These should equal


// 0 Rotations should equal 0 length
RealRotation = 0
RealLength = 0
CalculatedLength = EvaluatePolynomial(RealRotation,PolyRotationToLength)
CalculatedRotations = EvaluatePolynomial(RealLength,PolyLengthToRotation)

// CalculatedLength = 1.172421e-9 // Very close
// CalculatedRotations = 1.947, // No good
// CalculatedRotations != RealRotation // These should equal

旁注:我有一个“绕线系数”参数来校准此处未显示的实际电缆绕线效率。(电缆不保证在数学上完美铺设)

标签: algorithmfunctiongeometry

解决方案


@Bathsheba 可能意味着电缆,但表格是一个有效的选择(实验数字在现实世界中可能更有趣)。

有点慢,但你总是可以手动完成。只有 40 次旋转(尽管为了更好的实验结果可选,重复 3 次并取平均值......)。将其完全卷入。然后旋转(取决于滚筒的直径,半旋转)。测量并标记它绕出多远(胶带),记录下来。重复接下来的 39 圈。您现在有一个查找表,您可以通过二进制搜索(通过对数据进行排序)和一些插值(IE:1.5 次旋转大约是 1 到 2 次旋转之间的一半)找到 O(log N) 中的长度。

您也可以使用它来导出您自己的实验数据。做同样的事情,但使用一半细的电缆(可能与内径和电缆半径的比率成正比?)。它对数字有什么影响?直径的两倍或一半怎么样?数学说圆周是线性的(2πr),所以半径的一半,每次旋转的量的一半。调整表格数据可能更容易。

要点是,您可能更容易为您的数字提供真实世界的参考,而不是纯粹依赖抽象的数学模型(并不是说模型是错误的,但电缆并不总是完美地结束,谁知道也许你可以找到一个关于你的绞盘的怪癖,这会导致纯数学方法中的错误)。谁知道也许可以自己推导出公式:) 对现实世界有一个软糖因素,甚至哈哈。


推荐阅读