车就在车道里。下面的图都是从天上往下看的:灰色虚线不是路边,是车道正中间那条线(CARLA 里的红点连起来,每 0.5 米一颗)。 我们要量车的中心点 P 偏离这条线多少:新尺子横着量到中心线上正好在车旁边的那个点 F(叫垂足);老尺子斜着量到最近那颗红点。
① 从天上往下看一段车道(真实比例)
② 放大蓝框:两颗红点 A、B 之间这一小段(整张图都在车道里面)
拖动圆点 P(车的中心点)或红点 B;选中后也可以用方向键挪,每次 0.01 米。
dx, dy = bx - ax, by - ayseg_len2 = dx * dx + dy * dy(px - ax), (py - ay)t = ((px - ax) * dx + (py - ay) * dy) / seg_len2t = max(0.0, min(1.0, t))fx, fy = ax + t * dx, ay + t * dyreturn math.hypot(px - fx, py - fy)还是从天上往下看。一个 point_to_segment_m 只认一小段(两颗红点之间),到段的尽头线就断了,所以车开过 B 时它只能斜着量到 B。B 后面归下一段管。拖动 P 试试。
下一步要敲的(先看懂图,不用现在敲)
def lateral_error_m(path, x_m, y_m):
"""车到中心线(一串红点连成的折线)的最短距离:每段量一次,取最小。"""
segs = zip(path, path[1:]) # 相邻两颗红点配成一段
return min(point_to_segment_m(x_m, y_m, ax, ay, bx, by)
for (ax, ay), (bx, by) in segs)
新算法算的是车到墙的垂直距离,老算法算的是类似三角形第三条边的距离。你的结论 · 2026-10-18