在 Frenet 坐标系下进行车辆运动控制,通常将任务分解为横向控制(Lateral Control)和纵向控制(Longitudinal Control)。引入前馈控制(Feedforward)是为了补偿道路几何形状(如弯道)或目标速度变化带来的滞后,从而提高控制精度。
以下是结合前馈的 PID 控制:
1. 横向控制:追踪中心线

-
PID 部分(反馈):主要消除由于模型不准、侧风或路面干扰产生的瞬态误差。
-
比例 ( P):纠正当前的横向位置偏差 d。
-
积分 (I):消除稳态误差(如斜坡路面或底盘偏置)。
-
微分 (D):抑制震荡,提供阻尼。
-
-
前馈部分 (Feedforward):基于道路曲率 κ 的补偿。
-
原理:在弯道上,即使偏差为零,车辆也需要一定的转向角来维持弯道行驶。
-
公式推导 :前馈转向角
这让控制器提前预知前方道路的变化。
-
2. 纵向控制:速度与位置跟踪

- PID 部分(反馈) :
- P/I/D :根据速度误差 Verror = Vtarget − Vcurrent调节加速度指令(油门/刹车)。
- 前馈部分 (Feedforward) :
- 坡道补偿:利用坡度信息补偿重力分量,防止上坡减速、下坡加速。
- 目标加速度前馈:如果轨迹规划器给出了目标加速度,直接将其作为前馈项加入,可以极大地提高对加减速指令的响应速度。
3. 综合控制律表述


核心优势:
- 解耦简化:Frenet 坐标系将复杂的 2D 路径跟踪简化为一维的距离偏差控制。
- 响应更快:前馈项处理了"已知"的道路变化(曲率),反馈项只处理"未知"的扰动。
- 稳态误差小:在持续转弯时,前馈确保了车辆不会因为 PID 的滞后而偏向弯道外侧。
4.横向控制代码示意:
python:
bash
# PID_controller.py
import numpy as np
import math
from time import sleep
from time import time
"""
PID控制器类实现
包括增量式和位置式
"""
# 位置式
class PID_posi:
"""位置式实现1
"""
def __init__(self, kp, ki, kd, target, upper=1., lower=-1.):
self.kp = kp
self.ki = ki
self.kd = kd
self.err = 0
self.err_last = 0
self.err_all = 0
self.target = target
self.upper = upper
self.lower = lower
self.value = 0
def cal_output(self, state):
self.err = self.target - state
# self.err =state-self.target
self.value = self.kp * self.err + self.ki * \
self.err_all + self.kd * (self.err - self.err_last)
self.update()
return self.value
def update(self):
self.err_last = self.err
self.err_all = self.err_all + self.err
if self.value > self.upper:
self.value = self.upper
elif self.value < self.lower:
self.value = self.lower
def auto_adjust(self, Kpc, Tc):
self.kp = Kpc * 0.6
self.ki = self.kp / (0.5 * Tc)
self.kd = self.kp * (0.125 * Tc)
return self.kp, self.ki, self.kd
def set_pid(self, kp, ki, kd):
self.kp = kp
self.ki = ki
self.kd = kd
def reset(self):
self.err = 0
self.err_last = 0
self.err_all = 0
def set_target(self, target):
self.target = target
class PID_posi_2:
"""位置式实现2
"""
def __init__(self, k=[1., 0., 0.], target=1.0, upper=1.0, lower=-1.0):
self.kp, self.ki, self.kd = k
self.e = 0 # error
self.pre_e = 0 # previous error
self.sum_e = 0 # sum of error
self.target = target # target
self.upper_bound = upper # upper bound of output
self.lower_bound = lower # lower bound of output
def set_target(self, target):
self.target = target
def set_k(self, k):
self.kp, self.ki, self.kd = k
def set_bound(self, upper, lower):
self.upper_bound = upper
self.lower_bound = lower
def cal_output(self, state): # calculate output
self.e = self.target - state
u = self.e * self.kp + self.sum_e * \
self.ki + (self.e - self.pre_e) * self.kd
if u < self.lower_bound:
u = self.lower_bound
elif u > self.upper_bound:
u = self.upper_bound
self.pre_e = self.e
self.sum_e += self.e
# print(self.sum_e)
return u
def reset(self):
# self.kp = 0
# self.ki = 0
# self.kd = 0
self.e = 0
self.pre_e = 0
self.sum_e = 0
# self.target = 0
def set_sum_e(self, sum_e):
self.sum_e = sum_e
# 增量式
class PID_inc:
"""增量式实现
"""
def __init__(self, k, target, upper=1., lower=-1.):
self.kp, self.ki, self.kd = k
self.err = 0
self.err_last = 0
self.err_ll = 0
self.target = target
self.upper = upper
self.lower = lower
self.value = 0
self.inc = 0
def cal_output(self, state):
self.err = self.target - state
self.inc = self.kp * (self.err - self.err_last) + self.ki * self.err + self.kd * (
self.err - 2 * self.err_last + self.err_ll)
self._update()
return self.value
def _update(self):
self.err_ll = self.err_last
self.err_last = self.err
self.value = self.value + self.inc
if self.value > self.upper:
self.value = self.upper
elif self.value < self.lower:
self.value = self.lower
def set_target(self, target):
self.target = target
def set_k(self, k):
self.kp, self.ki, self.kd = k
def set_bound(self, upper, lower):
self.upper_bound = upper
self.lower_bound = lower
bash
# PID_demo.py
from scipy.spatial import KDTree
from celluloid import Camera # 保存动图时用,pip install celluloid
from PID_controller import PID_posi_2, PID_inc
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import math
class KinematicModel_3:
"""假设控制量为转向角delta_f和加速度a
"""
def __init__(self, x, y, psi, v, L, dt):
self.x = x
self.y = y
self.psi = psi
self.v = v
self.L = L
# 实现是离散的模型
self.dt = dt
def update_state(self, a, delta_f):
self.x = self.x+self.v*math.cos(self.psi)*self.dt
self.y = self.y+self.v*math.sin(self.psi)*self.dt
self.psi = self.psi+self.v/self.L*math.tan(delta_f)*self.dt
self.v = self.v+a*self.dt
def get_state(self):
return self.x, self.y, self.psi, self.v
## 位置式
PID = PID_posi_2(k=[2, 0.01, 30], target=0, upper=np.pi/6, lower=-np.pi/6)
## 增量式
# PID = PID_inc(k=[2.5, 0.175, 30], target=0, upper=np.pi/6, lower=-np.pi/6)
def cal_target_index(robot_state,refer_path):
"""得到临近的路点
Args:
robot_state (_type_): 当前车辆位置
refer_path (_type_): 参考轨迹(数组)
Returns:
_type_: 最近的路点的索引
"""
dists = []
for xy in refer_path:
dis = np.linalg.norm(robot_state-xy)
dists.append(dis)
min_index = np.argmin(dists)
return min_index
def main():
# set reference trajectory
refer_path = np.zeros((1000, 2))
refer_path[:, 0] = np.linspace(0, 100, 1000) # 直线
# +2.5*np.cos(refer_path[:,0]/2.0) # 生成正弦轨迹
refer_path[:, 1] = 2*np.sin(refer_path[:, 0]/3.0)
refer_tree = KDTree(refer_path) # reference trajectory
# 假设初始状态为x=0,y=-1,偏航角=0.5rad,前后轴距离2m,速度为2m/s,时间步为0.1秒
ugv = KinematicModel_3(0, -1, 0.5, 2, 2, 0.1)
k = 0.1
c = 2
x_ = []
y_ = []
fig = plt.figure(1)
# 保存动图用
camera = Camera(fig)
for i in range(550):
robot_state = np.zeros(2)
robot_state[0] = ugv.x
robot_state[1] = ugv.y
distance, ind = refer_tree.query(robot_state) # 在参考轨迹上查询离robot_state最近的点
# ind = cal_target_index(robot_state,refer_path) # 使用简单的一个函数实现查询离robot_state最近的点,耗时比较长
alpha = math.atan2(
refer_path[ind, 1]-robot_state[1], refer_path[ind, 0]-robot_state[0])
l_d = np.linalg.norm(refer_path[ind]-robot_state)
# l_d = k*ugv.v+c # 前视距离
theta_e = alpha-ugv.psi
e_y = -l_d*math.sin(theta_e) # 与博客中公式相比多了个负号,我目前还不是太理解,暂时先放着
# e_y = -l_d*np.sign(math.sin(theta_e)) # 第二种误差表示
# e_y = robot_state[1]-refer_path[ind, 1] #第三种误差表示
# PID.set_target(0)
# print(refer_path[i,1])
delta_f = PID.cal_output(e_y)
# print(e_y)
# print(alpha)
ugv.update_state(0, delta_f) # 加速度设为0
x_.append(ugv.x)
y_.append(ugv.y)
# 显示动图
plt.cla()
plt.plot(refer_path[:, 0], refer_path[:, 1], '-.b', linewidth=1.0)
plt.plot(x_, y_, "-r", label="trajectory")
plt.plot(refer_path[ind, 0], refer_path[ind, 1], "go", label="target")
# plt.axis("equal")
plt.grid(True)
plt.pause(0.001)
# camera.snap()
# animation = camera.animate()
# animation.save('trajectory.gif')
plt.figure(2)
plt.plot(refer_path[:, 0], refer_path[:, 1], '-.b', linewidth=1.0)
plt.plot(x_, y_, 'r')
plt.show()
if __name__=='__main__':
main()
matlab(详见附件资源vc_pid):
bash
% check_datain_value.m
%%%%%%%%%%%%%%%%
%%%% PID Controller
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;close all;clc
trajbase = load("traj_base.txt");
currentPose = zeros(1,3);
pidValue = zeros(1,2);
wheelbase = 2.5;
velocity = 1.3;
cycTime = 0.02;
time_num = size(trajbase,1);
currentPose(1,1) = trajbase(1,1) + 0.3;
currentPose(1,2) = trajbase(1,2) + 0.2;
currentPose(1,3) = trajbase(1,3) + 0.0;
figure(1)
plot(trajbase(:,1),trajbase(:,2),"r-*");
hold on
for ii_temp = 1:time_num
[ctrlSa,pidValue] = pidctrol(currentPose,pidValue,trajbase);
currentPose(1,1) = currentPose(1,1) + velocity * cycTime * cos(currentPose(1,3)); %% velocity = 1.3m/s
currentPose(1,2) = currentPose(1,2) + velocity * cycTime * sin(currentPose(1,3));
currentPose(1,3) = currentPose(1,3) + velocity/(wheelbase/tan(ctrlSa)) *cycTime; %% Time = 0.02
plot(currentPose(1,1),currentPose(1,2),"b-o");
end
hold off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% NO MORE %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bash
% pidctrol.m
function [ctrolU,backPidErr] = pidctrol(currentPose,pidValueIn,trajectoryPath)
%%%% set param
setParamP = 0.8;
setParamI = 0.026;
setParamD = 0.0;
lastErr = pidValueIn(1,1); %% 上一周期误差
integralErr = pidValueIn(1,2); %% 累计误差(误差积分量)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% get nearest point %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
devDistance = trajectoryPath(:,1:2) - currentPose(1:2);
disDouble = devDistance(:,1).^2 + devDistance(:,2).^2;
[~,poseIndex] = min(disDouble); %找路径最近点索引
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% get interpoint %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if poseIndex>1
behindIndex = poseIndex -1;
else
behindIndex = poseIndex;
end
if poseIndex<length(trajectoryPath)
frontIndex = poseIndex +1;
else
frontIndex = poseIndex;
end
xDev = trajectoryPath(frontIndex,1) - trajectoryPath(behindIndex,1);
yDev = trajectoryPath(frontIndex,2) - trajectoryPath(behindIndex,2);
DisTwopoint = sqrt(xDev*xDev + yDev*yDev);
vectorOne(1,1) = currentPose(1,1) - trajectoryPath(behindIndex,1);
vectorOne(1,2) = currentPose(1,2) - trajectoryPath(behindIndex,2);
vectionProjection = (vectorOne(1,1)*xDev + vectorOne(1,2)*yDev)/DisTwopoint;
rateDis = vectionProjection/DisTwopoint;
if (DisTwopoint == 0 || (0>rateDis && 1< rateDis))
interIndexPosex = trajectoryPath(behindIndex,1);
interIndexPosey = trajectoryPath(behindIndex,2);
% interIndexPoseyaw = trajectoryPath(behindIndex,3);
else
interIndexPosex = (1-rateDis)*trajectoryPath(behindIndex,1) + rateDis*trajectoryPath(frontIndex,1);
interIndexPosey = (1-rateDis)*trajectoryPath(behindIndex,2) + rateDis*trajectoryPath(frontIndex,2);
% interIndexPoseyaw = (1-rateDis)*trajectoryPath(behindIndex,3) + rateDis*trajectoryPath(frontIndex,3);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% get devDis on base Coordinate %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xDevPidIn = interIndexPosex - currentPose(1,1);
yDevPidIn = interIndexPosey - currentPose(1,2);
lcos = cos(currentPose(1,3));
lsin = sin(currentPose(1,3));
% xDevErr = lcos*xDevPidIn + lsin*yDevPidIn;
currentErr = -lsin*xDevPidIn + lcos*yDevPidIn;
pidErr = currentErr;
pidErrLast = lastErr;
pidIntegral = integralErr + currentErr;
ctrolU = setParamP*pidErr + setParamI*pidIntegral + setParamD*(pidErr - pidErrLast);
backPidErr(1,1) = currentErr;
backPidErr(1,2) = pidIntegral;
end
bash
# traject_path
30.891991 -3.934486 -0.730344 -0.122568 7.545637 37.371639 0.000000 1
30.922401 -3.930654 -0.740964 -0.120911 7.636809 37.404114 0.000000 1
30.953186 -3.927172 -0.751583 -0.119255 7.727982 37.436584 0.000000 1
30.984356 -3.924051 -0.762202 -0.117598 7.819154 37.469059 0.000000 1
30.996197 -3.940738 -0.766486 -0.117253 7.754245 37.500019 0.000000 1
31.008099 -3.957484 -0.770768 -0.116907 7.689337 37.530983 0.000000 1
31.020061 -3.974291 -0.775051 -0.116562 7.624428 37.561943 0.000000 1
31.032085 -3.991152 -0.779335 -0.116217 7.559519 37.592903 0.000000 1
31.063742 -3.987585 -0.790253 -0.116217 7.432252 37.625099 0.000000 1
31.095795 -3.984408 -0.801170 -0.116217 7.304985 37.657295 0.000000 1
31.128220 -3.981624 -0.812087 -0.116217 7.177718 37.689487 0.000000 1
31.161022 -3.979239 -0.823004 -0.116217 7.050450 37.721680 0.000000 1
31.185925 -3.986138 -0.831237 -0.115811 7.146457 37.754353 0.000000 1
31.211037 -3.993263 -0.839470 -0.115405 7.242463 37.787025 0.000000 1
31.236359 -4.000628 -0.847702 -0.114999 7.338470 37.819695 0.000000 1
31.261887 -4.008220 -0.855935 -0.114594 7.434476 37.852367 0.000000 1
31.280989 -4.018414 -0.862398 -0.113532 7.390316 37.882172 0.000000 1
31.300213 -4.028756 -0.868860 -0.112469 7.346155 37.911976 0.000000 1
31.319561 -4.039238 -0.875323 -0.111407 7.301995 37.941780 0.000000 1
31.339043 -4.049873 -0.881786 -0.110345 7.257834 37.971581 0.000000 1
31.399000 -4.027748 -0.899777 -0.109739 7.109970 38.001812 0.000000 1
31.459883 -4.006786 -0.917767 -0.109134 6.962105 38.032047 0.000000 1
31.521675 -3.987010 -0.935758 -0.108529 6.814240 38.062279 0.000000 1
31.584347 -3.968436 -0.953749 -0.107923 6.666376 38.092510 0.000000 1
31.582483 -3.997124 -0.954208 -0.107732 6.647964 38.122639 0.000000 1
31.580616 -4.025813 -0.954668 -0.107540 6.629552 38.152763 0.000000 1
31.578754 -4.054500 -0.955129 -0.107349 6.611141 38.182896 0.000000 1
31.576887 -4.083193 -0.955589 -0.107157 6.592729 38.213020 0.000000 1
31.597788 -4.099357 -0.961760 -0.106483 6.578066 38.245583 0.000000 1
31.618790 -4.115659 -0.967933 -0.105809 6.563402 38.278141 0.000000 1
31.639889 -4.132116 -0.974103 -0.105134 6.548739 38.310703 0.000000 1
31.661091 -4.148710 -0.980275 -0.104460 6.534076 38.343262 0.000000 1
31.697363 -4.155556 -0.990482 -0.102839 6.583994 38.376175 0.000000 1
31.733898 -4.162804 -1.000689 -0.101219 6.633911 38.409088 0.000000 1
31.770695 -4.170453 -1.010897 -0.099598 6.683829 38.441998 0.000000 1
31.807741 -4.178508 -1.021103 -0.097978 6.733747 38.474911 0.000000 1
31.815403 -4.205688 -1.024025 -0.095978 6.809348 38.509312 0.000000 1
31.823082 -4.232903 -1.026947 -0.093979 6.884949 38.543709 0.000000 1
31.830784 -4.260151 -1.029869 -0.091980 6.960551 38.578106 0.000000 1
31.838509 -4.287435 -1.032791 -0.089981 7.036152 38.612507 0.000000 1
31.906876 -4.278701 -1.050801 -0.083753 7.129453 38.645729 0.000000 1
31.975983 -4.271263 -1.068810 -0.077525 7.222755 38.678955 0.000000 1
32.045807 -4.265129 -1.086820 -0.071297 7.316056 38.712181 0.000000 1
32.116325 -4.260319 -1.104829 -0.065069 7.409358 38.745403 0.000000 1
32.314602 -4.292964 -1.155891 -0.042539 7.552556 38.878929 0.000000 1
32.411583 -4.380763 -1.180876 -0.023229 7.660075 39.012032 0.000000 1
32.537502 -4.465961 -1.211322 -0.014090 7.731593 39.148556 0.000000 1
32.579254 -4.590877 -1.221200 -0.012716 7.776446 39.289249 0.000000 1
32.689232 -4.694578 -1.245904 -0.011073 7.755466 39.430576 0.000000 1
32.706062 -4.833181 -1.249730 -0.011073 7.869290 39.574764 0.000000 1
32.761456 -4.952699 -1.262927 -0.011237 8.174637 39.713081 0.000000 1
32.765934 -5.086044 -1.263471 -0.012100 8.433446 39.847198 0.000000 1
32.839844 -5.193994 -1.278809 -0.016301 8.699658 39.976139 0.000000 1
32.891991 -5.321768 -1.289505 -0.024346 8.890806 40.117908 0.000000 1
32.833572 -5.494902 -1.274120 -0.029650 8.967440 40.271168 0.000000 1
32.852665 -5.648582 -1.276041 -0.035957 9.079151 40.427788 0.000000 1
32.908421 -5.794592 -1.287374 -0.040916 9.234832 40.588760 0.000000 1
32.891972 -5.971424 -1.282950 -0.041918 9.282690 40.759884 0.000000 1
33.035973 -6.103488 -1.314628 -0.041918 9.304346 40.931133 0.000000 1
33.151421 -6.247052 -1.341183 -0.041417 9.342442 41.104103 0.000000 1
33.307838 -6.398676 -1.376422 -0.031991 9.371370 41.289848 0.000000 1
33.364891 -6.568393 -1.389318 -0.021298 9.515029 41.470650 0.000000 1
33.478336 -6.737394 -1.414598 -0.016403 9.582150 41.659195 0.000000 1
33.482162 -6.926858 -1.415970 -0.011320 9.659459 41.849651 0.000000 1
33.537098 -7.105540 -1.428812 -0.009426 9.750116 42.037102 0.000000 1
33.635674 -7.275578 -1.450674 -0.009426 9.838551 42.220284 0.000000 1
33.720592 -7.446539 -1.468602 -0.010805 9.951025 42.400414 0.000000 1
33.624100 -7.645282 -1.446824 -0.011689 10.091013 42.587883 0.000000 1
33.686428 -7.832306 -1.459567 -0.012716 10.104848 42.781826 0.000000 1
33.813408 -8.006853 -1.485651 -0.012716 10.097762 42.968288 0.000000 1
33.911369 -8.181923 -1.505205 -0.012819 10.105282 43.150318 0.000000 1
33.886673 -8.367922 -1.497068 -0.016301 10.178047 43.334145 0.000000 1
33.946682 -8.544864 -1.507774 -0.018486 10.213807 43.514782 0.000000 1
33.875999 -8.729398 -1.487884 -0.018548 10.289889 43.693832 0.000000 1
34.028915 -8.896194 -1.518220 -0.018446 10.309585 43.870605 0.000000 1
34.075184 -9.071605 -1.527713 -0.017976 10.318651 44.048119 0.000000 1
34.062542 -9.244774 -1.524688 -0.015340 10.447534 44.220676 0.000000 1
34.227905 -9.405069 -1.558461 -0.011998 10.532231 44.385818 0.000000 1
34.314945 -9.567109 -1.577102 -0.007199 10.526900 44.548122 0.000000 1
34.258404 -9.731308 -1.565931 -0.004882 10.507879 44.712440 0.000000 1
34.351574 -9.890578 -1.587049 -0.002601 10.545378 44.871208 0.000000 1
34.548149 -10.067442 -1.633118 -0.001603 10.566240 45.040428 0.000000 1
34.422649 -10.226135 -1.610130 -0.001499 10.495317 45.205696 0.000000 1
34.183739 -10.376005 -1.561016 -0.001499 10.448721 45.359455 0.000000 1
34.149620 -10.534155 -1.554717 -0.001499 10.506964 45.517315 0.000000 1
34.021832 -10.693842 -1.526344 -0.001499 10.532705 45.673077 0.000000 1
33.955875 -10.854765 -1.512301 -0.001083 10.563208 45.830681 0.000000 1
34.296776 -11.008052 -1.587592 -0.000146 10.566266 45.991276 0.000000 1
34.394947 -11.168254 -1.609095 0.000000 10.554084 46.148754 0.000000 1
34.395176 -11.322209 -1.607795 0.000000 10.559736 46.303059 0.000000 1
34.327938 -11.473592 -1.592062 0.000104 10.575411 46.456631 0.000000 1
34.394314 -11.629240 -1.603956 0.002289 10.600222 46.611237 0.000000 1
34.331089 -11.792131 -1.586728 0.002289 10.574142 46.776848 0.000000 1
34.372395 -11.967844 -1.594189 0.002289 10.504057 46.952023 0.000000 1
34.389851 -12.142810 -1.597644 0.002289 10.525352 47.126595 0.000000 1
34.428436 -12.324059 -1.605718 0.002663 10.559253 47.306705 0.000000 1
34.334282 -12.504224 -1.584231 0.005338 10.598266 47.489319 0.000000 1
34.512096 -12.683338 -1.621944 0.009468 10.637362 47.662888 0.000000 1
34.443413 -12.853332 -1.605752 0.011689 10.650676 47.836185 0.000000 1
34.453957 -13.030172 -1.605785 0.012039 10.696623 48.013325 0.000000 1
34.408051 -13.202562 -1.593500 0.012675 10.721514 48.187664 0.000000 1
34.437622 -13.371203 -1.598938 0.012675 10.656884 48.355732 0.000000 1
34.325966 -13.531922 -1.573386 0.012675 10.581144 48.518364 0.000000 1
34.421078 -13.691220 -1.593668 0.012408 10.484769 48.676487 0.000000 1
34.386948 -13.842767 -1.584520 0.010723 10.395803 48.829006 0.000000 1
34.259144 -13.997062 -1.555910 0.006641 10.424545 48.983273 0.000000 1
34.192577 -14.137114 -1.540494 0.001041 10.501028 49.121788 0.000000 1
34.190109 -14.278812 -1.538942 0.000937 10.547549 49.263344 0.000000 1
34.235508 -14.418962 -1.547373 0.000625 10.601105 49.404720 0.000000 1
34.077946 -14.565643 -1.512812 0.000625 10.595890 49.544945 0.000000 1
34.120075 -14.711730 -1.521429 0.000625 10.573236 49.693176 0.000000 1
34.156700 -14.857574 -1.527583 0.000583 10.546673 49.840565 0.000000 1
34.186531 -14.999309 -1.533764 0.000521 10.533613 49.983448 0.000000 1
34.178612 -15.146132 -1.531830 0.000521 10.559302 50.129936 0.000000 1
34.197369 -15.291305 -1.535234 0.000271 10.637225 50.275726 0.000000 1
34.152351 -15.434803 -1.524231 -0.000104 10.592396 50.417255 0.000000 1
33.989029 -15.608492 -1.487345 -0.000104 10.547994 50.580029 0.000000 1
34.019714 -15.763823 -1.493515 -0.000104 10.462683 50.737659 0.000000 1
34.141666 -15.912703 -1.519968 -0.000146 10.450912 50.894329 0.000000 1
34.084675 -16.077429 -1.507416 -0.000271 10.435686 51.055763 0.000000 1
34.129337 -16.231386 -1.516857 -0.000417 10.432195 51.212269 0.000000 1
34.068573 -16.391657 -1.503024 -0.000896 10.344699 51.368694 0.000000 1
34.050095 -16.545769 -1.496939 -0.001603 10.312030 51.521118 0.000000 1
34.047554 -16.692440 -1.494485 -0.001873 10.394685 51.667206 0.000000 1
34.081413 -16.834171 -1.500924 -0.002081 10.534931 51.811165 0.000000 1
34.165302 -16.972757 -1.518457 -0.003058 10.394220 51.954712 0.000000 1
34.132164 -17.116625 -1.510929 -0.003535 10.371532 52.096642 0.000000 1
34.098934 -17.268108 -1.502601 -0.004882 10.580101 52.245766 0.000000 1
34.178497 -17.407551 -1.518562 -0.007199 10.533788 52.389759 0.000000 1
34.039749 -17.554445 -1.487542 -0.011689 10.258972 52.527046 0.000000 1
34.026230 -17.693821 -1.484334 -0.017425 9.847189 52.665173 0.000000 1
34.138130 -17.829330 -1.508481 -0.024183 9.729300 52.808949 0.000000 1
34.129646 -17.975021 -1.506865 -0.034952 9.656728 52.954170 0.000000 1
33.996384 -18.139540 -1.478362 -0.050534 9.586161 53.108471 0.000000 1
34.104591 -18.282942 -1.503756 -0.074154 9.446231 53.261395 0.000000 1
34.236881 -18.423790 -1.535149 -0.102691 9.270789 53.410133 0.000000 1
34.243130 -18.457930 -1.537734 -0.110244 9.227528 53.445141 0.000000 1
34.249386 -18.492104 -1.540319 -0.117796 9.184267 53.480145 0.000000 1
34.255638 -18.526304 -1.542904 -0.125349 9.141006 53.515148 0.000000 1
34.261887 -18.560541 -1.545489 -0.132901 9.097745 53.550159 0.000000 1
34.333267 -18.591461 -1.562322 -0.142076 9.046457 53.582947 0.000000 1
34.404636 -18.623682 -1.579155 -0.151250 8.995168 53.615742 0.000000 1
34.475998 -18.657209 -1.595988 -0.160425 8.943880 53.648529 0.000000 1
34.547340 -18.692039 -1.612821 -0.169600 8.892591 53.681324 0.000000 1
34.576797 -18.725555 -1.620898 -0.174559 8.850762 53.714031 0.000000 1
34.606239 -18.759369 -1.628975 -0.179518 8.808932 53.746746 0.000000 1
34.635674 -18.793488 -1.637052 -0.184477 8.767103 53.779461 0.000000 1
34.665077 -18.827902 -1.645128 -0.189436 8.725273 53.812176 0.000000 1
34.715923 -18.866066 -1.658308 -0.194316 8.710567 53.846790 0.000000 1
34.766701 -18.905025 -1.671488 -0.199196 8.695862 53.881409 0.000000 1
34.817398 -18.944784 -1.684667 -0.204075 8.681156 53.916023 0.000000 1
34.868011 -18.985332 -1.697847 -0.208955 8.666451 53.950642 0.000000 1
34.937477 -19.028858 -1.715718 -0.217120 8.624695 53.985161 0.000000 1
35.006741 -19.073835 -1.733589 -0.225285 8.582939 54.019691 0.000000 1
35.075760 -19.120262 -1.751461 -0.233450 8.541183 54.054211 0.000000 1
35.144516 -19.168137 -1.769332 -0.241615 8.499427 54.088734 0.000000 1
35.244221 -19.223433 -1.794993 -0.244088 8.499053 54.123070 0.000000 1
35.343254 -19.281685 -1.820655 -0.246561 8.498679 54.157410 0.000000 1
35.441540 -19.342873 -1.846317 -0.249034 8.498305 54.191750 0.000000 1
35.538998 -19.406973 -1.871980 -0.251507 8.497931 54.226086 0.000000 1
35.601059 -19.463535 -1.890437 -0.254077 8.522403 54.262012 0.000000 1
35.662643 -19.521593 -1.908896 -0.256647 8.546875 54.297943 0.000000 1
35.723701 -19.581123 -1.927355 -0.259217 8.571346 54.333870 0.000000 1
35.784214 -19.642124 -1.945814 -0.261787 8.595818 54.369801 0.000000 1
35.929951 -19.739462 -1.985187 -0.261413 8.697418 54.404827 0.000000 1
36.072819 -19.843325 -2.024560 -0.261038 8.799019 54.439850 0.000000 1
36.212559 -19.953600 -2.063934 -0.260663 8.900620 54.474876 0.000000 1
36.348930 -20.070148 -2.103307 -0.260289 9.002220 54.509907 0.000000 1
36.419544 -20.152887 -2.126946 -0.260289 9.044523 54.544556 0.000000 1
36.488808 -20.237806 -2.150586 -0.260289 9.086825 54.579201 0.000000 1
36.556652 -20.324873 -2.174224 -0.260289 9.129128 54.613842 0.000000 1
36.623039 -20.414055 -2.197863 -0.260289 9.171431 54.648491 0.000000 1
36.731514 -20.537247 -2.233586 -0.260289 9.175111 54.681927 0.000000 1
36.836380 -20.665064 -2.269310 -0.260289 9.178792 54.715355 0.000000 1
36.937462 -20.797379 -2.305033 -0.260289 9.182473 54.748791 0.000000 1
37.034611 -20.934052 -2.340756 -0.260289 9.186153 54.782219 0.000000 1
37.097130 -21.042568 -2.367139 -0.260289 9.187455 54.815025 0.000000 1
37.157356 -21.153324 -2.393521 -0.260289 9.188756 54.847828 0.000000 1
37.215244 -21.266262 -2.419904 -0.260289 9.190057 54.880634 0.000000 1
37.270729 -21.381317 -2.446287 -0.260289 9.191359 54.913433 0.000000 1
37.298866 -21.472029 -2.465561 -0.260289 9.255370 54.949097 0.000000 1
37.325672 -21.563808 -2.484835 -0.260289 9.319382 54.984760 0.000000 1
37.351120 -21.656631 -2.504108 -0.260289 9.383394 55.020428 0.000000 1
37.375202 -21.750473 -2.523382 -0.260289 9.447406 55.056091 0.000000 1
37.369297 -21.805445 -2.532326 -0.260275 9.484443 55.092583 0.000000 1
37.363087 -21.860634 -2.541271 -0.260262 9.521480 55.129078 0.000000 1
37.356575 -21.916027 -2.550215 -0.260248 9.558517 55.165569 0.000000 1
37.349762 -21.971624 -2.559159 -0.260234 9.595553 55.202065 0.000000 1
37.345787 -22.028160 -2.569216 -0.260234 9.606470 55.236259 0.000000 1
37.341438 -22.084948 -2.579271 -0.260234 9.617387 55.270454 0.000000 1
37.336685 -22.141983 -2.589327 -0.260234 9.628304 55.304649 0.000000 1
37.331543 -22.199253 -2.599382 -0.260234 9.639220 55.338848 0.000000 1
37.333271 -22.264721 -2.612187 -0.260214 9.626422 55.370831 0.000000 1
37.334351 -22.330568 -2.624992 -0.260194 9.613623 55.402809 0.000000 1
37.334782 -22.396786 -2.637797 -0.260173 9.600825 55.434784 0.000000 1
37.334553 -22.463375 -2.650602 -0.260153 9.588026 55.466759 0.000000 1
37.350845 -22.561813 -2.671549 -0.260139 9.547110 55.497852 0.000000 1
37.365341 -22.661156 -2.692495 -0.260126 9.506193 55.528942 0.000000 1
37.378014 -22.761383 -2.713442 -0.260112 9.465277 55.560036 0.000000 1
37.388847 -22.862440 -2.734388 -0.260098 9.424360 55.591125 0.000000 1