给定一条几何车道,我如何告诉汽车一条路径?

Given a geometric lane, how can I tell a car a path follow?

我正在尝试让汽车沿车道行驶。我知道车道的所有点,至于现在车道表示为多边形,由两组线段界定。给定这两个边界,我想找到另一组汽车可以行驶的线段,就像铁路一样,这样它总是在两个边界线段之间。每个边界线段中的线数可能并不总是相同,线段不是 "parallel".

图表(这是一个相当简单的图表,但我相信它传达了信息):

我考虑过以下方法,但我没有看到它们起作用,或者至少没有效率:

  1. 将其拆分为四边形,或四边形和三角形,
  2. 从一条长度为 10 的直线开始,然后旋转它直到它的终点与边界两侧的距离相等,然后重复
  3. 对于每个输出段,平均两个边界边的斜率。

我还想到了几个,但不提也罢

感谢您的帮助,有任何问题欢迎随时提问

首先,如果您已经设计了一些代码部分,然后放入您的 question.Either 只有分析才能让您有很多选择,它可以通过 java /python 两者来完成。

我只是给你看一个简单的例子,它详细说明了地图中使用的 path/lane 追随者。

private void CarMove(final Marker marker, final LatLng beginLatLng, final LatLng endLatLng, final long duration) {
        final Handler handler = new Handler();
        final long startTime = SystemClock.uptimeMillis();

        final Interpolator interpolator = new LinearInterpolator();

        // set car bearing for current part of path
        float angleDeg = (float)(180 * getAngle(beginLatLng, endLatLng) / Math.PI);
        Matrix matrix = new Matrix();
        matrix.postRotate(angleDeg);
        marker.setIcon(BitmapDescriptorFactory.fromBitmap(Bitmap.createBitmap(mMarkerIcon, 0, 0, mMarkerIcon.getWidth(), mMarkerIcon.getHeight(), matrix, true)));

        handler.post(new Runnable() {
            @Override
            public void run() {
                // calculate phase of animation
                long elapsed = SystemClock.uptimeMillis() - startTime;
                float t = interpolator.getInterpolation((float) elapsed / duration);
                // calculate new position for marker
                double lat = (endLatLng.latitude - beginLatLng.latitude) * t + beginLatLng.latitude;
                double lngDelta = endLatLng.longitude - beginLatLng.longitude;

                if (Math.abs(lngDelta) > 180) {
                    lngDelta -= Math.signum(lngDelta) * 360;
                }
                double lng = lngDelta * t + beginLatLng.longitude;

                marker.setPosition(new LatLng(lat, lng));

                // if not end of line segment of path 
                if (t < 1.0) {
                    // call next marker position
                    handler.postDelayed(this, 16);
                } else {
                    // call turn animation
                    nextTurnAnimation();
                }
            }
        });
    } 

以下思路受到Dynamic Time Warping(DTW)的启发。它是 Shreyas Pimpalgaonkar 在评论中的想法的扩展:

总体思路是将街道一侧的点与另一侧的点相匹配。例如,沿两侧分布 100 个点并尝试在它们之间画线。我们要用来匹配点的标准是接近度。因此,连接线的总长度应尽可能小。一旦我们有了这些线,我们就可以计算它们的中点并将它们连接起来。这也会给你一条更平滑的线,具体取决于你开始的点数。

这里有一些细节:分配点数并不难。您可以每 x 个单位放点。或者您可以在段上分配固定数量的点。最后,积分怎么分配都没有太大关系。不过,均匀分布会给您带来更好的结果。

中心点是 DTW 变体。该算法的基本数据是一个匹配矩阵,它告诉您将一点与另一点匹配的成本。为此,您可以使用两点的欧氏距离。一旦你有了这个矩阵(它不需要是一个完整的矩阵;对角线附近的条目通常就足够了;请参阅维基百科文章中的局部约束),你只需使用动态程序解决翘曲问题。

最后,您连接到中点。就是这样。

我要补充一点,这不一定保证路径保持在车道内。但是,它只会在非常奇怪的道路星座时中断。如果你想安全起见,你可以调整成本矩阵,这样算法就不会匹配连接线穿过车道边界的点。

这里有一些例子。如果您需要更平滑的路径,您可以更改您在连接线上选择的点(而不是中点)。你可以例如优化关于生成线的拉普拉斯算子的插值参数。这将为您提供一个线性方程组,让您可以控制路径的平滑度。然而,要保证路径不再位于车道内并不容易。