METHOD AND PARALLEL PROCESSOR COMPUTING APPARATUS FOR DETERMINING THE THREE-DIMENSIONAL COORDINATES OF OBJECTS USING DATA FROM TWO-DIMENSIONAL SENSORS

Abstract: First and second passive sensors (14, 16), which may be mounted on different earth orbiting satellites, provide relative azimuth and elevation coordinates to sensed objects (A, B, C) such as hostile missiles. Minimum and maximum possible ranges to the objects (A, B, C) along lines-of-sight (18a, 18b, 18c) from the first sensor (14) are predetermined, and used to calculate "range lines" (24, 26, 28) which are coincident with the lines-of-sight (18a, 18b, 18c) and extend from the respective minimum to maximum ranges respectively. The range lines (24, 26, 28) are transformed into the field of view of the second sensor (16), and matched to the azimuth and elevation coordinates of the respective objects (A, B, C) using a basic feasible solution (greedy) or global optimization algorithm. The approximate points of intersection of lines-of-sight (20a, 20b, 20c) from the second sensor (16) to the objects (A, B, C) and matched range lines (24, 26, 28), are calculated, and transformed into coordinates relative to a reference point (10) such as the center of the earth (12). The calculations for the individual objects (A, B, C) may be performed simultaneously using parallel processors (44a, 44b, 44c) in a single instruction stream - multiple data stream (SIMD) or similar computing arrangement (40).

Description: METHOD AND PARALLEL PROCESSOR COMPUTING APPARATUS FOR DETERMINING THE THREE-DIMENSIONAL COORDINATES OF OBJECTS USING DATA FROM TWO-DIMENSIONAL SENSORS GOVERNMENT RIGHTS This invention was made with Government support under Contract No. DASG60-88-C-0111 awarded by the Department of the Army. The Government has certain rights in this invention. BACKGROUND OF THE INVENTION Field of the Invention The present invention provides a method and apparatus for determining the three-dimensional positions of objects based on two-dimensional (azimuth and elevation) coordi¬ nates from two separate passive sensors. Description of the Related Art Determining the three-dimensional position of a target object such as an aircraft or missile using active radar is a straightforward process. Azimuth and elevation coordi¬ nates (two dimensions) are provided by the radar's antenna scanning system. The range to the object, which consti- tutes the third coordinate, is provided by measuring the time-of-flight of radio frequency pulses transmitted toward and reflected back from the object. The three-dimensional coordinates of the object relative to a particular refer¬ ence point, such as the center of the earth, may be easily derived using simple coordinate transformations since the position of the radar relative to the reference point is known. However, tracking of objects such as hostile missiles using data from sensors mounted on orbiting satellites is much more difficult, since these sensors are conventionally passive and provide only relative azimuth and elevation coordinates. Lines-of-sight from two or more sensors can be triangulated to derive a third coordinate for target position determination. However, where a significant number of objects are being tracked, multiple lines-of- sight intersect at points where no objects actually exist. A method must therefore be provided to eliminate the false intersections from further consideration and match the lines-of-sight from the respective sensors to the individu- al objects. U.S. Patent no. 4,806,936, entitled "METHOD OF DETERMINING THE POSITION OF MULTIPLE TARGETS USING BEARING- ONLY SENSORS", issued Feb. 21, 1989, to Patrick R. Wil¬ liams, assigned to the Hughes Aircraft Company, the assignee of the patent as well as the present application, described a "deghosting algorithm". The positions of a plurality of targets are located using three or more sensors such as jammed radars which sense only the azimuth or bearing angle to the targets. The intersecting bearing lines form triangles representing both true targets and false or "ghost" targets. The false target triangles are separated from the true target triangles by analyzing the size and position of each triangle. Bearing data defining the triangles is first ordered, and then sequentially examined in a manner such that a first group of false targets is eliminated from consideration. The bearing data defining the remaining triangles is processed through coarse and fine gates to eliminate the second and third groups of false targets. A fourth group of false targets is eliminated by using a global maximum likelihood proce- dure, in which a likelihood function is maximized through the use of discrete optimization techniques. In the worst case using the deghosting method for n targets, n 3 candidate target locations must be searched in order to determine the actual locations of the objects. In addition, the search algorithm utilizes an exhaustive search procedure which has an overall complexity of n 2n for n targets. In a realistic defense scenario in which hundreds or more missiles must be tracked simultaneously, such a search using even the most current computer technol¬ ogy would require a length of time greatly in excess of the time-of-flight of the missiles. SUMMARY OF THE INVENTION In accordance with the present invention, first and second passive sensors, which may be mounted on different earth orbiting satellites, provide relative azimuth and elevation coordinates to sensed objects such as hostile missiles. Minimum and maximum possible ranges to the objects along lines-of-sight from the first sensor are predetermined, and used to calculate "range lines" which are coincident with the lines-of-sight and extend from the respective minimum to maximum ranges respectively. The range lines are transformed into the field of view of the second sensor, and matched to the azimuth and elevation coordinates of the respective objects using a basic feasible solution (greedy) or global optimization algo¬ rithm. The approximate points of intersection of lines-of- sight from the second sensor to the objects and matched range lines are calculated, and transformed into coordi¬ nates relative to a reference point such as the center of the earth. The calculations for the individual targets may be performed simultaneously using parallel processors in a single instruction stream - multiple data stream (SIMD) or similar computing arrangement. The present method may utilize a global optimization algorithm such as the Munkres Assignment Problem Algorithm (Hungarian Method) for matching the lines-of-sight from two sensors to the individual targets. This type of coordinate determination requires that only n 2 candidate locations be searched. The overall complexity of the search algorithm is n 3 , which is much smaller than that of the deghosting algorithm. Alternatively, a basic feasible solution or "greedy" algorithm may be used which also requires that n 2 candidate locations be searched, but the overall complexity of the algorithm is also n 2 . In this implementation, where coordinate determination may not be globally optimal, the search through the candidate locations may be performed simultaneously using parallel processors. With a group of n processors, the complexity of the search algorithm is n. In addition to tracking missiles or other objects in space, the present invention is suitable for applications such as vision problems which require that the three-dimen¬ sional location of objects be determined based on multiple two-dimensional views of the objects. Examples of such applications are robotics and machine vision. The process of determining the location of objects such as obstructions can be very time-consuming and delay the progress of a robot. Because the present invention can utilize a greedy assignment algorithm capable of being performed in paral¬ lel, the determination of object locations can be performed significantly faster. These and other features and advantages of the present invention will be apparent to those skilled in the art from the following detailed description, taken together with the accompanying drawings, in which like reference numerals refer to like parts. DESCRIPTION OF THE DRAWINGS FIG. 1 is a diagram illustrating an orthogonal coordinate system, two sensors and three target objects for explaining the principles of the present invention; FIG. 2 is a diagram illustrating the three objects as appearing in the fields of view of the two sensors; FIG. 3 is a diagram illustrating one of the objects and a range line established for the object relative to the first sensor; FIG. 4 is a diagram illustrating the object and range line for the object as transformed into the field of view of the second sensor; FIG. 5 is a diagram illustrating the geometric relationship between the two sensors, object, and range line for determining the three dimensional position of the object; FIG. 6 is a diagram illustrating the geometric relationship between the object and the range line which is displaced from the object due to inherent system errors; FIG. 7 is a diagram illustrating the matching of objects to range lines; FIG. 8 is a flowchart illustrating the method of the invention as performed sequentially for a plurality of objects; FIG. 9 is a flowchart illustrating the matching of objects to range lines using a basic feasible solution (greedy) algorithm; FIG. 10 is a schematic diagram illustrating a comput¬ ing apparatus having a single instruction stream - multiple data stream (SIMD) configuration for performing the method of the invention using parallel processing; and FIG. 11 is a flowchart illustrating the present method as performed using the parallel processing apparatus illustrated in FIG. 10. DETAILED DESCRIPTION OF THE INVENTION FIG. 1 illustrates an overview of the geometric problem which is solved by the present method. A three- dimensional orthogonal coordinate system is shown as having an origin 10 located, for example, at the center of the earth as designated at 12. The orthogonal coordinate system has X, Y and Z axes. The origin 10 is considered to be a reference point relative to which the three-dimension¬ al positions as expressed in three orthogonal coordinates x, y, and z of three objects such as hostile missiles A, B and C are to be determined. Although only three objects are shown in the drawing, hundreds or more of such objects may be present in a realistic defense scenario, the three- dimensional positions of which must be quickly determined and tracked. The objects A, B and C are sensed by first and second sensors (sensor 1 and sensor 2) 14 and 16 respectively, which are shown as being integral elements of satellites in orbit (moving or stationary) above the earth 12. The sensors 14 and 16 are passive units such as television or thermal cameras which provide only two-dimensional angular coordinate data in the form of azimuth (az) and elevation (el) angles relative to themselves. The azimuth and elevation coordinates define lines-of-sight 18a, 18b and 18c from the sensor 14 to the respective objects A, B and C, and lines-of-sight 20a, 20b and 20c from the sensor 16 to the objects A, B and C respectively. The three-dimensional coordinates of the object A are shown as being projected on the X, Y and Z axes and designated as x 0 , y 0 and z 0 respectively, with the projection of the object A on a plane defined by the X and Z axes being designated as 22. The x,y,z coordinates of the objects B and C are not shown in the drawing for simplicity of illustration. The three-dimensional coordinates of the sensors 14 and 16 relative to the origin 10 are known, and designated as x 1 , t ,z 1 and x 2 ,y 2 ,z 2 respectively. . These geometric relationships are further illustrated in FIG. 2 from the fields of view of the sensors 14 and 16. The present method may be performed sequentially (serially) or simultaneously (in parallel) for determining the positions of each of the objects A, B,and C. The basic procedure for one object A will be described first, followed by a description of how the processing for one object is related to that for the other objects. It will be noted that although the present method is especially suited for determining the positions of objects in three dimensions, a simplified version thereof can be applied to two-dimensional problems such as tracking surface targets where only the azimuth angles to the targets are known. The quantities which are known are the x,y,z coordi¬ nates of the sensors 14 and 16 relative to the origin 10, and the azimuth and elevation coordinates az,el of the objects relative to the sensors 14 and 16. As viewed in FIG. 2, the lines-of-sight from the sensors 14 and 16 to the respective objects extend perpendicular to the plane of the drawing, and are represented as points at the centers of small circles representing the respective objects. FIG. 3 illustrates the object A relative to the first sensor 14. The method of the invention determines the range from one of the sensors to the object A which, in combination with the az,el coordinates for the same sensor, specifies the position of the object in three dimensions. In accordance with the invention, although the range to the object A is not known exactly, it will necessarily lie within certain minimum and maximum values depending on the particular application. For example, missiles launched from the Soviet Union toward the United States must remain further than a certain minimum range from the sensor 14 due to the altitude limitations of the particular missile, and within a certain maximum range since the missile must travel above the surface of the earth 12. Depending on the particular situation, a minimum range r mjn and a maximum range r are predetermined. As shown in FIG. 3, these ranges r m{n and r_ χ are plotted along the line-of-sight 18a from the sensor 14 and designated as endpoints A" and A" respectively of a "range line" 24 which is coincident with the line-of-sight 18a. The object A lies on the range line 24 at an as yet unknown position between the endpoints A' and A". The next step of the process is to transform the range line 24, and especially the coordinates of the endpoints A' and A" into the field of view of the second sensor 16. The transformed range line 24 is shown in FIG. 4 along with the line-of-sight 20a to the object A. The line-of-sight 20a as defined by the az,el coordinates relative to the second sensor 16 extends perpendicular to the plane of the drawing, and is represented by a point at the center of the object A. Where the positions of the sensors 14 and 16 and the az,el coordinates for the object A from both sensors 14 and 16 are known precisely, the line-of-sight 20a will lie exactly on the range line 24. The object A is located at the intersection of the line-of-sight 20a and range line 24. In the field of view of the second sensor 16 as shown in FIG. 4, this intersec¬ tion is equivalent to the position of the point represent¬ ing the line-of-sight 20a on the range line 24. Since the range line 24 is defined by the known three-dimensional coordinates of the endpoints A' and A" and the azimuth and elevation of the line-of-sight 20a from the second sensor 16 are known, sufficient information is available to calculate the intersection of the line-of-sight 20a and range line 24 which specifies the position of the object A relative to the second sensor 16. The azimuth, elevation and range of the object A from the second sensor 14 specify the position of the object A in three dimensions relative thereto. These coordinates .may be transformed into orthogonal x,y,z coordinates to provide the desired position of the object A relative to the origin 10. For the derivation of the basic equations of the present method, it will be assumed that the x, y, and z coordinates of both sensors 14 and 16 are known exactly, and that the azimuth and elevation of all three targets A, B and C are known exactly within each sensors' field of view. The x, y, and z coordinates relative to the first sensor 14 represent the line-of-sight vector (los) from the sensor 14 to the object A. The components of the line-of- sight vector los shall be denoted as a, b, and c for the x, y, and z components, respectively. The velocity and position of the sensor 14 are required in order to derive these coordinates. The velocity components of the sensor 14 shall be denoted as v χ , v y , and v z and the position components x 1 ,y 1 ,z 1 of the sensor 14 shall be redesignated as px,py,pz respectively. In addition, <a,b> shall denote the inner (dot) product of the vectors a and b, and a x b shall denote the cross product of the vectors a and b. The basic equations to determine the coordinates of A' and A" are derived from three base equations: p, los> ( 1) Azimuth = tan -1 <v x <v, los> (2 ) Elevation = tan -1 ( 3 ) . a 2 + b 2 + c 2- _ * ■= r -2 Expanding equation ( 1) yields : tan (Azimuth) [v_i- + V y b + v_c] (4 ) [VXP^-2 + VXP^D + VXP_C] Where vxp . vxp . and vxp represent the x, y, and z components of the vector equal to the cross product of the velocity vector and the position vector of the sensor 14, and r represents the range from the sensor 14 to A' (r mfn ) or A"(r ), depending on which of the two points is being operated on. By letting d = tan(Azimuth) , equation (4) becomes: (5) [v_ad + V y bd + + ■ y b + vxp z c Expansion of equation (2) yields: tan( Eleva ti on) [- Pκ a - Py b -p z c] By letting e = tan(Elevation) , equation (6) becomes! 2 7) [P_a + P y b + p_c] = ^ e 2 + 1 From equation (5) : a(v x d - vxp x ) = b(vxp y - v y d) + c(vxp z - v z d) (vxp y - V y d) (vxp z - v_d) a = i? + c (v-d - vxp (v_d - vxpJ Substituting: yields ( 8 ) a = bf + eg From equation (7) [ Pχ a + P y b + p z c] = e 2 + l by utilizing equation (8) and substituting equation (7) becomes: p x (bf + eg) + P y b + p 7 - . + 1 b (p x f + p y ) + c(p^ + P„) = ■ . + 1 Substituting: i_ = yields: b (p x f + p y ) + c(p JC <τ + p z ) = J_ h - c (p x g + p r ) (9) = P* Substituting (9) into (8) yields: ____ _ c£(p x g + p.) + (10) a eg P x f + P v „~f + P v and by substituting: J = k = P x & + P_ PJ yi P*f equations (9) and (10) become: (11) b = j - ck (12) a = £ j + c(g - £k) From (3) : a 2 + b z + c 2 = 2 Substituting (11) and (12) yields: [rj 2 + 2fjc(g-fk) + c 2 <^--f_c) 2 ]+| '2 - 2cjk + c 2 Jc 2 ] + c 2 = r 2 c 2 [(ρ---Jc) 2 + J 2 + 1] + c [2fj(g-£k) - 2jk] + [_f 2 j 2 + j 2 - r 2 ] = 0 Substituting: J = [(g - fk) z + k 2 + l] JΠ = [2_j (cr - i_) - 2jk] n = [_= 2 j 2 + j 2 - r 2 ] yields: (13) lc 2 + mc + n = 0 which is a quadratic equation in c. The solution to this quadratic is known to be: (14) -m ± yj z - 4ln) '1,2 = 22 Equations (11) , (12) , and (14) yield the values for a, b, and c, the x, y, and z components of the line-of-sight vector from the sensor 14 to the points A* and A". It is important to note that two values of c will result from (14) . One of the two values that results will lead to a line-of-sight vector that is not in the field of view of the sensor 14. In order to determine which vector is not in the field of view of the sensor 14, both vectors are calculated and the inner product of each vector is taken with the velocity vector of sensor 14. The vector that is not in the field of view of the sensor 14 will give a 10 negative inner product when this operation is performed. In summary: b = j - ck a = fj + c(g - £k) 15 where: d = tan(Azimuth) e = tan(Elevation) ( p y - v v d) f = (v x d - vxpJ ( vxp t - v ∑ d) 9 - (v_d - vxpJ J - Px + P. yi x ff + P_ P 1 = [(g - £k) ~ + k 2 + 1] m = [2fj (g - fk) - 2jk] n = [f 2 j 2 + j 2 - r 2 ] By utilizing these equations, a, b, and c (the x, y, and z components of the line-of-sight vector from the sensor 14 to the points A 1 and A") can be calculated. In order to determine the x, y, and z coordinates of A* and A", the x, y, and z coordinates p Xt P y# p z = x 1 ,y 1 ,z 1 of the sensor 14 are added to a, b, and c, respectively. Thus: A' * = P x + -2A' A' y = Py + Jb_ •A 7 _ = P- + C.i A" X = + a*" A /; y = p y + ώ A // = * + C A // Since the x, y, and z coordinates of the points A 1 and A" are known, these points may be transformed into the field of view of the sensor 16 by applying the detection equations (1) and (2) . The components of the line-of-sight vector los for the transformation are the x, y, and z distances from the sensor 16 to the points A' and A". By using equations (1) and (2), the points A 1 and A" can be transformed into the field of view of the sensor 16. The geometry of the relationship between the positions of the sensors 14 and 16 and the points A 1 , A", and A is shown in Figure 5, with the letters a, b, and c denoting different variables from those previously represented. The value of r, the range to point A, can be derived as follows. From the definition of the inner product: \∑ ,l [ \b\ cos(Θ") = <r", b> or cos(θ") = <x", b> | r"l 1*1 where x n is the vector from point A" to the sensor 16 b is the vector from point A" to point A" \τ"\ is the magnitude of the vector r" \b\ is the magnitude of the vector b c = |r"| cos(θ") a = v-ϊr 2 ! 2 - c J The value of a is easily determined, because all entities in the equations necessary to derive it are known. Similarly: \τ\ \b\ cos(θ) = <_.,__ ■ > or cos(θ) = <r, bY 1*11^1 where r is the vector from point A to the sensor 16 b is the vector from point A" to point A 1 [r\ is the magnitude of the vector r |JD| is the magnitude of the vector b The vector r can be calculated with the procedure outlined above for determining the line-of-sight vector assuming a nominal range. By picking a range of unity, a unit vector in the direction from the sensor 16 to point A can be calculated. By taking the opposite of each of the components of the line-of-sight vector calculated with the above procedure, the vector from point A to the sensor 16 can be calculated. After this vector is calculated, the value for cos(q) can easily be computed. From Figure 5: a = |r| sin(θ) or (15) [r[ = sin(θ) From the trigonometric relation cos 2 (θ) + sin 2 (θ) = 1 we can see that sin(θ) = Jl - cos a (θ) Since the value of cos(h) has been determined above, the value of sin(n) can easily be determined. Substituting the values for a and sin(h) into equation (15) will give the value for [ J r J j , the range from the sensor 16 to the point A. Since the line-of-sight vector to point A was calculated in order to determine r, the range information is sufficient to specify the coordinates of A relative to the sensor 16. When these relative coordinates are added to the x, y, and z coordinates (x 2 ,y 2 ,z 2 ) for the sensor 16, the absolute x, y, and z coordinates of the object A relative to the origin 10 are specified. The steps presented above may be performed for each object in sequence, until the three-dimensional coordinates for all of the objects relative to the origin 10 have been determined, assuming no sensor registration error and no azimuth-elevation reporting error. However, if such errors are present, the lines-of-sight and range lines in the field of view of the second sensor 16 will be displaced from each other as illustrated in FIGs. 6 and 7, and a method must be provided for matching the objects to the respective range lines. Where such errors are present, the steps for the basic method are followed until the points A' and A" are trans- lated into the field of view of the second sensor 16. Instead of having the points A 1 , A", and A collinear, registration error and azimuth-elevation reporting error will result in the translation of these points as shown in FIG. 6. It can be seen that there is some small distance d that separates object A from the range line 24 defined by the endpoints A 1 and A". In this version of the present method, all of the range lines from the first sensor 14 are calculated and transformed into the field of view of the second sensor 16. The resulting field of view for the sensor 16 is shown in FIG. 7. A flowchart of the present method including the step of matching the objects to the range lines is presented in FIG. 8. The problem requires globally matching the line- of-sight points 20a, 20b and 20c representing the objects A, B, and C to respective range lines 24, 26 and 28. The range lines 26 and 28 are defined by minimum and maximum endpoints B*,B" and C',C" respectively. This type of problem may be solved using various assignment problem algorithms. One type of algorithm is known as the Munkres Assignment Problem Algorithm (Hungarian Method) which is described in a textbook entitled "OPERATIONS RESEARCH, APPLICATIONS AND ALGORITHMS", by W. Winston, PWS-KENT Publishing Company, 1991, pp. 358-363. In this method, "costs" are computed by assigning the sets of az,el coordinates or plots 20a, 20b and 20c for the objects A, B and C to each of the range lines 24, 26 and 28. A one-to-one assignment of plots to range lines is made by this algorithm such that the overall total cost of assign¬ ing plots to range lines is a global minimum. Thus, the globally optimum assignment of plots to range lines is made. It should be noted that this algorithm requires that n 2 candidate assignments be searched, requiring n 3 opera¬ tions in the worst case. A basic feasible solution (greedy) algorithm that does not ensure one-to-one assignment also requires that n 2 candidate assignments be searched, but requires only n 2 operations, thus saving a significant amount of time on larger problems. In addition, this algorithm may be performed in parallel using a set of n processors, and has a complexity of n. A flowchart of the method for matching objects to range lines using the greedy algorithm is presented in FIG. 9. The computation of cost factors for the global optimization method or a comparison parameter for the greedy algorithm is done by taking the perpendicular distance from each line-of-sight to each range line. In FIG. 6, the perpendicular distance d is computed for each plot to each range line in the same manner as the value of a was calculated using equation (15) with reference to FIG. 5 in order to determine the value of j j r j j . In a case where the line-of-sight and range line do not intersect exactly, an approximate point of intersection is defined for the purpose of calculating the range from the sensor 16 to the object. As viewed in FIG. 6, the distance d is measured along a line 30 which is perpendicu¬ lar to both the line-of-sight 20a (which extends perpendic¬ ular to the plane of the drawing) and the range line 24, and intersects the respective lines at points where the lines are closest to each other. The intersection of the perpendicular line 30 with the range line 24 defines a point 32 which is used to approximate the point of inter¬ section of the lines 20a and 24 for the purpose of calcu¬ lating the range from the second sensor 16 to the object A as described with reference to FIG. 5. With reference being made to FIG. 7 and the flowchart of FIG. 9, the range line which corresponds to the object C is determined by calculating the perpendicular distances from the line-of-sight 20c to each of the range lines 24, 26 and 28 or extensions thereof as indicated in broken line. Lines drawn from the line-of-sight 20c perpendicu¬ larly intersect the range lines 24, 26 and 28 at points 34, 36 and 38 respectively. The lengths of these lines correspond to the variable d illustrated in FIG. 6, and are calculated using equation (15) . The range line having the smallest perpendicular distance from the line-of-sight 20c is defined as being matched to the object C. In the example of FIG. 7, the range line 28 is matched to the object C since the distance from the line-of-sight 20c to the point 38 is smaller than the distances to the points 34 and 36. It is theoretically possible using the greedy algo¬ rithm that some objects will be incorrectly matched to range lines since the solution is not globally optimized. However, this will not be a limitation in many practical scenarios depending on the geometry of the particular problem, and is offset by the speed at which the greedy algorithm can be performed for the objects simultaneously using parallel computer processing. It will be noted that the range lines calculated using the above equations with the endpoints specified in an angular (spherical) coordinate system will not be exactly straight, but will have a slight curvature. The curvature is so slight that any resulting errors will be negligible in most practical applications. The curvature errors may be obviated by using an iterative algorithm for matching the az,el plots to the range lines in the field of view of the second sensor 16. Such an algorithm would function by incrementing the minimum range values and decrementing the maximum range values until one of the endpoints of the range line coincides with or over-runs the respective az,el plot point. Whereas the present method has been described above for calculating the positions of the objects sequentially (in series) , it is within the scope of the present inven- tion to perform the calculations simultaneously, thereby achieving a great increase in processing speed. A computer 40 for performing the present method using parallel processing is illustrated in FIG. 10, and includes a main processing element 42, a plurality of parallel processing elements 44a to 44c, and a bus 45 which interconnects the main element 42 with each of the parallel processing elements 44a to 44c. The preferred architecture for the computer 40 is single instruction stream - multiple data stream (SIMD) , although the present invention is not so limited. A parallel processing element is provided for each object whose position is to be determined. Although only- three elements 44a to 44c are shown in FIG. 10 for deter¬ mining the positions of the three objects A, B and C respectively, in a practical application, a number of parallel processing elements equal to the maximum antici¬ pated number of objects will be provided. Hundreds or more parallel processing elements may be arranged in a suitable grid configuration (not shown) . The main processing element 42 includes a central processing and control unit (CPU) 46, a program storage memory 48 for storing program instruction code, a data storage memory 50 for storing data and intermediate results, and an input/output unit (I/O) 52 for connecting the main processing unit 42 to the bus 45. The I/O unit 52 is further connected to transmit data from the sensors 14 and 16 to the data memory 50. The parallel processing elements 44a to 44c may be identical, with the individual components of only the element 44c shown in the drawing. The element 44c includes a controller 54, arithmetic logic unit (ALU) 56, program storage memory 58 and data storage memory 60. An I/O unit 62 transmits instructions in one direction from the main processing element 42 to the controller 54, and data in both directions between the main processing unit 42 and data storage 60. The program memories 48 and 58 may be volatile, in which case the program code is provided on a suitable software media such as diskettes or magnetic tape and loaded into the memories 48 and 58. In such a configura¬ tion, the present method may be practiced using a commer¬ cially available computer having a parallel processing architecture, such as the "Connection Machine" manufactured by Thinking Machines, Corp. This computer has a SIMD architecture, and is described in an article entitled "ARCHITECTURE AND APPLICATIONS OF THE CONNECTION MACHINE", Computer magazine, vol. 21, no. 8, Aug. 1988, pp. 26-38. Alternatively, the memories 48 and 58 may be non¬ volatile, with the program code being stored therein as firmware. In either case, the program memory 58 in each parallel processing element stores the program instructions necessary for performing the requisite computations for one object. The program memory 48 in the main processing unit 42 stores program instructions for overall control of the system, and instructions which are passed to the units 44 simultaneously causing the units 44a to 44c to perform computations in parallel. The data memory 50 initially stores the coordinates of the sensors 14 and 16, the minimum and maximum ranges r m . n and r |naχ and the az,el coordinates of the objects which are subsequently transmit¬ ted to and stored in the individual memories 60 of the units 44a to 44c. A flowchart for performing the present method using the computer 40 is presented in FIG. 11. Steps 2 to 7 are performed in parallel by all of the parallel processing units 44a to 44c in response to single respective instruc¬ tions fed thereto from the main processing unit 42. T h e process includes the following steps. 1. The coordinates of the sensors 14 and 16, the az,el coordinates or plots of the objects A, B and C relative to the sensors 14 and 16 and the predetermined minimum and maximum ranges are input to the main processing unit 42. The coordinates of the sensors 14 and 16 and minimum and maximum ranges are then transmitted to and stored in the data memories 60 of all of the parallel processing elements 44a, 44b and 44c. The plots for the objects A, B and C are fed to and stored in the memories 60 of the individual parallel processing units 44a to 44c respectively. 2. The line-of-sight vectors for the lines-of sight 18a to 18b and 20a to 20c for the objects A, B and C respectively are calculated. 3. The coordinates of the endpoints A' and A" defining the range lines 24, 26 and 28 relative to the first sensor 14 are calculated. 4. The range line coordinates are transformed into the field of view of the second sensor 16. 5. A selected algorithm (global optimization, greedy) is used to match the lines-of-sight 20a to 20c (sensor 2 plots) to the respective range lines 24 to 26. 6. The intersections (or approximate intersections) of the lines-of-sight 20a to 20c and the respective range lines 24, 26 and 28 are calculated. 7. The coordinates of the intersections are trans- formed into x,y,z coordinates relative to the origin 10. EXAMPLE A listing of a computer program DISPLAY written in the Pascal language for demonstrating the present method is presented below. The computer simulation indicates that the method works perfectly for the case of no registration error and no azimuth-elevation error. For cases in which registration errors and/or azimuth-elevation errors are present, the method works also, but these errors result in values of x, y, and z that are correct within a small range of tolerance. Although included for completeness, a number of procedures in the program perform "housekeeping" functions such as defining variables and controlling the display of objects and lines on the computer screen. The following procedures perform calculations in accordance with the equations presented above which are especially relevant to the present method. CRANK_LOS_VECTOR and PICK _VECT0R calculate line-of- sight vectors (los) relative to the sensors 14 and 16. NEW_XYZ calculates x,y,z coordinates of the minimum and maximum range points. TRANSFORM transforms the minimum and maximum range points into the field of view of the sensor 16. FIND_CLOSEST uses the Greedy Algorithm to find the range line closest to a specified az,el plot. CO MPUTE_XYZ computes x,y,z coordinates of the closest az,el plot. program DISPLAY; uses dos,graph,crt; { This program displays detections from the detection files generated by the program SENSORS. Track initiation is aided by the procedure crank_los_vector. } const pathtodriver = 'c:\turbo• ; max_platform — 3; max_objects = 200; max_scans = 3; max_boosters = 20; pi = 3.1415926535898; rad_per_deg = 0.017453292519943; x_disp_range = 0.05; y_disp_range = 0.005; type strlO = string[10j; strlδ = string[15]; vector_3d_type = array[1..3] of real; object_types = (balloon,rv, ooster) ; state_record_type = record x_coord : real; y_coord : real; z_coord : real; x_vel : real; y_vel : real; z_vel : real; end; lat_long_record_type = record latitude : real; longitude : real; height : real; end; detection_record_type = record azimuth : real; elevation : real; end; detection2_record_type = record dr : detection_record_type; state : vector_3d_type; object_type : object_types; clump_num : integer; end; booster_launch_record_type = record longitude : real; latitude : real; height : real; vel_horizontal : real; vei vertical : real; vx_add : real; vy_add : real; vz_add : real; launch_time : integer; end; booster_record_type = record state : state_record_type; empty : boolean; rv_count : integer; cannister_count : integer; last_deployment : integer; deploy_direction : vector_3d_type; impact : boolean; launch_time : integer; end; object_record_type = record state : state_record_type; object_type : object_types; clump_num : integer; impact : boolean; end; impact_record_type = record latitude : real; longitude : real; object_type : integer; end; spit_rec_type = record x_coord : real; y_coord : real; z_coord : real; clump : integer; c : char; end; object_node_type = Λ object_array_type; o b j e c t _ a r r a y _ t y p e = array [ 1.. max_plat f or , 1.. max_scans , 1.. max_ob j ects ] of detection2_record_type; booster_launch_node_type = booster_launch_array_type; booster_launch_array_type = array[1..max_boosters]of booster_launch_record_type; file_name_type = String[80]; platform_lat_long_array_type = array[1..max_platform]of lat_long_record_type; platform_states_type = arra [1..max_platform]of state_record_type; detect_node_type = Λ detect_array_type; detect_array_type = array[1..max_objects] of detection2_record_type; plot_count_type = arra [1..max_platform,1..max_scans] of integer; object_nums_node_type = Λ object__nums_type; o b j e c t _ n u m s _ t y p e = arra [ 1.. max_platf orm , 1.. max_scans , 1.. max_ob j ects ] of integer ; platform_reals_array — array [ l . .max_platform] of real ; v e c t o r _ 3 d _ a r r a y _ t y p e array[ l . .max_platform, l . .max_scans] of vector_3d_type ; var infilename : file_name_type; object_node : object_node_type; object_nums : object_nums_node_type; booster_launch_node : booster_launch_node_type; rvs_per_booster : integer; balloons_per_cannister : integer; cannisters_per_rv : integer; booster_count : integer; booster_eject_speed : real; balloon_eject_speed : real; azimuth_range : real; elevation_range : real; rv_eject_speed : real; booster_eject_rate : integer; atmosphere_thickness : real; post_eject_burn_speed : real; starting_time : integer; ending_time : integer; scan_rate : integer; time_step : integer; object_count : integer; eject_start_time : integer; done : boolean; c : char; current_time : integer; counter : integer; graphdriver : integer; graphmode : integer; in_file_name : file_name_type; out_fi1e_name : fi1e_name_type; impact_file_name : file_name_type; file_var : file; file_var2 : text; file_var3 : text; file_var4 : file; junk : string[80]; time_string : strl5; object_impact_count : integer; booster_impact_count : integer; txt : strlδ; platform_lat_long : platform_lat_long_array_type; platform_count : integer; 'detect_array : detect_node_type; detects : integer; pat_az : real; pat_el : real; real az : real; real_el : real; plot_count : plot_count_type; min_azimuth real; max_azimuth : real; min_elevation : real; max_elevation : real; num_clusters integer; xmin platform_reals_array; xmax platform_reals_array; ymin : platform_reals_array; ymax : platform_reals_array; start_time : integer; temp : strlδ; xrange : platform_reals_array; yrange : platform_reals_array; pos : vector_3d_array_type; vei : vector_3d_array_type; vel_x_pos : vector_3d_array_type; guess_range_min : real; guess_range_max : real; procedure init_video; begin graphdriver := 9; graphmode := 2; initgraph(graphdriver,graphmode,pathtodriver) end; procedure make__header; begin writel (* HUGHES AIRCRAFT COMPANY') ; writeln(' NEURAL NETWORK TRACK INITIATION SIMULATION 1 ); writeln; writeln; end; procedure get_start_info(var infilename : file_name_type; var start_time : integer) ; begin ( write('Enter Detection File Name : *); readln(infilename) ; write('Enter Starting Detection Time : ') ; readln(start_time) ; write('Enter Minimum Correlation Range : *) ; readln(guess_range__min) ; write( 'Enter Maximum Correlation Range : ') ; readln(guess_range_max) ; ) infilename := *la_smali.det' ; start_time := 1000; guess_range_min := 5000000.0; guess_range_min := 5436774.50; ) guess_range_max := 6000000.0; end; procedure makelogo(x : integer; y : integer) ; begin setfillstyle(solidfill,lightblue) ; setcolor(lightblue) ; circle(x + 5,y + 5,3); circle(x + 5,y + 12,3); circle(x + 55,y + 5,3); circle(x + 55,y + 12,3); floodfill(x + 5,y + 5,lightblue) ; floodfill(x + 5,y + 12,lightblue) ; floodfill(x + 55,y + 5,lightblue) ; floodfill(x + 55,y + 12,lightblue) ; line(x + 5,y + 2,x + 55,y + 2); line(x + 58,y + 5,x + 58,y + 11); line(x + 55,y + 15,x + 5,y + 15); line(x + 2,y + ll,x + 2,y + 5); floodfill(x + 15,y + 5,lightblue) ; floodfill(x + 3,y + 9,lightblue) ; floodfill(x + 57,y + 9,lightblue) ; setcolor(white) ; outtextxy(x + 8,y + 6, 'HUGHES'); end; function get_date : strlO; var year,month,day,dayofweek : word; temp : str10; total : strlO; begin getdate(year,month,day,dayofweek) ; str(month, emp) ; total := ' ' ; if month < 10 then total := total + -0-; total := total + temp + •-'; str(day,temp) ; if day < 10 then total := total + 'OS- total := total + temp + '-' ; str(year,temp) ; total := total + temp; get_date := total; end; function get_time : strlO; var hour,minute,second,hundredths : word; temp : strlO; total : strlO; begin gettime(hour,minute,second,hundredths) ; str(hour,temp) ; total := " ; if hour < 10 then total := •0' ; total := total + temp + ' : ' ; str(minute,temp) ; if minute < 10 then total := total + • 0 ' ; total := total + temp + ' : * ; str(second,temp) ; if second < 10 then total := total + *0' ; total := total + temp; get_time := total; end; procedure init_screen; var txt : string[40] ; begin setcolor(lightblue) ; rectangle(0,20,639,479) ; rectangle(l,21,638,478) ; setcolor(yellow) ; rectangle(7,27, 68,246) ; rectangle(8,28,467,245) ; setcolor(yellow) ; rectangle(7,254,468,470) ; rectangle(8,255,467,469) ; setcolor(yellow) ; rectangle(474,27,632,246) ; rectangle(475,28,631,245) ; txt := •SENSOR 1' ; outtextxy(554 - textwidth(txt) div 2,40,txt) ; setcolor(yellow) ; rectangle(474,254,632,470) ; rectangle(475,255,631,469) ; txt := 'SENSOR 2' ; outtextxy(554 - textwidth(txt) div 2,267,txt) ; akelogo(140,-1) ; setcolor(white) ; outtextx (210,5, 'NEURAL - NETWORK DATA FUSION SIMULATION') ; end; procedure init_vars; begin min_azimuth := (-azimuth_range / 2) ; max_azimuth := (azimuth_range / 2) ; min_elevation := 0; max_elevation := elevation_range; num_clusters := cannisters_per_rv * rvs_per_booster * booster_count; end; procedure read_params(var file_var4 : file); var counter : integer; txt : string[24]; ver : real; rr : integer; begin ver := 1.00; blockread(file_var4,ver,sizeof(ver) ,rr) ; txt := 'ATMOSPHERE THICKNESS '; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,atmosphere_thickness,sizeof(atmospher e_thickness) ,rr) ; txt := 'RVS PER BOOSTER ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,rvs_per_booster,sizeof(rvs_per_booste r) ,rr) ; txt := 'BALLOONS PER CANNISTER ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,balloons_per_cannister,sizeof(balloon s_per_cannister) ,rr) ; txt := 'CANNISTERS PER RV ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,cannisters_per_rv,sizeof(cannisters_p er_rv) ,rr) ; txt := 'BOOSTER COUNT ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,booster_count,sizeof(booster_count) ,r r); txt := 'MAX BOOSTER EJECT SPEED '; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,booster_eject_speed,sizeof(booster_ej ect_speed) ,rr) ; txt := 'MAX BALLOON EJECT SPEED '; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var ,balloon_eject_speed,sizeof(balloon_ej ect_speed) ,rr) ; txt := 'MAX RV EJECT SPEED '; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,rv_eject_speed,sizeof( v_eject_speed) ,rr) ; txt := *BOOSTER EJECT RATE • ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,booster_eject_rate,sizeof(booster_eje ct_rate) ,rr) ; txt := 'POST EJECT BURN SPEED '; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,post_eject_burn_speed,sizeof(post_eje ct_burn_speed) ,rr) ; txt := 'STARTING TIME '; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,starting_time,sizeof(star ing_time) ,r r); txt := •ENDING TIME ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,ending_time,sizeof(ending_time) ,rr) ; txt := • SCAN RATE • ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_ ar4,scan_rate,sizeof(scan_rate) ,rr) ; txt := 'INTEGRATION TIME STEP '; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,time_step,sizeof(time_step) ,rr) ; txt : - 'EJECT START TIME ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,eject_start_time,sizeof(eject_start_t ime) ,rr) ; txt := 'BOOSTER INITIAL STATES ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; for counter := 1 to booster_count do begin blockread(file_var4,booster_launch_node Λ [counter] .longitu de, sizeof(booster_launch_node Λ [counter] .longitude) ,rr) ; blockread(file_var4,booster_launch_node Λ [counter] .latitude, sizeof(booster_launch_node A [counter] .latitude) ,rr) ; blockread(file_var4,booster_launch_node A [counter] .height, sizeof(booster_launch_node [counter] .height) ,rr) ; blockread(file_var4,booster_launch_node Λ [counter] .vel_hor izontal, sizeof(booster_launch_node A [counter] .vel_horizontal) ,rr) ; blockread(file_var4,booster_launch_node A [counter] .vel_ver tical, sizeof(booster_launch_node A [counter] .vel_vertical) ,rr) ; blockread(file_var4,booster_launch_node A [counter] .vx_add, sizeof(booster_launch_node A [counter] .vx_add) ,rr) ; blockread(file_var4,booster_launch_node A [counter] .vy_add, sizeof(booster_launch_node A [counter] .vy_add) ,rr) ; blockread(file_var4,booster_launch_node A [counter] .vz__add, sizeof(booster_launch_node A [counter] .vz_add) ,rr) ; blockread(file_var4,booster_launch_node [counter] .launch_ time, sizeof(booster_launch_node A [counter] .launch_time) ,rr) ; end; txt := » PLATFORM COUNT ' ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,platform_count,sizeof(platform_count) ,rr) ; txt := 'AZIMUTH RANGE •; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,azimuth_range,sizeof(azimuth_range) ,r r); txt := 'ELEVATION RANGE •; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,elevation_range,sizeof(elevation_rang e) rr) * txt : * = 'PLATFORM INITIAL STATES •; blockread(file_var4,txt,sizeof(txt) ,rr) ; for counter := 1 to platform_count do begin blockread(file_var4,platform_lat_long[counter] .longitude, sizeof(platform_lat_long[counter] .longitude) ,rr) ; blockread(file_var4,platform_lat_long[counter] .latitude, sizeof(platform_lat_long[counter] .latitude) ,rr) ; blockread(file_var4,platform_lat_long[counter] .height, sizeof(platform_lat_long[counter] .height) ,rr) ; end; end; procedure read_detects(var file_var4 : file; var txt : strlδ; var pit : integer; scan_num : integer) ; var count : integer; temp : real; c : char; rr : integer; platform_number : integer; detects : integer; temp2 : integer; count2 : integer; az : real; el : real; begin for count2 := 1 to platform_count do begin blockread(file_var4,txt,sizeof(txt) ,rr) ; if (txt = 'PLATFORM NUMBER') then begin blockread(file_var4,platform_number,sizeof(platform_numbe r) ,rr) ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,detects,sizeof(detects) ,rr) ; blockread(file_var4,pos[platform_number,scan_num] ,sizeof( pos[l,l]) ,rr) ; blockread(file_var4,vei[platform_number,scan_num] ,sizeof( vel[l,l]),rr); blockread(file_var4,vel_x_pos[platform_number,scan_num] ,s izeof(vel_x_pos[l,l]) ,rr) ; plot_count[platform_number,scan_numj := detects; pit := 0; for count := 1 to detects do begin pit := pit + 1; blockread(file_var4,temp2,sizeof(temp2) ,rr) ; blockread(file_var4,az,sizeof(az) ,rr) ; blockread(file_var4,el,sizeof(el) ,rr) ; blockread(file_var4,pat_az,sizeof(pat_az) ,rr) ; blockread(file_var4,pat_el,sizeof(pat_el) ,rr) ; blockread(file_var4,object_node [platform_number,scan_num ,plt] .state, sizeof(object_node A [platform_number,scan_num,pit] .state) , rr) ; blockread(file_var4,c,sizeof(c) ,rr) ; blockread(file_var4,detect_array A [count] .clump_num, sizeof(detect_array [count] .clump_num) ,rr) ; az := az * rad_per_deg; el := el * rad_per_deg; { az := trunc(10000 * (az * rad_per_deg) ) / 10000; el := trunc(10000 * (el * rad_per_deg) ) / 10000; az := az + (random (4) - 2) * 0.0001; el := el + (random (4) - 2) * 0.0001; ) if (az > pi) then az := az - 2 * pi; if (el > pi) then el := el - 2 * pi; object_node A [ platf orm_number,scan_num, pit] .dr. azimuth := az; object_node [ plat form_number,scan_num, pit] .dr. elevation := el; object_nums A [platf orm_number, scan_num, pit] : = temp2 ; i f (object_node Λ [ platf orm_number,scan_num, pit] .dr. azimuth < xmin[platform_number] ) then xmin [ pi a t f orm_number ] : = object_node A [ platf orm_number,scan_num, pit] .dr. azimuth; i f (object_node A [platf orm_number,scan_num, pit] .dr. azimuth > xmax [platf orm_number ] ) then xmax [ pi a t f orm__numb e r ] : = object_node [ plat f orm_number, scan_num, pit] .dr. azimuth; i f (object_node A [platf orm_number,scan_num,plt] .dr. elevation < ymin [platf orm_number ] ) then ymin [ plat f orm_number ] := ob j ect_node A [plat f orm_number , scan_num , pit ] . dr . elevation ; i f (object_node A [platform_number,scan_num,plt] .dr. elevation > ymax [platf orm_number]) then yma [ pla t f orm_number ] := ob j ect_node A [platform_number,scan_num,plt] .dr. elevation; end; end else if (txt <> 'END SCENARIO ') then writeln (' ERROR !i! TXT (PLATFORM NUMBER) = • ,txt) end; end; procedure spit_detects ; var count : integer; count2 : integer; file_var : text; scan_num : integer; begin assign(file_var, *spit2.out') ; rewrite(file_var) ; for scan_num := 1 to 3 do begin for count2 := 1 to platform_count do begin writeln(file_var, 'PLATFORM NUMBER') ; writeln(file_var,count2:1) ; writeln(file_var, 'DETECTIONS') ; detects := plot_count[count2,scan_num] ; writeln(file_var,detects:1) ; for count := 1 to detects do begin write(count:5, ' ') ; write(file__var,object_node [count2,scan_num,count] .dr.azi muth:10:5,' '); writeln(file_var,object_node A [count2,scan_num,count] .dr.e levation:10:5) ; end; end end; writeln(file_var,xmax[1] , • • ,xmin[1]) ; writeln(file_var,ymax[1] , ' ' ,ymin[l]) ; writeln(file_var,xmax[2] , ' '-,xmin[2]) ; writeln(file_var,ymax[2] , ' ' ,ymin[2]) ; close(file__var) ; end; procedure read_detects2(var file_var4 : file; var txt : strlδ) ; var count : integer; temp : real; c : char; rr : integer; platform_number : integer; detects : integer; temp2 : integer; count2 : integer; begin for count2 := 1 to platform_count do begin blockread(file_var4,txt,sizeof(txt) ,rr) ; if (txt = 'PLATFORM NUMBER') then begin blockread(file_var4,platform_number,sizeof(platform_numbe r),rr) ; blockread(file_var4,txt,sizeof(txt) ,rr) ; blockread(file_var4,detects,sizeof(detects) ,rr) ; blockread(file_var4,pos[platform_number,1] ,sizeof(pos[1,1 ]),rr); blockread(file_var4,vei[platform_number,1] ,sizeof(vei[1,1 ]),rr); blockread(file_var4,vel_x_pos[platform_number,1] ,sizeof(v el_x_pos[1,1]) ,rr) ; for count := 1 to detects do begin blockread(file_var4,temp2,sizeof(temp2) ,rr) ; blockread(file_var4,temp,sizeof(temp) ,rr) ; blockread(file_var4,temp,sizeof(temp) ,rr) ; blockread(file_var4,pat_az,sizeof(pat_az) ,rr) ; blockread(file_var4,pat_el,sizeof(pat_el) ,rr) ; blockread(file_var4,object_node A [platform_number,1,1] .sta te, sizeof(object_node [platform_number,1,1] .state) ,rr) ; blockread(file_var4,c,sizeof(c) ,rr) ; blockread(file_var4,detect_array [count] .clump_num, sizeof(detect_array A [count] .clump_num) ,rr) ; end; end else if (txt <> 'END SCENARIO ') then writeln('ERROR II! TXT(PLATFORM NUMBER) = ',txt) end; end; procedure get_plots(var file_var : file) ; var flag : boolean; count : integer; current_time : integer; done : boolean; az : real; el : real; xpos : real; ypos : real; category : integer; plots : integer; scans : integer; dummy : integer; pit : integer; txt : strl5; count2 : integer; found : boolean; num_tot_temp : integer; scan_num : integer; begin flag := false; scan_num := 0; done := false; for pit := 1 to platform__count do begin xmin[plt] := le7; xmax[plt] := -le7; ymin[pit] := le7; ymax[pit] := -le7; end; while (not eof(file_var) ) and (not done) do begin blockread(file_var,time_string,sizeof(time_string) ,counte r); if (txt = 'END SCENARIO •) then done := true else if (time_string = 'CURRENT TIME ') then begin blockread(file_var,current_time,sizeof(current_time) ,coun ter) ; if (current_time >= start_time) then begin if current_time = start_time then begin scan_num := * 1; flag := true; pit := 0; end else begin scan_num := scan_num + 1; if scan_num > 3 then done := true; pit := 0; end; if (not done) then read_detects(file_var,txt,pit,scan_num) ; end else read_detects2(file_var,txt) ; end else writeln( 'ERROR ! ! ! TXT(CURRENT_TIME) = ' ,txt) ; end; close(file_var) ; end; procedure draw_plots; var count : integer; plotx : real; ploty : real; xpix : longint; ypix : longint; scan : integer; platform : integer; rad : integer; xoff : integer; yoff : integer; begin rad := 4; for platform := 1 to 2 do begin xrange[platform] := xmax[platform] xmin[platform] ; yrange[platform] := ymaxfplatfoi-m] ymin[platform] ; xrange[platform] := 2 * xrange[platform] ; yrange[platform] := 2 * yrange[platform] ; for scan := 1 to 3 do for count := 1 to plot_count[platform,scan] do begin p 1 o t x : = object_node A [platform,scan,count] .dr.azimuth; p 1 o t y : = object_node A [platform,scan,count] .dr.elevation; xpix := trunc( ( (plotx - xmin[platform]) / xrange[platform]) * 430) + 100; case platform of { 1 : ypix := 230 - trunc( ( (ploty - ymin[platform]) / yrange[platform]) * 190); 2 : ypix :— 460 - trunc(( (ploty - ymin[platform] ) / yrange[platform] ) * 190); } 1 : ypix := 200 - trunc(( (ploty ymin[platform] ) / yrange[platform] ) * 190); 2 : ypix !•= 420 - trunc( ( (ploty - ymin[platform] ) / yrange[platform] ) * 190); end; setcolor(lightmagenta) ; circle(xpix,ypix,rad) ; case scan of 1 : setfillstyle(l,green) ; 2 : setfillstyle(l,cyan) ; 3 : setfillstyle(l f lightred) ; end; floodfill(xpix,ypix,lightmagenta) ; setcolor(red) ; circle(xpix,ypix,rad) ; end; end; end; procedure cross_3d(vectorl : vector_3d_type; vector2 : vector_3d_type; var result_vector : vector_3d_type) ; begin result_vector[l] := vectorl[2] * vector2[3] vectorl[3] * vector2[2] ; result_vector[2] := vectorl[3] * vector2[l] vectorl[1] * vector2[3] ; result_vector[3] := vectorl[1] * vector2[2] vectorl[2] * vector2[1] ; end; function dot_3d(vectorl : vector_3d__type; vector2 : vector_3d_type) : real; var temp : real; count : integer; begin temp := 0; for count := 1 to 3 do temp := temp + vectorl[count] * vector2[count] ; dot_3d := temp; end; procedure normalize_3d(var vector : vector_3d_type) ; var mag : real; count : integer; begin mag := 0; for count := 1 to 3 do mag := mag + sqr(vector[count]) ; mag := sqrt(mag) ; for count :■= 1 to 3 do vector[count] := vector[count]/mag; end; procedure crank_los_vector(azimuth : real; elevation : real; pos : vector_3d_type; vei : vector_3d_type; vel_x_pos : vector_3d_type; range : real; var vecl : vector_3d_type; var vec2 : vector_3d_type) ; begin normalize_3d(pos) ; temp2 := cos(azimuth) ;. if (abs(temp2) < 0.0000000001) then temp2 := 0.0000000001; d := sin(azimuth) / temp2; temp2 := cos(elevation) ; if (abs(temp2) < 0.0000000001) then temp2 := 0.0000000001; e := sin(elevation) / temp2; f _= (vel_x_pos[2] vel[2] / (vel[l] d - vel_x__pos[1] ) ; g : - ( el_x_pos[3] - vei[3] * d) / (vel[l] d - vel_x_pos[l]) h sqrt ( sqr (range) / (sqr(e) 1)) j h / (pos[l] * f + pos [2] ) k (pos[l] * g + pos [3 ] ) / (pos [l] * f + pos[2]) 1 sqr(g - f * k) + sqr(k) + 1 ; m 2 * f * j * (g - f * k) - 2 * j * k; n sqr(f * j) + sqr(j) - sqr(range) ; c (-m + sqrt(sqr(m) - 4 * 1 * n) ) / (2 * 1); b j ~ c * k; a f * j + c * (g - f * k) ; vecl[l] a; vecl[2] b; vecl[3] c; c := (-m sqrt(sqr(m) - 4 * 1 * n) ) / (2 * 1) b := j - c * k; a := f * j + c * (g - f * k) vec2[l] := a; vec2[2] := b; vec2[3] := c; if (vei[2] < 0) then begin vecl[l] -vecl[l] vecl[2] -vecl[2] vecl[3] -vecl[3] vec2[l] -vec2[l] vec2[2] -vec2[2] vec2[3] -vec2[3] end; end; procedure pick_vector(vecl : vector_3d_type; vec2 : vector_3d_type; base : vector_3d_type; var ans : vector_3d_type) ; var temp : vector_3d_type; a : real; b : real; begin a := dot_3d(vecl,base) ; b := dot_3d(vec2,base) ; if (a > 0) and (b > 0) then begin setcolor(white) ; OUttextxy(10,10, '<VEC1,BASE> > 0 and <VEC2,BASE> > ') real; begin temp := arctan(y/x) ; if (x < 0) and (y > 0) then temp := pi + temp else if (x < 0) and (y < 0) then temp := pi + temp; if temp < 0 then temp := temp + 2 * pi; arctan2 := temp; end; procedure transform(object_state : vector_3d_type; pos : vector_3d_type; vei : vector_3d_type; vel_x_pos : vector_3d_type; var new_az : real; var new_el : real) ; var line_of_sight : vector_3d_type; elevation_cos : real; elevation_sin : real; temp : detection_record_type; ans : boolean; temp2 : real; norm_pos : vector_3d_type; range : real; txtl,txt2,txt3 : strlδ; begin line_of_sight[l] := object_state[1] - pos[l]; line_of_sight[2] := object_state[2] - pos[2]; line_of_sight[3] := object_state[3] - pos[3]; norm_pos := pos; normalize_3d(norm_pos) ; range := sqrt(dot_3d(line_of_sight,line_of_sight) ) temp.azimuth := arctan2(dot_3d(vei,line_of_sight) , dot_3d(vel_x_pos,line_of_sight) ) ; elevation_cos :=-dot_3d(norm_pos,line_of_sight)/range; elevation_sin := sqrt(1-sqr(elevation_cos) ) ; temp.elevation :=arctan2(elevation_cos,elevation_sin) ; new_az := temp.azimuth; new_el := temp.elevation; end; procedure new_xyz(platform_state : vector_3d_type; los_vector : vector_3d_type; var new_object_state : vector_3d_type) ; begin new_object_state[1] platform_state[l] + los_vector[1] ; new_object_state[2] platform_state[2] + los_vector[2] ; new_object_state[3] platform_state[3] + los_vector[3] ; end; procedure draw_new_points(new_az : real; new_el : real; platform : integer; var x : integer; var y : integer) ; var begin rad := 4; xrange[platform] xmax[platform] - xmin[platform] yrange[platform] ymax[platform] - ymin[platform] xrange[platform] 2 * xrange[platform] ; yrange[p1atform] 2 * yrang [platform] ; plotx := new_az; ploty := new_el; { xpix := trunc(((plotx - xmin[platform]) / xrange[platform]) * 430) + 20; } xpix := trunc(((plotx - xmin[platform]) / xrange[platform]) * 430) + 100; case platform of { 1 : ypix := 230 - trunc(((ploty - ymin[platform]) / yrange[platform]) * 190); 2 : ypix := 460 - trunc( ( (ploty - ymin[platform]) / yrange[platform]) * 190); } 1 : ypix := 200 - trunc( ((ploty - ymin[platform]) / yrange[platform]) * 190); 2 : ypix := 420 - trunc(( (ploty - ymin[platform]) / yrange[platform]) * 190); end; setcolor(lightmagenta) ; circle(xpix,ypix,rad) ; setfillstyle(solidfill,white) ; floodfill(xpix,ypix,lightmagenta) ; setcolor(red) ; circle(xpix,ypix,rad) ; x := xpix; y := ypix; end; procedure find_closest(azi : real; ell : real; az2 : real; el2 : real; platform : integer; scan : integer; var best : integer; var factor : real; var shortest : real; var top_dp : real) ; var plot : integer; dp : real; dist : real; vecl : vector_3d_type; vec2 : vector_3d_type; lenl : real; len2 : real; len : real; best_dp : real; cos_term : real; begin vecl[l] := azi - az2; vecl[2] := ell - el2; vecl[3] := 0; shortest := le20; best := 0; best_dp := 0; • lenl := sqrt(sqr(vecl[1]) + sqr(vecl[2]) + sqr(vecl[3]) ) ; for plot := 1 to plot_count[platform,scan] do begin v e c 2 [ 1 ] : = object__node A [platform,scan,plot] .dr.azimuth - az2; v e c 2 [ 2 ] : object_node A [platform,scan,plot] .dr.elevation - el2; vec2[3] := 0; len2 := sqrt(sqr(vec2[l]) + sqr(vec2[2]) sqr(vec2[3])) ; cos_term := dot_3d(vecl,vec2) / (lenl * len2) ; dp := len2 * cos_term; if (dp >= 0) and (dp <= lenl) then begin dist := sqrt(sqr(len2) - sqr(dp)); if (dist < shortest) then begin best := plot; shortest := dist; best_dp := dp; end; end; end; if (best <> 0) then factor := best_dp / lenl else factor : * = 0; top_dp := best_dp; end; procedure compute_xyz(plat orm : integer; scan : integer; guess_range_min : real; guess_range_max : real; factor : real; new_posa : vector_3d_type; new_posb : vector_3d_type; plot : integer; var est_xyz : vector_3d_type) ; var rl : real; r2 : real; r2_vector : vector_3d_type; r_object : real; b_vector : vector_3d_type; alpha_vector : vector_3d_type; alpha : real; b : real; a : real; c : real; cos_2 : real; cos_alpha : real; sin_alpha : real; vecl : vector_3d_type; • vec2 : vector_3d_type; begin r2_vector[l] := pos [platform, scan] [1] - new_posb[l]; r2_vector[2] := pos [platform, scan] [2] - new_posb[2]; r2_vector[3] := pos [platform, scan] [3] - new_posb[3]; r2 :=- sqrt ( sqr (r2_vector[l]) + sqr ( r2_vector [ 2 ] ) + sqr ( r 2_vector [ 3 ] ) ) ; b_vector[l] := new_posa[l] - new_posb[lf; b_vector [ 2 ] : = new_posa [ 2 ] - new__posb [ 2 ] ; b_vector [ 3 ] : = new__posa [ 3 ] - new_posb [ 3 ] ; b : * = sqrt (sqr (b_vector [ 1] ) + sqr(b_vector[2] ) + sqr (b_vector [ 3 ] ) ) ; cos_2 := dot_3d(r2_vector,b_vector) / (r2 * b) ; c : = r2 * cos_2 ; a := sqrt (sqr (r2) - sqr(c)); crank_los_vector ( ob j ect_node [platform, scan , plot] . dr . azim uth, ob j ect_node [ platform , scan , plot ] . dr . elevation , pos [platform, scan] ,vel [platform, scan] , vel_x_pos [platf orm, scan] , guess_range_min, vecl,vec2) ; pick_vector( vecl, vec2, vei [platf orm, scan] , alpha_vector) ; alpha_vector [ 1 ] : = -alpha_vector [ 1 ] ; alpha_vector [ 2 ] : = -alpha__vector [ 2 ] ; alpha_vector [ 3 ] : = -alpha_vector [ 3 ] ; alpha : = sqrt ( sqr ( alpha_vector [ 1 ] ) + sqr ( alpha_vector [ 2 ] ) + sqr (alpha__vector [ 3 ] ) ) ; cos_alpha := dot_3d(alpha_vector,b_vector) / (alpha * b); sin_alpha := sqrt(l - sqr(cos_alpha) ) r_object := a / sin_alpha; alpha_vector[1] := -alpha_vector[1] ; alpha_vector[2] := -alpha_vector[2] ; alpha_vector[3] := -alpha_ ector[3] ; normalize_3d(alpha_vector) ; est_xyz[l] = pos[platform,scan] [1] alpha_vector[1] r_object; est_xyz[2] = pos[platform,scan] [2] alpha_vector[2] r_object; est_xyz[3] - pos[platform,scan] [3] alpha_vector[3] r_object; end; procedure estimate_xyz(platforml : integer; platform2 : integer; scan : integer; plot : integer; var est_xyz : vector_3d_type; var best : integer) ; var vecl : vector_3d_type; vec2 : vector_3d_type; norm_pos : vector_3d_type; vec : vector_3d_type; new_pos : vector_3d_type; new_posa : vector_3d_type; new_posb : vector_3d_type; new_azl : real; new_ell : real; new_az2 : real; new_el2 : real; range : real; txt : str15; txtl,txt2,txt3 : strlδ; xl : integer; x2 : integer; yl : integer; y2 : integer; factor : real; dist : real; top_dp : real; begin crank_los_vector(object_node A [platforml,scan,plot] .dr.azi muth, object_node A [platforml,scan,plot] .dr.elevation, pos[platforml,scan] , ei[platforml,scan] , vel_x_pos[platforml,scan],guess_range_min, vecl,vec2) ; pick_vector(vecl,vec2,vei[platforml,scan] ,vec) ; new_xyz(pos[platforml,scan] ,vec,new_pos) ; new_posa := new_pos; transform(new_pos,pos[platform2,scan] ,vei[platform2 ,scan] , vel_x_pos[platform2,scan] ,new_azl,new_ell) ; crank_los_vector(object_node [platforml,scan,plot] .dr.azi muth, object_node A [platforml,scan,plot] .dr.elevation, pos[platforml,scan] ,vel[platforml,scan] , vel_x_pos[platforml,scan] ,guess_range__max, vecl,vec2) ; pick_vector(vecl,vec2,vei[platforml,scan] ,vec) ; new_xyz(pos[platforml,scan] ,vec,new_pos) ; new_posb := new__pos; transform(new_pos,pos[platform2,scan] ,vei[platform2,scan] , vel_x_pos[platform2,scan] ,new_az2,new_el2) ; if (platforml = 1) then begin draw_new_points(new_az1,new_el1,2,xl,y1) ; draw_new_points(new_az2,new_el2,2,x2,y2) ; setcolor(white) ; Iine(xl,yl,x2,y2) ; end; find_closest(new_azl,new_ell,new_az2,new_el2,platform2,sc an, best,factor,dist,top_dp) ; compute_xyz(platform2,scan,guess_range_min,guess_range_max, factor,new_posa,new_posb,best,est_xyz) ; end; procedure draw_lines; var platform : integer; plot : integer; scan : integer; est_xyzl2 : vector_3d_type; est_xyz21 : vector_3d_type; bestl2 : integer; best21 : integer; avg_xyz : vector_3d_type; begin for scan := 1 to 3 do for plot := 1 to plot_count[l,scan] do begin estimate_xyz(1,2,scan,plot,est_xyzl2,bestl2) ; estimate_xyz(2,1,scan,plot,est_xyz21,best21) ; avg_xyz[l] := (est_xyzl2[1] + est_xyz21[l]) / 2; avg_xyz[2] := (est_xyzl2[2] + est_xyz21[2]) / 2; avg_xyz[3] := (est_xyzl2[3] + est_xyz21[3]) / 2; writeln(file_var2, 'scan = ',scan : 1,' plot = ' ,plot : 3, ' real x,y,z = ' , object_node [l,scan,plot] .state[1] :10:2, ' object_node A [l,scan,plot] .state[2] :10:2, ' I / object_node [l,scan,plot] .state[3] :10:2) ; writeln(file_var2, • best plat 2 = ',bestl2:3, 1 est x,y,z = ' ,est_xyzl2[l] :lθ:2, ' ,est_xyzl2[2] :10:2 ' • est_xyzl2[3] :10:2) / writeln(file_var2, * best plat 1 = ',best21:3, ' est x,y,z = ' ,est_xyz21[l] :10:2, ' 1 ,est_xyz21[2] :10:2, ' ', est_xyz21[3] :10:2) ; writeln(file_var2, ' AVERAGE X,Y,Z - ', avg_xyz[1] :10:2, » ',avg_xyz[2] :10:2, ' 1 / vg_xyz[3] :10:2) ; { writeln(file_var2, 'azi,ell = ' ,new_azl:10:8, ' 1 ,new_ell:10:8, * ', 'az2,el2 = * , new_az2 : 10 : 8 , ' 1 , new_el2 : 10 : 8 ) ; writeln ( file_var2 , ' plot az,el = ' , ob j ect_node A [ 2 , scan , plot] . dr . azimuth : 10 : 8 , * ' , object_node A [2, scan, plot] .dr. elevation: 10:8, * dist = ',dist) ; writeln (file_var2, 'best dp = • ,top_dp) ; ) end; end; begin { randomize; ) clrscr; make_header ; get_start_info (infilename, start_time) ; new(object_node) ; new(object__nums) ; new(booster_launch_node) ; new(detect_array) ; assign(file_var,infilename) ; reset(file_var,l) ; assign(file_var2, 'spit.out•) ; rewrite(file_var2) ; read_params(file_var) ; clrscr; init_video; init_screen; readln; get_jplots(file__var) ; spit_detects; str(memavail,temp) ; setcolor(yellow) ; outtextxy(482,155, 'Memory = ' + temp); setcolor(green) ; str(plot_count[l,l] :l,txt) ; outtextxy(482,60,txt + ' Scan 1 Plots') setcolor(cyan) ; str(plot_count[1,2] :1,txt) ; outtextxy(482,70,txt + ' Scan 2 Plots') ' setcolor(lightred) ; str(plot_count[1,3] :1,txt) ; outtextxy(482,80,txt + • Scan 3 Plots') setcolor(green) ; str(plot_count[2,1] :1,txt) ; outtextxy(482,287,txt + * Scan 1 Plots') ; setcolor(cyan) ; str(plot_count[2,2] : 1,txt) ; outtextxy(482,297,txt + • Scan 2 Plots') ; setcolor(lightred) ; str(plot_count[2,3] : 1,txt) ; outtextxy(482,307,txt + ' Scan 3 Plots'); done := false; while not done do begin c := readkey; case c of 'P', 'p' : draw_plots; 'L• , '1 ' : draw_lines; * Q' , 'q' '• done := true; end; end; restoreσrtmode; close(file_var2) ; clrscr; end. While several illustrative embodiments of the inven¬ tion have been shown and described, numerous variations and alternate embodiments will occur to those skilled in the art, without departing from the spirit and scope of the invention. Accordingly, it is intended that the present invention not be limited solely to the specifically described illustrative embodiments. Various modifications are contemplated and can be made without departing from the spirit and scope of the invention as defined by the appended claims.

Claims: I CLAIM: 1. A method of determining the position of each of a plurality of objects (A,B,C) relative to a predetermined reference point (10) , characterized by comprising the steps of: (a) sensing each object (A,B,C) using a first sensor (14) whose position relative to the reference point (10) is known, the first sensor (14) providing first angular data defining a first line-of-sight (18a, 18b,18c) from the first sensor (14) to the respective object (A,B,C) ; (b) sensing each object (A,B,C) using a second sensor (16) whose position relative to the reference point (10) is known, the second sensor (16) providing second angular data defining a second line-of-sight (20a,20b,20c) from the second sensor (16) to the respective object (A,B,C); (c) establishing, for each object (A,B,C), a range line (24,26,28) along the respective first line-of- sight (18a,18b,18c) from a predetermined minimum range r min to a predetermined maximum range r^; (d) calculating, for each object (A,B,C) relative to the second sensor (16) , coordinates of the respective range line (24,26,28); (e) using a predetermined algorithm to match the respective second angular data for each object (A,B,C) to said range line coordinates for the respective object (A,B,C) ; (f) calculating, for each object (A,B,C) relative to the second sensor (16) , an intersection point (32) which substantially corresponds to an intersection of the respective second line-of-sight (20a,20b,20c) and the respective range line (24,26,28); and (g) calculating, for each object (A,B,C) relative to the reference point (10) , coordinates of the respective intersection point (32) ; said coordinates of the respective intersection point (32) relative to the reference point (10) specifying said position of the respective object (A,B,C) relative to the reference point (10) . 2. A method as in claim 1, in which step (e) comprises matching the second angular data for each object (A,B,C) to said range line coordinates for the respective object (A,B,C) using a basic feasible solution (greedy) algorithm. 3. A method as in claim 1, in which step (e) comprises the substeps, for each object, of: (h) calculating a perpendicular distance from the respective second line-of-sight (20a,20b,20c) to each of the range lines (24,26,28); and (i) matching the respective second angular data to the range line (24,26,28) for which said calculated perpendicular distance is minimum. 4. A method as in claim 1, in which step (e) comprises matching said second angular data for each object (A,B,C) to said range line coordinates for the respective object (A,B,C) using a global optimization algorithm. 5. A method as in claim 4, in which the global optimization algorithm is the Munkres Assignment Problem Algorithm (Hungarian Method) . 6. A method as in claim 1, in which step (£) comprises calculating, for each object (A,B,C), the respective intersection point (32) as the point of inter¬ section of the respective range line (24,26,28) with a line (30) which perpendicularly intersects the respective range line (24,26,28) and the respective second line-of-sight (20a,20b,20c) .

Inventors: WOO STEVEN C, WOO, STEVEN, C.
Applicants: HUGHES AIRCRAFT CO, HUGHES AIRCRAFT COMPANY
Application year: 1992
Main classification: G01S5
IPC codes: G01S5