3. 运动学基础:速度-距离曲线、加速度与减速度、运行时间与距离计算

各位同学,欢迎来到第三讲。前面我们聊了列车牵引计算的基本概念,今天要扎进去讲点硬核的东西——运动学基础。

说白了,列车自动驾驶的节能运行曲线,本质上就是在解一个运动学问题。你想想看,列车从A站跑到B站,什么时候加速、什么时候巡航、什么时候惰行、什么时候制动,这些动作的背后,全是速度、距离、时间、加速度这几个物理量在跳舞。

我个人习惯,在讲任何控制算法之前,先把运动学底子打牢。底子不牢,后面设计出来的曲线就是空中楼阁。

3.1 速度-距离曲线:列车运行的“心电图”

速度-距离曲线,简称v-s曲线。这是我每天都要看的图。它横轴是里程(距离),纵轴是速度,记录了列车从起点到终点,每一个位置上的瞬时速度。

为什么说它是心电图?因为一条好的v-s曲线,能直接反映出列车的运行品质——是否平稳、是否节能、是否准时。

我在项目中遇到过一件事:某条线路的ATO(列车自动驾驶)系统调试,列车总是晚点。查了半天,最后发现是v-s曲线里有一段加速太保守了,导致全程运行时间超标。你看,问题就出在这张图上。

v-s曲线有几个关键特征点:

  • 起点:速度为零,对应车站停车位置。
  • 加速段:速度从零开始上升,斜率取决于牵引加速度。
  • 巡航段:速度保持恒定,此时牵引力等于阻力。
  • 惰行段:切断牵引力,列车靠惯性滑行,速度缓慢下降。
  • 制动段:施加制动,速度快速下降至零,对应进站停车。

嗯,这里要注意:节能运行曲线的核心思想,就是尽量延长惰行段,减少不必要的牵引和制动。因为每一次牵引都要消耗电能,每一次制动都会把动能白白浪费掉(除非有再生制动回收)。

核心要点:v-s曲线的形状,直接决定了列车的能耗。一条优秀的节能曲线,应该是“少牵引、多惰行、缓制动”。

3.2 加速度与减速度:列车加减速的“油门”和“刹车”

加速度,符号a,单位m/s²。它描述的是速度变化的快慢。

正加速度就是加速,负加速度就是减速(我们通常叫减速度)。

这里有个容易混淆的地方:列车牵引计算里,加速度不是随便取的。它受三个因素制约:

  1. 牵引/制动特性:电机能输出多大的力,制动系统能提供多大的制动力。
  2. 粘着限制:轮轨之间的摩擦力有限,加速度太大车轮会打滑。我曾经在雨天调试时遇到过,列车一启动就空转,速度上不去,就是因为粘着系数下降了。
  3. 舒适度要求:乘客不是货物,加速度变化太剧烈,人会站不稳。一般城市轨道交通的加速度控制在0.6~1.0 m/s²,减速度控制在0.8~1.2 m/s²。

我建议大家在设计曲线时,把加速度分成几个阶段来处理:

  • 启动阶段:加速度从零逐渐增加到目标值,避免冲击。
  • 恒加速阶段:保持恒定加速度,速度线性上升。
  • 退坡阶段:接近目标速度时,加速度逐渐减小到零,平滑过渡到巡航。

说白了,加速度的变化率(加加速度,jerk)也要控制。jerk太大,乘客会感觉“被踹了一脚”。

小技巧:实际工程中,我习惯用梯形加速度曲线。就是加速度先线性上升、再保持、再线性下降。这样既保证了加速效率,又兼顾了舒适度。

3.3 运行时间与距离计算:把物理公式变成代码

好了,理论讲完了,咱们来点实际的。怎么把v-s曲线算出来?

核心公式就三个:

v = v₀ + a · t          (1)
s = s₀ + v₀ · t + ½ · a · t²   (2)
v² = v₀² + 2 · a · (s - s₀)    (3)

这三个公式,搞过物理的都不陌生。但在列车控制里,我们通常不用连续公式,而是用离散化的方法——把整个运行过程切成很多小段,每段内假设加速度恒定,然后逐段计算。

为什么?因为实际线路的坡度、曲线、限速都是变化的,不可能用一个公式从头算到尾。

我给大家看一段我常用的计算逻辑(伪代码):

// 离散化计算v-s曲线
初始化:s = 0, v = 0, t = 0
设定时间步长 dt = 0.1 秒

while (s < 总距离) {
    // 1. 根据当前位置,查表得到当前限速、坡度、曲率
    v_limit = getSpeedLimit(s)
    grade = getGrade(s)
    curve = getCurve(s)
    
    // 2. 计算当前阻力
    F_resistance = calculateResistance(v, grade, curve)
    
    // 3. 根据控制策略,决定牵引力或制动力
    if (处于加速阶段) {
        F_traction = getTractionForce(v)  // 查牵引特性曲线
        a = (F_traction - F_resistance) / M  // M是列车质量
    } else if (处于惰行阶段) {
        F_traction = 0
        a = -F_resistance / M
    } else if (处于制动阶段) {
        F_brake = getBrakeForce(v)  // 查制动特性曲线
        a = -(F_brake + F_resistance) / M
    }
    
    // 4. 更新速度、距离、时间
    v_new = v + a * dt
    s_new = s + v * dt + 0.5 * a * dt²
    t = t + dt
    
    // 5. 限速检查
    if (v_new > v_limit) {
        v_new = v_limit  // 限速保护
    }
    
    // 记录数据
    record(s_new, v_new, t, a)
    
    // 更新状态
    v = v_new
    s = s_new
}

这段代码看起来简单,但实际工程里,每一步都有坑。我曾经在一条大坡道线路上调试,发现列车在下坡时速度怎么都降不下来,后来才发现是阻力计算里忘了考虑坡度分力——列车自重在下坡道上会产生一个向前的分力,这个力可不小。

避坑指南:我曾经在计算运行时间时,直接用平均速度来估算,结果误差达到了5%。后来改用逐段积分法,误差才降到0.5%以内。记住:不要用平均速度算时间,一定要逐段积分

3.4 一个完整的计算示例

咱们来算一个简单的例子。假设列车从车站A出发,到车站B,距离1000米。

参数如下:

阶段 加速度 (m/s²) 目标速度 (m/s) 持续时间 (s)
加速 0.8 20 25
巡航 0 20 30
惰行 -0.1 (阻力等效减速度) 从20下降到12 80
制动 -1.0 从12下降到0 12

我们来算一下各阶段走过的距离:

  • 加速段:s₁ = ½ × 0.8 × 25² = 250 米
  • 巡航段:s₂ = 20 × 30 = 600 米
  • 惰行段:s₃ = 20×80 + ½×(-0.1)×80² = 1600 - 320 = 1280 米?等等,这已经超过总距离了。

你看,这就是问题所在。实际计算中,惰行段不可能持续80秒,因为距离不够了。我们需要根据剩余距离来反推惰行时间。

正确的做法是:先算加速和巡航的总距离(250+600=850米),剩余150米用于惰行和制动。然后根据制动距离反推惰行终点速度,再算惰行时间。

嗯,这里要提醒大家:设计v-s曲线时,一定要做距离闭环校验。不能先定时间再算距离,而是先定距离再算时间。

总结一下今天的内容

  • v-s曲线是列车运行的蓝图,节能的关键在于延长惰行段。
  • 加速度和减速度受牵引特性、粘着、舒适度三重约束。
  • 离散化逐段计算是工程实践的标准方法,精度可控。
  • 距离闭环校验是避免设计错误的关键步骤。

下一讲,我们会深入讨论牵引计算模型,包括阻力公式、牵引特性曲线、制动特性曲线这些更具体的内容。到时候我会带大家手算一个完整的案例。

今天就到这里。有什么问题,欢迎课后交流。