-
Notifications
You must be signed in to change notification settings - Fork 1
/
choose_orientations2.m
101 lines (78 loc) · 2.38 KB
/
choose_orientations2.m
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
% theta = choose_orientations2(x,y,phi,wtheta,wphi)
%
% we will set the orientation to theta_t = phi_t + s_t * pi
% we want to choose s_t to minimize
% \sum_t cost(s_t|s_{t-1})
% cost(s_t|s_{t-1}) = [wtheta_t*d(\theta_t,\theta_{t-1}) +
% wphi(||v_t||^2)*d(\theta_t,angle(v_t))]
%
% we will find the most likely states s_t using the recursion
% cost_t(s_t) = min_{s_{t-1}} { cost_{t-1}(s_{t-1}) + cost(s_t|s_{t-1})
%
% Inputs:
% x: N x 1 vector where x(t) is the x-coordinate of the center of the fly
% at time t
% y: N x 1 vector where y(t) is the y-coordinate of the center of the fly
% at time t
% phi: N x 1 vector where phi(t) is the orientation of the fly at time t
% wtheta: N x 1 vector where wtheta(t) is the weight of the change in
% orientation term at time t
% wphi: N x 1 vector where wphi(t) is the weight of the velocity
% direction term at time t
%
function theta = choose_orientations2(x,y,theta,weight_theta,weight_phi)
inputsz = size(x);
x = x(:);
y = y(:);
theta = theta(:);
weight_phi = weight_phi(:);
weight_theta = weight_theta(:);
% number of frames
N = length(x);
% allocate space for storing the optimal path
stateprev = zeros(N-1,2);
% allocate space for computing costs
tmpcost = zeros(2,1);
costprevnew = zeros(2,1);
% initialize first frame
costprev = zeros(2,1);
% compute velocity
vx = [0;diff(x)];
vy = [0;diff(y)];
% compute angle of velocity
velocityangle = atan2(vy,vx);
% compute iteratively
for t = 2:N,
% compute for both possible states
for scurr = 1:2,
% try both previous states
thetacurr = theta(t) + (scurr-1)*pi;
for sprev = 1:2,
thetaprev = theta(t-1) + (sprev-1)*pi;
costcurr = weight_theta(t)*angledist(thetaprev,thetacurr) + ...
weight_phi(t)*angledist(thetacurr,velocityangle(t));
tmpcost(sprev) = costprev(sprev) + costcurr;
end
% choose the minimum
sprev = argmin(tmpcost);
% set pointer for path
stateprev(t-1,scurr) = sprev;
% set cost
costprevnew(scurr) = tmpcost(sprev);
end
% copy over
costprev(:) = costprevnew(:);
end
% choose the best last state
scurr = argmin(costprev);
if scurr == 2,
theta(end) = modrange(theta(end)+pi,-pi,pi);
end
% choose the best states
for t = N-1:-1:1,
scurr = stateprev(t,scurr);
if scurr == 2,
theta(t) = modrange(theta(t)+pi,-pi,pi);
end
end
theta = reshape(theta,inputsz);