给定一条几何车道,我如何告诉汽车一条路径?
Given a geometric lane, how can I tell a car a path follow?
我正在尝试让汽车沿车道行驶。我知道车道的所有点,至于现在车道表示为多边形,由两组线段界定。给定这两个边界,我想找到另一组汽车可以行驶的线段,就像铁路一样,这样它总是在两个边界线段之间。每个边界线段中的线数可能并不总是相同,线段不是 "parallel".
图表(这是一个相当简单的图表,但我相信它传达了信息):
我考虑过以下方法,但我没有看到它们起作用,或者至少没有效率:
- 将其拆分为四边形,或四边形和三角形,
- 从一条长度为 10 的直线开始,然后旋转它直到它的终点与边界两侧的距离相等,然后重复
- 对于每个输出段,平均两个边界边的斜率。
我还想到了几个,但不提也罢
感谢您的帮助,有任何问题欢迎随时提问
首先,如果您已经设计了一些代码部分,然后放入您的 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 变体。该算法的基本数据是一个匹配矩阵,它告诉您将一点与另一点匹配的成本。为此,您可以使用两点的欧氏距离。一旦你有了这个矩阵(它不需要是一个完整的矩阵;对角线附近的条目通常就足够了;请参阅维基百科文章中的局部约束),你只需使用动态程序解决翘曲问题。
最后,您连接到中点。就是这样。
我要补充一点,这不一定保证路径保持在车道内。但是,它只会在非常奇怪的道路星座时中断。如果你想安全起见,你可以调整成本矩阵,这样算法就不会匹配连接线穿过车道边界的点。
这里有一些例子。如果您需要更平滑的路径,您可以更改您在连接线上选择的点(而不是中点)。你可以例如优化关于生成线的拉普拉斯算子的插值参数。这将为您提供一个线性方程组,让您可以控制路径的平滑度。然而,要保证路径不再位于车道内并不容易。
我正在尝试让汽车沿车道行驶。我知道车道的所有点,至于现在车道表示为多边形,由两组线段界定。给定这两个边界,我想找到另一组汽车可以行驶的线段,就像铁路一样,这样它总是在两个边界线段之间。每个边界线段中的线数可能并不总是相同,线段不是 "parallel".
图表(这是一个相当简单的图表,但我相信它传达了信息):
我考虑过以下方法,但我没有看到它们起作用,或者至少没有效率:
- 将其拆分为四边形,或四边形和三角形,
- 从一条长度为 10 的直线开始,然后旋转它直到它的终点与边界两侧的距离相等,然后重复
- 对于每个输出段,平均两个边界边的斜率。
我还想到了几个,但不提也罢
感谢您的帮助,有任何问题欢迎随时提问
首先,如果您已经设计了一些代码部分,然后放入您的 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 变体。该算法的基本数据是一个匹配矩阵,它告诉您将一点与另一点匹配的成本。为此,您可以使用两点的欧氏距离。一旦你有了这个矩阵(它不需要是一个完整的矩阵;对角线附近的条目通常就足够了;请参阅维基百科文章中的局部约束),你只需使用动态程序解决翘曲问题。
最后,您连接到中点。就是这样。
我要补充一点,这不一定保证路径保持在车道内。但是,它只会在非常奇怪的道路星座时中断。如果你想安全起见,你可以调整成本矩阵,这样算法就不会匹配连接线穿过车道边界的点。
这里有一些例子。如果您需要更平滑的路径,您可以更改您在连接线上选择的点(而不是中点)。你可以例如优化关于生成线的拉普拉斯算子的插值参数。这将为您提供一个线性方程组,让您可以控制路径的平滑度。然而,要保证路径不再位于车道内并不容易。