udacity_highway02
高速上的自动驾驶2
需要给路径持续的添加新的点
1 | vector next_x_vals; |
仿真循环
坐标系是以自身为坐标,车头朝向为x,左侧为y。
仿真器的循环是每20ms(一秒50帧)。所写程序至少能提供一个20ms之后的路径。
这意味着当涉及更高的延迟时,使用先前的路径数据变得更加重要。
只要新路径包含之前路径的足够长度,过渡仍将是平滑的。
高速地图
1 | 784.6001 1135.571 0 -0.02359831 -0.9997216 |
高速地图的坐标信息存储在csv文件里,从左到右分别是:x,y,s,vector d
这个(x,y)是全球地图坐标,s是Frenet坐标,d是中线的法向向量,行驶方向的右手侧,模是1. 这个坐标给的是地图六个车道(双向车道,各三条)的双黄线中间的坐标。然后每个车道是4m, 所以如果想得到行驶方向最左侧车道的坐标,即 (x,y)需要加上,2乘以向量d. 如果是中间车道(行驶方向),则是(x,y)加上6(2+4)乘以法向向量d。
需要完成坐标之间转换的代码,从frenet到(x,y)
插值法
如果想要获得平滑的,或者估计在两点之间的坐标,就需要用插值法。
插值法,可以用贝塞尔去拟合,或者用样条插值(spline fititng) 可以生成曲线过所有的点。
在c++里可以使用 简单的,便捷的https://kluge.in-chemnitz.de/opensource/spline/.
spline tool. 只需要一个简单的头文件。
使用这个可以达到 用 Cubic C^2 twice continuously differentiable
或者 C^1 Hermite once continuously differentiable
插值 或者 C^1 monotonic插值.
头文件:
https://kluge.in-chemnitz.de/opensource/spline/spline.h
代码:1
2
3
4
5
6
7
8
9
10
11
12
13#include <cstdio>
#include <vector>
#include "spline.h"
int main(int, char**) {
std::vector<double> X = {0.1, 0.4, 1.2, 1.8, 2.0}; // must be increasing
std::vector<double> Y = {0.1, 0.7, 0.6, 1.1, 0.9};
tk::spline s(X,Y);
double x=1.5, y=s(x), deriv=s.deriv(1,x);
printf("spline at %f is %f with derivative %f\n", x, y, deriv);
}
输出:spline at 1.500000 is 0.915345 with derivative 1.223601