00001 function xhat = localize(y)
00002 init
00003 Phi=[diff(y); y(1)-y(end)];
00004
00005 beacon=desc.area.beacon;
00006
00007 beta=Phi(3);
00008 alpha=Phi(2);
00009 theta=beacon_angle(1, beacon);
00010 phi=beacon_angle(2, beacon);
00011 psi=beacon_angle(3, beacon);
00012
00013 q=sin(phi)/sin(theta)*sin(alpha)/sin(beta);
00014 omega=2*pi-psi-alpha-beta;
00015
00016 delta = atan2(sin(omega), 1/q+cos(omega));
00017
00018 v32=beacon(2,:)-beacon(3,:);
00019
00020 l1ang=atan2(v32(2), v32(1)) -pi+delta;
00021
00022 a=norm(beacon(2,:)-beacon(3,:));
00023
00024 l1=a/sin(alpha)*sin(pi-alpha-delta);
00025 r=beacon(2,:)+l1*[cos(l1ang) sin(l1ang)];
00026
00027 angle=mean(atan2(beacon(:,2)-r(2), beacon(:,1)-r(1))-y);
00028
00029 xhat=[r angle];
00030
00031 function angle=beacon_angle(b, beacon)
00032 beacons=size(beacon,1);
00033 prev=mod(b-1-1, beacons)+1;
00034 next=mod(b-1+1, beacons)+1;
00035 bp=beacon(prev,:);
00036 bn=beacon(next,:);
00037 bb=beacon(b,:);
00038 v1=bp-bb;
00039 v2=bn-bb;
00040 angle=acos(sum(v1.*v2)/(norm(v1)*norm(v2)));