【问题标题】:Code to resemble a rowing stroke类似于划船划船的代码
【发布时间】:2015-03-03 09:09:12
【问题描述】:

我正在开发一个显示移动划艇的小程序。下面是一个简单的示例代码(Python 2.x):

import time
class Boat:
    def __init__(self, pace, spm):
        self.pace = pace  #velocity of the boat in m/s
        self.spm = spm    #strokes per minute
        self.distance = 0 #distance travelled

    def move(self, deltaT):
        self.distance = self.distance + (self.pace * deltaT)

boat1 = Boat(3.33, 20)
while True:
    boat1.move(0.1)
    print boat1.distance
    time.sleep(0.1)

如您所见,船的速度和行数每分钟划动数次。每次调用move(deltaT)方法时,都会根据节奏移动一定的距离。

上面的船只是以恒定的速度行驶,这是不现实的。真正的划艇在划桨开始时加速,然后在桨叶离开水面后减速。网上有很多图表显示了典型的划船曲线(这里显示的是力量,速度看起来很相似):

来源:highperformancerowing.net

步速应该随着时间的推移保持不变,但在击球过程中应该会发生变化。

将恒定速度变为(至少基本上)类似于更逼真的划船划船的曲线的最佳方法是什么?

注意:关于如何更好地标记这个问题的任何想法?是算法问题吗?

【问题讨论】:

  • 使用样条插值,例如,来自 SciPy。
  • 参见 SE 网站了解统计信息stats.stackexchange.com
  • 以及ggplot库中的平滑变换stat_smooth。

标签: python plot spline smoothing


【解决方案1】:

如果您的目标只是想出一些视觉上合理的东西而不是进行完整的物理模拟,您可以简单地在该位置添加一个正弦波。

class Boat:
    def __init__(self, pace, spm, var=0.5):
        self.pace = pace    #average velocity of the boat in m/s
        self.sps = spm/60.0 #strokes per second
        self.var = var      #variation in speed from 0-1
        self.totalT = 0     #total time
        self.distance = 0   #distance traveled

    def move(self, deltaT):
        self.totalT += deltaT
        self.distance = self.pace * (self.totalT + self.var * math.sin(self.totalT * self.sps * 2*math.pi)

您需要小心var 的变化,如果它变得太高,船可能会倒退并破坏幻觉。

【讨论】:

  • 代码的结果是有效的,因为我已经测试了一个速度为 10m/s 和 SPM 为 20 行 30m 的划船器:ideone.com/wHjZs3 但是划船期间的速度似乎来回跳跃。任何想法计算中有什么问题?难道我们不需要把节奏变成正弦波而不是时间吗?
  • @MONsDaR 抱歉,我做了一个更正,但没有复制到答案中。 / self.sps 应该是 * self.sps
  • 成功了,现在的值正沿着正弦波增加/减少:ideone.com/2Cb6u8 但是曲线与我的预期完全相反:它开始快,变慢,结束快。应该反过来。我玩弄了这个方程,但无法让它正确运行,你能帮我最后一次吗?
  • @MONsDaR 尝试使用(1-cos(...))*0.5 而不是sin(...)。编辑:从头开始,只是反转sin 效果更好。您需要减少变化以防止倒退。见ideone.com/L50x5V
  • 哈,刚发现我自己,想把它贴在这里 :) 非常感谢您的帮助,船现在正在划船,同时看起来很逼真
【解决方案2】:

您可以执行运动微分方程的简单积分。 (这就是你已经在做的以恒定速度获取空间作为时间函数的方法,x' = x + V.dt。)

假设一个简单的模型,在行程过程中力恒定,在滑行过程中没有力,并且阻力与速度成正比。

所以在行程中加速度为a = P - D.v,在滑行(减速)时为- D.v

速度近似为v' = v + a.dt

空间近似为x' = x + v.dt

如果dt 足够小,这个动作应该看起来很逼真。您可以使用更准确的力定律和更好的集成技术(如 Runge-Kutta)来优化模型,但我不确定这是否值得。

下面是使用此技术的速度和空间与时间的示例图。它显示了快速建立周期性区域的速度振荡,以及带有波动的准线性位移。

【讨论】:

  • 我想这是一个足够好的整体解决方案。然而,我的问题更多的是要问“我如何将曲线建模成像划船一样,但保持整体节奏”。
【解决方案3】:

您可以将这样的曲线转换为速度的多项式方程。

可以在以下位置找到有关如何执行此操作的说明/示例:

python numpy/scipy curve fitting

这将向您展示如何获取一组 x,y 坐标(您可以通过检查现有绘图或从实际数据中获得)并创建多项式函数。

如果您对每个 Boat 对象使用相同的曲线,您可以将其硬编码到您的程序中。但您也可以为每个 Boat 对象设置一个单独的多项式方程,假设每个划船者或船具有不同的轮廓。

【讨论】:

  • 刚刚注意到您的图表在 y 轴上有 Force。力是质量*加速度。由于您的质量是恒定的,因此它本质上是加速度(而不是速度)图。
  • 这是一个很好的高级方法,现在可能有点复杂。当我的应用程序需要更复杂的解决方案时,我会考虑到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 2021-05-23
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多