-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAlgorithm.m
More file actions
135 lines (92 loc) · 4.04 KB
/
Copy pathAlgorithm.m
File metadata and controls
135 lines (92 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
clear
close all
clc
data=load('Data.mat');
[I,I_tr]=LaneChangeExtraction(data);
geoplot(data.lat_tractor(I(1:2)),data.long_tractor(I(1:2)),'-b','linewidth',2)
hold on
geoplot(data.lat_tractor(I_tr(1:2)),data.long_tractor(I_tr(1:2)),'--r','linewidth',2)
geoplot(data.lat_road,data.long_road,'y','linewidth',1)
legend('Tractor','Trailer','Road','interpreter','latex')
x0=10;
y0=5;
width=9;
height=6.5;
set(gcf,'units','centimeters','position',[x0,y0,width,height])
%% Function for lane change extraction
function [I,I_tr] = LaneChangeExtraction(data)
yawrate_tractor = data.yawrate_tractor;
yawrate_trailer = data.yawrate_trailer;
yawangle_trailer = data.yawangle_trailer;
x_tractor=data.x_tractor;
y_tractor=data.y_tractor;
x_road= data.x_road;
y_road= data.y_road;
head_angle_road=data.head_angle_road;
time=data.time;
interval_info=[];
lanechange_info=[];
I=[];
I_tr=[];
k=1;
yawrate_thres=1;
interval_time=5;
zero_crossing=[];
% Zero crossing for tractor and trailer
while(k~=length(yawrate_tractor)-1)
if(yawrate_tractor(k)*yawrate_tractor(k+1)<= 0 || k==1)
m=k+1;
while( m < length(yawrate_trailer))
if(yawrate_trailer(m)*yawrate_trailer(m+1)<=0 )
break;
end
m=m+1;
end
zero_crossing(end+1,:)=[k+1 m];
end
k=k+1;
end
% Yaw rate threshold
for i=1:length(zero_crossing)-1
max_yawrate=max(abs(yawrate_tractor(zero_crossing(i,1):zero_crossing(i+1,1))));
if(max_yawrate> yawrate_thres)
interval_info(end+1,:)=[zero_crossing(i,1) zero_crossing(i+1,1) zero_crossing(i+1,2) ...
max_yawrate*sign(mean(yawrate_tractor(zero_crossing(i,1):zero_crossing(i+1,1))))];
end
end
k = 1;
i = 1;
% Stacking up intervals
while(i<=size(interval_info,1)-1)
% Time threshold condition
if((time(interval_info(i+1,1))-time(interval_info(i,2))) <= interval_time ...
&& (interval_info(i,4))*(interval_info(i+1,4))<0)
% Lateral Displacement calculation
[~,start_indx]=min(sqrt((x_tractor(interval_info(i,1))- (x_road)).^2 + (y_tractor(interval_info(i,1))- (y_road)).^2));
[~,end_indx]=min(sqrt((x_tractor(interval_info(i+1,2))- (x_road)).^2 + (y_tractor(interval_info(i+1,2))- (y_road)).^2));
angle_road_end= wrapTo180(head_angle_road(end_indx)-180);
end_start_road_yaw=atan2d(y_road(start_indx)-y_road(end_indx),x_road(start_indx)-x_road(end_indx));
lat_disp_road = (sqrt((y_road(end_indx)-y_road(start_indx))^2 + (x_road(end_indx)-x_road(start_indx))^2))*sind(abs(end_start_road_yaw-angle_road_end));
yaw_road_end = angle_road_end;
end_start_truck_yaw=atan2d(y_tractor(interval_info(i,1))-y_tractor(interval_info(i+1,2)),x_tractor(interval_info(i,1))-x_tractor(interval_info(i+1,2)));
lat_disp_truck=sqrt((x_tractor(interval_info(i,1))-x_tractor(interval_info(i+1,2)))^2+...
(y_tractor(interval_info(i,1))-y_tractor(interval_info(i+1,2)))^2)*...
sind(abs(end_start_truck_yaw-yaw_road_end));
lanechange_info(k,1) = interval_info(i,1); % Tractor start interval 1
lanechange_info(k,2) = interval_info(i,2); % Tractor end interval 1
lanechange_info(k,3) = interval_info(i,3); % Trailer end interval 1
lanechange_info(k,4) = interval_info(i+1,2); % Tractor end interval 2
lanechange_info(k,5) = interval_info(i+1,3); % Trailer end interval 2
% Lateral displacement and yaw angle threshold.
if(abs(lat_disp_road-lat_disp_truck)<=7.5 && abs(lat_disp_road-lat_disp_truck)>=2 &&...
abs(max(yawangle_trailer(lanechange_info(k,1):lanechange_info(k,5)))-...
min(yawangle_trailer(lanechange_info(k,1):lanechange_info(k,5))))<20)
I(end+1,:)=[lanechange_info(k,1) lanechange_info(k,4)];
I_tr(end+1,:)=[lanechange_info(k,1) lanechange_info(k,5)];
end
k=k+1;
y_dot=[];
end
i=i+1;
end
end