Positioning using azimuth and elevation information
15 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hi,
I have/know (by magic) the azimuth and elevation of a certain object in space from at least two to three locations on the ground. How do I compute the position of that object in space? Any help is appreciated.
0 commentaires
Réponses (3)
Matt Tearle
le 18 Mar 2013
You might be able to use some Mapping Toolbox functions to convert between various Earth coordinate systems. However, not knowing the range makes life complicated. There's probably a good way to do it, if you wade through the math.
But here's a brute-force approach. Treat the ranges as unknowns in an optimization problem, where the objective is to minimize the triangulation error. That is, if you pretend that you know the ranges, you can figure out the predicted locations from each measurement location. Then try to get the ranges that give the best agreement between the predictions.
% Define locations of observers (latitude, longitude, elevation)
geocords = [42.14,-71.25,0;
-33.76,-72.73,0];
% Define bearings to object taken by observers (az, el)
bearings = [181.3,-35.6;
0,90];
% Get reference spheroid for Earth
earth = wgs84Ellipsoid;
% Make objective function = error in triangulation
fobj = @(r) trierror(r,bearings,geocords,earth);
% Minimize triangulation error by adjusting ranges
r0 = earth.SemimajorAxis*ones(size(bearings,1),1);
r = fminsearch(fobj,r0);
% Use best range estimates to locate object in ECEF coordinates
[X,Y,Z] = aer2ecef(bearings(:,1),bearings(:,2),r,geocords(:,1),geocords(:,2),geocords(:,3),earth);
loc = mean([X,Y,Z])
% Target object from a new location
[az,el,rng] = ecef2aer(loc(1),loc(2),loc(3),-20,47,0,earth)
And my triangulation error function:
function err = trierror(r,bearings,geocords,p)
% Get the ECEF location of the object
[X,Y,Z] = aer2ecef(bearings(:,1),bearings(:,2),r,geocords(:,1),geocords(:,2),geocords(:,3),p);
% Normalize into Earth-radius units to keep the numbers nice
XYZ = [X,Y,Z]/p.SemimajorAxis;
% Take the difference between each point and the mean (centroid) location;
% sum the absolute values of the differences
err = sum(sum(abs(bsxfun(@minus,XYZ,mean(XYZ)))));
Obviously you could come up with your own triangulation error function. I doubt this approach scales well with the number of observation locations.
Also, it might be nice to get a good estimate of the ranges before trying to minimize (I just used Earth radius from all locations). If the observer locations are close enough together, you could do some flat-earth triangulation first, using the Mapping Toolbox navfix function.
0 commentaires
the cyclist
le 14 Mar 2013
Use the sph2cart() function.
2 commentaires
the cyclist
le 14 Mar 2013
Modifié(e) : the cyclist
le 14 Mar 2013
For each ground location, you can use the (azimuth,elevation) data to define a unique line that passes through that location and the space object. [For example, you could use sph2cart(), with two arbitrary values r1 and r2, to get two points on the line, (x1,y1,z1) and (x2,y2,z2).]
If you use two ground stations, then you should be able to find the intersection of those two lines, which is the location of the space object. There is a discussion here on how to do that:
donuru reddy
le 16 Juil 2017
what if the camera is on a building top with known altitude, azimuth, elevation and position. how to find geo location of an object at focus.
0 commentaires
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!