You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

速度控制算法中的波动、精度误差等问题修复:我的实现思路是否正确?

速度控制算法中的波动、精度误差等问题修复:我的实现思路是否正确?

Problem:

我希望我的"Follow Coordinates System (FCS)"能够在保持梯形速度曲线的前提下,到达"Set Coordinates System (SCS)"的位置,使用给定的限制速度和加速度参数。但我遇到了一些问题,比如速度波动、无法精准到达目标位置,这可能是精度误差导致的。尽管测试了各种解决方案,我还是没能得到持续稳定的正向结果。

System Behavior:

  • FCS和SCS的起始位置是随机的。一旦FCS到达SCS的目标位置(linear_distance < 1e-3),SCS就会随机移动到新的位置……目前是这样,但未来我希望SCS可以在任意时刻随机、不可预测地移动,不用等FCS到达。
  • 每一步开始时先计算FCS的线速度,然后根据FCS到SCS的归一化方向向量,将速度按比例分配到X、Y、Z三个轴上。
  • 加速度是从速度计算出来的,位置则基于速度更新。从加速度开始计算(加速度→速度→位置)的方式变得过于复杂且难以调试,但我愿意再尝试一次。

My failing algorithm (Python):

Part 1. Linear velocity calculations:

for step in range(cycles):

    axis_distance = np.array(current_scs[:3]) - np.array(current_fcs[:3])
    linear_distance = np.linalg.norm(axis_distance)

    breaking_distance = (linear_velocity[-1]**2) / (2 * max_deceleration)
    
    # Acceleration or constant velocity phase
    if linear_distance > breaking_distance:
        if np.abs(max_velocity - linear_velocity[-1]) > max_acceleration * cycle_time: # Preventing overshooting max_velocity
            linear_velocity.append(linear_velocity[-1] + max_acceleration * cycle_time)
        else:
            linear_velocity.append(max_velocity)  
    # Deceleration phase
    else:
        if linear_velocity[-1] > max_deceleration * cycle_time: # Preventing overshooting 0
            linear_velocity.append(linear_velocity[-1] - max_deceleration * cycle_time)
        else:
            linear_velocity.append(0)

    linear_acceleration.append((linear_velocity[-1] - linear_velocity[-2]) / cycle_time)

Part 2. Dividing linear velocity among the XYZ:

for i in range(3):

        factor = axis_distance[i] / linear_distance if linear_distance != 0 else 0

        new_axis_velocity = linear_velocity[-1] * factor
        
        if velocity[i][-1] < new_axis_velocity:
            velocity[i].append(velocity[i][-1] + np.min([max_acceleration * cycle_time, new_axis_velocity - velocity[i][-1]]))
            #print(f"{step} accelerating at axis {i}")
        elif velocity[i][-1] > new_axis_velocity:
            velocity[i].append(velocity[i][-1] - np.min([max_deceleration * cycle_time, velocity[i][-1] - new_axis_velocity]))
            #print(f"{step} decelerating at axis {i}")
        else:
            velocity[i].append(velocity[i][-1])
            #print(f"{step} target velocity for axis {i} reached")
        
                               
        acceleration[i].append((velocity[i][-1] - velocity[i][-2]) / cycle_time)
        
        current_fcs[i] += velocity[i][-1] * cycle_time

Output:

为了跟踪进度,我会记录数据并绘制图表。这就是为什么比如速度现在是数组的数组,完成后就不会这样了。以下是一组图表情况:

  • 第一张图表:可以看到FCS轨迹一开始没命中SCS,但之后成功命中了后续的位置,减速也正常。
    对应的日志输出:
SCS reached at 5574 : linear_distance = 0.0008199809854013105, linear_velocity = 2.7999999999649416
SCS reached at 9163 : linear_distance = 0.0008934633980521272, linear_velocity = 0.7999999999478358
  • 第二张图表:注意图例标注错误,橙色线条实际是线加速度!
  • 第三张图表:展示的是线速度分配到XYZ轴之后的情况

Concerns:

我可以继续尝试修复,但不确定一开始的实现思路是否正确。我没有控制理论和运动规划的背景知识。

我正在寻求反馈和任何解决当前问题的建议!

备注:内容来源于stack exchange,提问作者Imm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:19:50