空 挡 广 告 位 | 空 挡 广 告 位

Ultraleap Patent | Accelerated hardware using dual quaternions

Patent: Accelerated hardware using dual quaternions

Drawings: Click to check drawins

Publication Number: 20210303758

Publication Date: 20210930

Applicants: Ultraleap

Abstract

Techniques for concatenating, interpolating and upsampling pose transforms represented as dual quaternions are described, including: (1) derivation of a complex-valued matrix form of dual quaternions and dual quaternion operations; (2) derivation of a transformation operator on position vectors which obviates an explicit conversion to a classical 4.times.4 spatial transformation matrix and keeps results in complex-valued matrix space; (3) design for a generic lookup table system for functions to supply logarithm and exponentiations of the dual quaternion in its native format with trigonometry lookup tables to avoid precision issues when denominators tend to zero; and (4) a mechanism for wrapping the complex-exponentiation together with a simple complex arithmetic unit for computing dual quaternion macro-operations in both native dual quaternion space and through simplifications of the equivalent complex-valued matrix to compute dual quaternion operations such as inverses, multiplications, logarithms and exponentials in order to chain the pose transformations encoded within.

Claims

1. A device comprising: a first interface that accepts at least one sample of a state of a chain of at least one rigid body transformation represented as a dual quatemion annotated with a first set of specific sampled points in time; a second interface that accepts a second set containing at least one of the specific sampled points in time; wherein an output of the device contains a rigid body transformation chain of the first interface resampled at the second set containing at least one of the specific sampled points in time.

2. The device of claim 1 wherein each of the rigid body transform chains is associated with a subset of the first set of specific sampled points in time.

3. The device of claim 2 wherein a parallel data pipeline is used to resample the dual quatemion transformations.

4. The device of claim 2 wherein a scalar complex-valued data pipeline is used to resample the dual quatemion transformations.

5. The device of claim 2 wherein at least one transformation is a chain provided by a tracking device synchronized to a different clock.

6. A device comprising: a first interface that accepts a chain of at least one rigid body transformations represented as dual quaternions; a second interface that accepts at least one of three-dimensional vectors; wherein an output of the device contains a set of the at least one of three-dimensional vectors having been transformed by a rigid body transformation chain of the first interface.

7. The device of claim 6 wherein a parallel data pipeline is used to apply a transformation to at least one direction vector.

8. The device of claim 6 wherein a parallel data pipeline is used to apply a transformation to at least one position vector.

9. The device of claim 6 wherein a scalar complex-valued data pipeline is used to apply a transformation to at least one direction vector.

10. The device of claim 6 wherein a scalar complex-valued data pipeline is used to apply a transformation to at least one position vector.

11. A device comprising: a first interface that accepts at least one sample of a state of a chain of at least one rigid body transformation represented as dual quaternions annotated with a first set of specific sampled points in time; a second interface that delivers a synchronous stream of three-dimensional vector data, wherein at least one of the three-dimensional vectors is associated with a discrete synchronous point in time; wherein an output of the device contains the synchronous stream of the second interface transformed by the at least one rigid body transformation chain of the first interface resampled at a time of the synchronous stream.

12. The device of claim 11 wherein each transform in the chain is associated with a subset of a first set of specific sampled points in time.

13. The device of claim 12 wherein at least one transformation chain is provided by a tracking device synchronized to a different clock.

14. The device of claim 12 wherein a parallel data pipeline is used to apply the transformation to at least one direction vector.

15. The device of claim 12 wherein a parallel data pipeline is used to apply the transformation to at least one position vector.

16. The device of claim 12 wherein a scalar complex-valued data pipeline is used to apply the transformation to at least one direction vector.

17. The device of claim 12 wherein a scalar complex-valued data pipeline is used to apply the transformation to at least one position vector.

Description

PRIOR APPLICATION

[0001] This application claims the benefit of U.S. Provisional Patent Application No. 63/003, 152, filed Mar. 31, 2020, which is incorporated by reference in its entirety.

FIELD OF THE DISCLOSURE

[0002] The present disclosure relates generally to improved techniques in hardware design using transforms represented as dual quaternions.

BACKGROUND

[0003] The tracking of spatial systems is difficult to achieve, since for any given system there is a cost and also no best way to track general things. These spatial systems may require tracking involving many different sensors. Since they are tracking independently, they may not sample synchronously. They may sample at uneven intervals based on differing compute times, differing hardware implementations and across potentially many discrete processing systems. Synchronizing and synthesizing a consistent spatial model of the world across all of these is necessary in many fields such as logistics, robotics, autonomous vehicles and any technology that requires positioning modelled objects in space.

[0004] Moreover, there is no good hardware implementation of the tools required to manipulate and curate the transform data that is created by one or more tracking systems, as it is generally achieved with a software-based methodology. In this disclosure, an efficient example of such an implementation is derived and described.

[0005] The solid mechanics of rigid bodies is a model of the physical world that can be described using rigid pose transformations, which contain both a rotational component and a translational component. As such these are important building blocks for creating spatial models of real-world systems, which include model building for tracking systems of various kinds. However, manipulating transformations is difficult, as can be attested by the wealth of literature on different methods to achieve this. The "gold standard" in manipulating and resampling pose transformations seems to (by consensus) be using a dual quaternion representation, as an extension of the `real` quaternions which are an efficient method of describing rotation-only transformations. Extending the methods of quaternions which are rotation-only to create dual quaternion method is not straightforward and the state-of-the-art work that exists is in a state unsuitable for transcription into a hardware implementation. A set of techniques for concatenating, interpolating and upsampling pose transforms represented as dual quaternions is therefore herein described.

SUMMARY

[0006] Using a complex-valued matrix form of dual quaternions it is possible to derive dual quaternion operations that are more computationally efficient than traditional methods. Also it is possible to derive transformation operator on position vectors that obviates the need for an explicit conversion to a classical 4.times.4 spatial transformation matrix before application. In addition, it is possible to use a novel design for a generic lookup table system for functions to supply the more complex operations with analytic function data. The resulting hardware implementation is a complex-exponentiation together with a simple complex arithmetic unit for computing dual quaternion macro-operations. This results in both native dual quaternion space and a complex-value space for ease of implementation without compromising efficiency.

[0007] By taking these steps and assembling the machine or functional unit described quaternions and dual quaternions may be efficiently operated on in a space that utilizes the available hardware subcomponents. This is especially useful in computing interpolations of single or chained transformations. These single or chained transformations may be produced by tracking systems of any kind. Resampling or up-sampling is necessary to achieve high accuracy when combining data sets or multiple approximations of position from multiple sensors whereby each yield a different reference frame as a coordinate system that this invention may be used to interpolate between. A specific use case is recognizable in the situation where a machine learning inference network generates reference frame transformations too slowly to be useful in a particular application or use case. In this situation, up-sampling using this method is a worthwhile approach to generating a continuous data stream that satisfies higher-level system constraints.

[0008] In summary, the novel steps that have been accomplished herein are: (1) the derivation of a complex-valued matrix form of dual quaternions and dual quaternion operations; (2) the derivation of a transformation operator on position vectors which obviates the need for an explicit conversion to a classical 4.times.4 spatial transformation matrix and keeps the result in the complex-valued matrix space; (3) the design for a generic lookup table system for functions to supply the logarithm and exponentiations of the dual quaternion in its native format with trigonometry lookup tables to avoid precision issues when denominators tend to zero; and (4) a mechanism for wrapping the complex-exponentiation together with a simple complex arithmetic unit for computing dual quaternion macro-operations in both native dual quaternion space and through simplifications of the equivalent complex-valued matrix to compute dual quaternion operations such as inverses, multiplications, logarithms and exponentials in order to chain the pose transformations encoded within.

BRIEF DESCRIPTION OF THE DRAWINGS

[0009] The accompanying figures, where like reference numerals refer to identical or functionally similar elements throughout the separate views, together with the detailed description below, are incorporated in and form part of the specification, serve to further illustrate embodiments of concepts that include the claimed invention and explain various principles and advantages of those embodiments.

[0010] FIG. 1 shows a graph of a first trigonometric function for developing a `shallow` pipeline unit.

[0011] FIG. 2 shows a graph of a second trigonometric function for developing a `shallow` pipeline unit.

[0012] FIG. 3 shows a graph of a third trigonometric function for developing a `shallow` pipeline unit.

[0013] FIG. 4 shows a graph of a fourth trigonometric function for developing a `shallow` pipeline unit.

[0014] Skilled artisans will appreciate that elements in the figures are illustrated for simplicity and clarity and have not necessarily been drawn to scale. For example, the dimensions of some of the elements in the figures may be exaggerated relative to other elements to help to improve understanding of embodiments of the present invention.

[0015] The apparatus and method components have been represented where appropriate by conventional symbols in the drawings, showing only those specific details that are pertinent to understanding the embodiments of the present invention so as not to obscure the disclosure with details that will be readily apparent to those of ordinary skill in the art having the benefit of the description herein.

DETAILED DESCRIPTION

[0016] I. Algebraic Underpinnings

[0017] Cayley-Dickson algebras are the algebras accessible via the Cayley-Dickson construction. The Cayley-Dickson construction involves taking each 2.sup.n-1-dimensional algebra, adding a further imaginary component which effectively forms a 2.sup.n-dimensional algebra with elements described as ordered pairs of the 2.sup.n-1-dimensional elements. In this way, complex numbers (2-dimensional) are ordered pairs of real numbers, quaternions (4-dimensional) are ordered pairs of complex numbers and so on. As more rounds of the Cayley-Dickson construction are applied, the resulting algebras lose operational symmetries and become harder to manipulate.

[0018] The Cayley-Dickson construction is valid so long as the square of each new imaginary component is -1. However, alternative algebras can be produced if when the final step is taken the square of the imaginary component is chosen to be otherwise. Further application of the Cayley-Dickson construction applied to these algebras is then invalid, but the algebras themselves are still meaningful. If the square of the final imaginary component is chosen to be -1, the Cayley-Dickson construction can continue as normal, if 0 is chosen then the resulting algebra is known as a `dual` algebra and if 1 is chosen then the resulting algebra is known as a `split` algebra.

[0019] While quaternions (4-dimensional) in particular enjoy popularity because they have composition properties that make them isomorphic to rotation transforms, less popularized is the idea that the dual quaternions (8-dimensional) have composition properties that make them isomorphic to all pose transforms or reference frames, that is transformations which consist of only a rotational and a translational component.

[0020] As the Cayley-Dickson construction can be viewed as ordered pairs of elements, then the encoding of components can be reimagined as matrices, so for example complex numbers are represented as pairs of real numbers, which implies:

( a + i .times. b ) .function. [ 1 i ] = [ + a + ib - b + ia ] = [ a b - b a ] .function. [ 1 i ] . ##EQU00001##

[0021] Similarly, one can define a 4.times.4 matrix for a quaternion a +ib+jc+kd containing each of the basis components 1, i, j and k. However, for quaternions, the reality of the Cayley-Dickson construction (that a quaternion is expressible as an ordered pair of complex numbers) implies that a different construction for the matrix representation may also be pursued:

a+ib+jc+kd=a+ib+(c+id)j,

so an equivalent matrix to quaternions may be constructed as:

a + i .times. b + ( c + i .times. d ) .times. j .function. [ 1 j ] = [ + a + ib + ( c + id ) .times. j - c + di + ( a - ib ) .times. j ] = [ a + b .times. i c + d .times. i - c + d .times. i a - b .times. i ] .function. [ 1 j ] , ##EQU00002##

because the basis matrix multiplication must be applied from the left and obey the anticommutativity rules. A dual quaternion may be written as:

a+bi+cj+dk+(e+fi+gj+hk).epsilon.,

where .epsilon..sup.2=0. For this disclosure, the following formulation on the dual quaternion may be used:

a + b .times. i + ( c + d .times. i ) .times. j + ( e + f .times. i + ( g + h .times. i ) .times. j ) .times. .function. [ 1 j j .times. .times. ] , ##EQU00003##

then expanding the initial stages it can be written that this is equivalent to:

[ a + bi + ( c + di ) .times. j + ( e + fi + ( g + hi ) .times. j ) .times. - c + di + ( a - bi ) .times. j + ( - g + hi + ( e - fi ) .times. j ) .times. 0 + 0 .times. .times. i + ( 0 + 0 .times. .times. i ) .times. j + ( a + bi + ( c + di ) .times. j ) .times. 0 + 0 .times. i + ( 0 + 0 .times. i ) .times. j + ( - c + di + ( a - bi ) .times. j ) .times. ] ##EQU00004##

which can be expanded to a 4.times.4 matrix of complex numbers:

[ a + bi c + di e + fi g + hi - c + di a - bi - g + hi e - fi 0 0 a + bi c + di 0 0 - c + di a - bi ] ##EQU00005##

[0022] Crucially, the complex numbers do not split up, suggesting that they (a+bi, c+di, etc.) may be treated indivisibly and that any manipulation involving dual quaternions can be expressed as an equivalent using similar operators by acting on 4-dimensional vectors or 4.times.4 matrices of complex numbers.

[0023] In a similar way, this may also be split into an equivalent set of 8-dimensional vectors or 8.times.8 matrices of real numbers.

[0024] Using the above complex-valued matrix form of dual quaternions, it is possible to derive dual quaternion operations that are more computationally efficient than traditional methods. Included below is a derivation of a transformation operator on position vectors which obviates the need for an explicit conversion to a classical 4.times.4 spatial transformation matrix and keeps the result in the complex-valued matrix space. In addition, a novel design may be used for a generic lookup table system for functions to supply the logarithm and exponentiations of the dual quaternion in its native format with trigonometry lookup tables and avoid precision issues when denominators tend to zero. Lastly, this disclosure enables a mechanism for wrapping the complex-exponentiation together with a simple complex arithmetic unit for computing dual quaternion macro-operations in both native dual quaternion space and through simplifications of the equivalent complex-valued matrix. This will compute dual quaternion operations such as inverses, multiplications, logarithms and exponentials in order to chain the pose transformations encoded within.

[0025] II. Dual Quaternion Operations

[0026] Performing operations on dual quaternions can be used to perform operations on the underlying transformations. For instance, in a similar way to quaternion representations that encode only rotations and 4.times.4 real-valued spatial transformation matrices, dual quaternions may be composed right-to-left to concatenate a set of pose transforms together.

[0027] Smooth, minimal movement interpolation of pose transforms, which is difficult to describe or compute in other spaces (such as the classical 4.times.4 spatial transformation matrix that is the most common representation of transformations of this type) has a particularly simple form in dual quaternions that mimics linear interpolation. Given a dual quaternion that is composed of two ordered quaternions,

r=p+q.epsilon.,

the linear interpolation of the pose transforms or reference frames that starts at r.sub.0=P.sub.0+q.sub.0.epsilon. and ends at r.sub.1=P.sub.t+q.sub.1.epsilon. with the interpolation variable r in the interval [0, 1] yields:

r.sub..tau., linear=r.sub.0(r.sub.0.sup.-1r.sub.1).sup..tau.,

r.sub..tau., linear=r.sub.0 exp(.tau.ln(r.sub.0.sup.-1r.sub.1)), 0

p.sub..tau.+q.sub..tau..epsilon.=(p.sub.0+q.sub.0.epsilon.)exp(.tau.ln(p- .sub.0.sup.-1(1-q.sub.0.sup.-1p.sub.0.epsilon.))).

[0028] It is also possible to compute a cubic interpolation equivalent. Defining four quaternions or dual quaternions r.sub.-1, r.sub.0, r.sub.1 and r.sub.2 over which to compute the interpolation, it can be written:

r.sub..tau., cubic=r.sub..tau., linear exp(2.tau.(1-.tau.) ln(r.sub..tau., linear .sup.-1a.sub..tau., linear)),

where:

a.sub..tau., lineara .sub.0 exp(.tau.ln(a .sub.0.sup.-1a.sub.1)),

and each a.sub.t is described by:

a.sub.t=r.sub.t exp(-1/4(ln(r.sub.t.sup.-1r.sub.t+1)+ln(r.sub.t.sup.-1r.sub.t-1))).

[0029] III. Transposing Operations into Matrices

[0030] The key operations described by the dual quaternion construct may be transferred over to the matrix representation with fewer changes than would be necessary if the dual quaternion space were used. In the same way that classically, a pose transformation consisting of a rotation and translation component are transformed and encoded into a dual quaternion for more effective processing when that processing is unavailable in initial encoding of the information, the dual quaternion can be transformed into a complex-valued matrix representation when the processing would be otherwise less effective in the domain of the dual quaternion algebra. However, in this case, there appears to be an exact isomorphism of each operation in the complex-valued matrix representation.

[0031] Considering each of the required operation in turn, multiplying the complex-valued matrices which describe the dual quaternion which in turn embody the transformations is equivalent to the dual quaternion product. Inverting this matrix is equivalent to a dual quaternion inverse.

[0032] This even remains true when considering the matrix logarithm and matrix exponential. Computing the logarithm or exponential of the matrix is equivalent to computing the logarithm or exponential of the underlying dual quaternion (and should not be confused with taking the logarithm or exponentiation of the standard 4.times.4 spatial transformation matrix which is sometimes used as an approximation to blending operations on pose transforms). In this way, operations that are more efficient to compute in dual quaternion space may be achieved in that way, whereas operations deemed more efficient in the space described by the complex- or real-valued matrix definition may be achieved there.

[0033] In the special case of applying the transformation held in the dual quaternion to a direction or position vector, traditionally this is applied by transforming the dual quaternion encoding of the post transform into a standard 4.times.4 spatial transformation matrix before application to the direction or position vector. Here it is shown that this is unnecessary, as once the direction or position vector is encoded into a quaternion--as is standard practice in plain quaternion rotations--this may also be described as a permutation on the matrix operation. But in the case of the position vector there is no obvious equivalent operation in the original dual quaternion space. The operation for a direction vector (with input matrix r encoding the vector components x.sub.r, y.sub.r, z.sub.r and output matrix r' encoding the vector components x.sub.r', y.sub.r', z.sub.r') is given by applying the real quaternion portion of the dual quaternion, a+bi+cj+dk+(e+fi+gj+hk).epsilon. in the usual manner of a quaternion rotation:

r ' = .times. f r .function. ( x r ' , y r ' , z r ' ) = .times. [ 0 + x r ' .times. i y r ' + z r ' .times. i - y r ' + z r ' .times. i 0 - x r ' .times. i ] , = .times. [ a + b .times. i c + d .times. i - c + d .times. i a - b .times. i ] .function. [ 0 + x r .times. i y r + z r .times. i - y r + z r .times. i 0 - x r .times. i ] .times. [ a - bi - c - di c - di a + bi ] , ##EQU00006##

while the operation for a position vector is given by the same quaternion product but with the quaternion product of a+bi+cj+dk and -e+fi+gj+hk added (which applies the translation), which may be represented by the complex-valued matrices (with input matrix p encoding the vector components x.sub.p, y.sub.p, z.sub.p and output matrix p' encoding the vector components x.sub.p', y.sub.p', Z.sub.p'):

p ' = .times. f r .function. ( x p ' , y p ' , z p ' ) + [ a + bi c + di - c + di a - bi ] .function. [ - e + fi g + hi - g + hi - e - fi ] , = .times. f p .function. ( x p ' , y p ' , z p ' ) .function. [ 0 + x p ' .times. i y p ' + z p ' .times. i - y p ' + z p ' .times. i 0 - x p ' .times. i ] . ##EQU00007##

[0034] IV. Dual Quaternion Logarithm and Exponential

[0035] As the complex-valued matrix form of the logarithm and exponential is more complicated than considering the logarithm and exponential of the quaternion or dual quaternion itself, opting to implement these particular operations directly is a more efficient approach.

[0036] Methods to derive the logarithm and exponential for the quaternion and dual quaternion may be obtained through the Taylor expansion of each function and the principle of analytic continuity. For brevity, instead quaternion logarithms and exponentials are taken as given, expanded with dual numbers and then simplified using identities for dual numbers. The required identities for dual numbers may be readily obtained from Taylor expansions, which terminate after the first term because .epsilon..sup.2.

[0037] The exponential of the quatemion p=a+bi+cj+dk is:

.theta. = b 2 + c 2 + d 2 , .times. e p = e a .function. ( sin .times. .theta. .theta. .times. ( b .times. i + c .times. j + d .times. k ) + cos .times. .theta. ) , ##EQU00008##

and the logarithm of the quaternion is:

m = a 2 + b 2 + c 2 + d 2 , .times. n = b 2 + c 2 + d 2 , .times. .theta. = a .times. .times. tan .times. .times. 2 .times. ( n , a ) = tan - 1 .times. n a , .times. ln .times. p = ln .times. m + .theta. n .times. ( b .times. i .times. + c .times. j + d .times. k ) . ##EQU00009##

[0038] By substituting a dual number for each of the four scalar quaternion components in the logarithm and exponentiation the equivalent dual quaternion operation can be determined. For the dual quatemion r=p+q.epsilon., exponentiation is:

.theta. ~ = ( b + f .times. .times. ) 2 + ( c + g .times. .times. ) 2 + ( d + h .times. .times. ) 2 , .times. e p + q .times. .times. = e a + e .times. .times. .function. ( sin .times. .times. .theta. ~ .theta. ~ .times. ( ( b + f .times. .times. ) .times. i + ( c + g .times. .times. ) .times. j + ( d + h .times. .times. ) .times. k ) + cos .times. .times. .theta. ~ ) , ##EQU00010##

but the square root of a dual number expands to:

.alpha. + .beta. = .alpha. + .times. .beta. 2 .times. .alpha. . ##EQU00011##

The dual valued angle {tilde over (.theta.)} then expands to:

b 2 + c 2 + d 2 + ( 2 .times. b .times. f + 2 .times. c .times. g + 2 .times. d .times. h ) .times. = b 2 + c 2 + d 2 + b .times. f + c .times. g + d .times. h b 2 + c 2 + d 2 .times. , .times. .times. .theta. = b 2 + c 2 + d 2 , .times. .times. .gamma. = bf + c .times. g + d .times. h , .times. .times. .theta. ~ = .theta. + .gamma. .theta. .times. . ##EQU00012##

[0039] Expanding the trigonometry functions sin {tilde over (.theta.)} and cos {tilde over (.theta.)}:

s = sin .times. .times. .theta. = sin .times. .times. .theta. + .times. .gamma. .theta. .times. cos .times. .theta. , .times. c = cos .times. .times. .theta. ~ = cos .times. .times. .theta. - .times. .gamma. .theta. .times. sin .times. .theta. , ##EQU00013##

and:

e.sup.a+e.epsilon.=.sup.a.epsilon.e.sup.ae.

Substituting each occurrence of {tilde over (.theta.)} yields:

e r = ( e a + .times. .times. e a .times. e ) .times. ( s + .times. .gamma. .theta. .times. c .theta. + .times. .gamma. .theta. .times. ( ( b + f .times. .times. ) .times. i + ( c + g .times. .times. ) .times. j + ( d + h .times. .times. ) .times. k ) + c - .times. .gamma. .theta. .times. s ) , .times. .times. sin .times. .times. .theta. ~ .theta. ~ = s + .times. .gamma. .theta. .times. c .theta. + .times. .gamma. .theta. = ( s + .times. .gamma. .theta. .times. c ) .times. ( .theta. - .gamma. .theta. .times. ) ( .theta. + .gamma. .theta. .times. ) .times. ( .theta. - .gamma. .theta. .times. ) = .theta. .times. .times. s + .gamma. .function. ( c - s .theta. ) .theta. 2 , ##EQU00014##

Finally collecting i, j, k, .epsilon., .epsilon.i, .epsilon.j, .epsilon.k and representing the real and dual quaternions as vector components, respectively these are:

e r = ( e a + .times. .times. e a .times. e ) .function. [ c + s .theta. .times. ( bi + cj + dk ) s .theta. .times. ( fi + gj + hk ) + .gamma. .function. ( c - s .theta. ) .theta. 2 .times. ( bi + cj + dk ) - .gamma. .times. s .theta. ] , ##EQU00015##

Substituting dual numbers into the logarithm yields:

m ~ = .times. ( a + e .times. .times. ) 2 + ( b + f .times. .times. ) 2 + ( c + g .times. .times. ) 2 + ( d + h .times. .times. ) 2 , = .times. a 2 + b 2 + c 2 + d 2 + 2 .times. .times. .function. ( ae + bf + cg + dh ) , = .times. a 2 + b 2 + c 2 + d 2 + .times. a .times. e + b .times. f + c .times. g + d .times. h a 2 + b 2 + c 2 + d 2 , = .times. .theta. ' + .times. .gamma. ' .theta. ' , ##EQU00016## n ~ = .times. ( b + f .times. .times. ) 2 + ( c + g .times. .times. ) 2 + ( d + h .times. .times. ) 2 , = .times. b 2 + c 2 + d 2 + 2 .times. .function. ( bf + cg + dh ) , = .times. b 2 + c 2 + d 2 + .times. b .times. f + c .times. g + d .times. h b 2 + c 2 + d 2 , = .times. .theta. + .times. .gamma. .theta. , ##EQU00016.2## .theta. ~ = .times. a .times. .times. tan .times. .times. 2 .times. ( n ~ , a + e .times. .times. ) = .times. tan - 1 .times. ( .theta. + .times. .gamma. .theta. ) .times. ( a - e .times. .times. ) ( a + e .times. .times. ) .times. ( a - e .times. .times. ) , = .times. tan - 1 .times. a .times. .times. .theta. + .times. .times. a .times. .gamma. .theta. - .times. .times. e .times. .times. .theta. a 2 ##EQU00016.3## ln .times. .times. r = ln .times. .times. m ~ + .theta. ~ n ~ .times. ( ( b + f .times. .times. ) .times. i + ( c + g .times. .times. ) .times. j + ( d + h .times. .times. ) .times. k ) . ##EQU00016.4##

The dual number expansion of tan .sup.-1(a +.beta..epsilon.) is:

tan - 1 .function. ( .alpha. + .beta. ) = tan - 1 .function. ( .alpha. ) + .beta. .alpha. 2 + 1 .times. , ##EQU00017##

So then:

.theta. .about. = .times. tan - 1 .times. a .times. .theta. + .times. a .times. .gamma. .theta. - .times. e .times. .theta. a 2 = .times. tan - 1 .function. ( .theta. a ) + ( a .times. .gamma. .theta. - e .times. .theta. a 2 ) .times. ( 1 ( .theta. a ) 2 + 1 ) .times. , = .times. tan - 1 .function. ( .theta. a ) + a .times. .gamma. .theta. - e .times. .theta. .theta. 2 + a 2 .times. . ##EQU00018##

Setting:

[0040] .PHI. = tan - 1 .function. ( .theta. a ) = a .times. tan .times. 2 .times. ( .theta. , a ) , ##EQU00019##

the dual ratio {circumflex over (.theta.)}/{circumflex over (n)} is:

.theta. .about. n ~ = ( .PHI. + .times. a .times. .gamma. .theta. - e .times. .theta. .theta. '2 ) .times. ( .theta. - .times. .gamma. .theta. ) ( .theta. + .times. .gamma. .theta. ) .times. ( .theta. - .times. .gamma. .theta. ) = .PHI. .theta. + ( a .times. .gamma. - e .times. .theta. 2 .theta. ' .times. .times. 2 .times. .theta. 2 - .gamma. .times. .PHI. .theta. 3 ) .times. . ##EQU00020##

[0041] The dual number expansion of the logarithm is:

ln .function. ( .alpha. + .beta. .times. .times. ) = ln .function. ( .alpha. ) + .beta. .alpha. .times. , .times. ln .times. .times. m ~ = ln .function. ( .theta. ' + .times. .gamma. ' .theta. ' ) = ln .function. ( .theta. ' ) + .times. .gamma. ' .theta. '2 . ##EQU00021##

Putting this together yields a final expression for In r, again splitting the real and dual quaternion parts:

ln .times. .times. r = [ ln .function. ( .theta. ' ) + .PHI. .theta. .times. ( bi + cj + dk ) .gamma. ' .theta. ' .times. .times. 2 + .PHI. .theta. .times. ( fi + gj + hk ) + ( a .times. .times. .gamma. .theta. '2 .times. .theta. 2 - ( e .theta. '2 + .gamma. .times. .times. .PHI. .theta. 3 ) ) .times. ( bi + cj + dk ) ] . ##EQU00022##

[0042] V. Hardware Acceleration of the Computation

[0043] Each complex number may be represented as a logarithm in the form:

R exp i.theta.=a +bi,

but crucially it can be written that:

exp(+r+i(+.theta.+0))=+a+bi,

exp(+r+i(+.theta.+.pi.))=-a-bi,

exp(+r+i(-.theta.+.pi.))=-a+bi,

exp(+r+i(-.theta.+0))=+a-bi,

and that:

exp(r.sub.1+.theta..sub.1)=+a+bi,

exp(r.sub.2+i.theta..sub.2)=+c+di,

exp(r.sub.1+r.sub.2+i(.theta..sub.1.theta..sub.2))=(a+bi)(c+di)

so adding together the logarithms is equivalent to multiplication, which is not the case in any quaternion or dual quaternion space due to the lack of commutativity.

[0044] As there exists hardware implementations to provide a fast method of computing a fast transformation of exp.sub.A(r+i.theta.)=2.sup.r(e.sup..pi./.sub.2).sup.i.theta., the above can be rewritten as:

exp .sub.A(+r+i(+.theta.+0))=+a+bi,

exp .sub.A(+r+i(+.theta.+2))=-a-bi,

exp .sub.A(+r+i(-.theta.+2))=-a+bi,

exp .sub.A(+r+i(-.theta.+0))=a-bi,

where exp .sub.A denotes the affine exponentiation operation defined above, which implies modulo 4 now takes the place of modulo 2.pi. due to the base of e.sup..pi./2 on the imaginary portion of the logarithm. This combined with the fact that no complex number need be separated into its components allows computations of multiplication chains to proceed in logarithmic space for as long as they are able. As many of these transforms are relatively static given the aims are generally to apply the quaternions or dual quaternions as transforms or to interpolate them, they may be transformed once into the `machine` logarithmic format (not to be confused with a native quaternion or dual quaternion logarithm format) and then left as constants for much of the required computations.

[0045] For the elements of the computations that cannot be represented as whole complex number manipulations, such as the operations for which working with the quaternions and dual quaternions as complex-valued matrices would increase complexity over using their native counterparts, the exponential and logarithm capabilities of having this functionality yield methods to obtain various elementary and special functions which are helpful in the evaluation of such elements. Operations like this of particular interest are the native quaternion and dual quaternion logarithm and exponential, where although obtaining the logarithm or exponential of the equivalent complex-valued matrix may be achieved with this approach combined with an off-the-shelf method, it is not more efficient in general.

[0046] To build a machine capable of computing all of these functions efficiently for use in robotics, autonomous vehicles, gaming, solid mechanics, physics simulations or any other applications where reference frames or pose transforms must be accurately manipulated or resampled, the relatively heavy mechanism for the logarithm and exponentiation transforms must be married to a light-weight state machine for manipulating the numbers when in either format for an efficient solution.

[0047] VI. Hardware Machine Architecture

[0048] The architecture of the machine involves interleaving the slower (deep pipeline) algorithm described in previous filings, for which a logarithm or exponential mode may be selected for each individual pipeline stage allowing high throughput, with a fast (shallow pipeline) unit that computes simpler operations. By considering each pipeline stage to be operating on a separate contiguous data set, a number of data sets may be processed in parallel.

[0049] Due to the differences in pipeline depth between the two operations, register access may be optimized by interleaving reading and writing to the register file such that either the fast operations occur when the transform block is processing, partially overlaps with the transform processing or occurs after the transform processing. Placing the fast operations after the transform processing allow everything to occur in serial but incur the longest cycle time. It also allows the most separate tasks on the most separate data sets to occur in parallel in this architecture.

[0050] VII. `Shallow` pipeline unit

[0051] The shallow unit requires certain operations to occur in serial to compute the multiplies in logarithm space. Since these are manipulating the signs of the real and imaginary parts and adding them, the initial set required must cover various operations such as for example, while taking:

e.sub.A.sup.a+.beta.i=a+bi,

e.sub.A.sup.X+.psi.i=c+di,

describing the effect of the operation on the inputs a+.beta.i and X+.psi.i yields:

TABLE-US-00001 Operation description Action result Exponentiation Unary negate -.alpha. - .beta.i 1/(a + bi) Binary add .alpha. + .chi. + (.beta. + .psi.)i (+a + bi)(+c + di) Binary add conjugate .alpha. + .chi. + (.beta. - .psi.)i (+a + bi)(+c - di) Binary add conjugate +.pi. .alpha. + .chi. + (2 + .beta. - .psi.)i (+a + bi)(-c + di) Binary add +.pi. .alpha. + .chi. + (2 + .beta. + .psi.)i (+a + bi)(-c - di) Unary increment 1 + .alpha. + .beta.i 2(a + bi) Unary real right bit shift .alpha./2 {square root over (.parallel.a + bi.parallel.)} Unary real left bit shift 2.alpha. .parallel.a + bi.parallel..sup.2

[0052] where the +.pi. has been converted into quadrants to take advantage of the special structure of e.sub.A.

[0053] This is in addition to operations to move and copy data around. Since this is geared towards evaluating macro-operations on quaternion and dual quaternion data there are also special operations required to expedite the calculation of logarithms and exponentiations.

[0054] VIII. Limit Operations for Dual Quaternion Exponentiations and Logarithms

[0055] The exponentiation and logarithm of the dual quaternion r are:

.times. e r = ( e a + .times. .times. e a .times. e ) .function. [ c + s .theta. .times. ( bi + cj + dk ) s .theta. .times. ( fi + gj + hk ) + .gamma. .times. c - s .theta. .theta. 2 .times. ( bi + cj + dk ) - .gamma. .times. s .theta. ] , .times. ln .times. .times. r = [ ln .function. ( .theta. ' ) + .PHI. .theta. .times. ( bi + cj + dk ) .gamma. ' .theta. ' .times. .times. 2 + .PHI. .theta. .times. ( fi + gj + hk ) + ( a .times. .times. .gamma. .theta. '2 .times. .theta. 2 - ( e .theta. '2 + .gamma. .times. .times. .PHI. .theta. 3 ) ) .times. ( bi + cj + dk ) ] . ##EQU00023##

[0056] Many of these involve a ratio of various quantities with .theta., which become increasing difficult to compute as .theta. tends to zero. For this reason, it is necessary to compute these ratios using a separate method that treats the limit as .theta. tends to zero correctly. However, to begin, the trigonometric ratio functions necessary must be isolated from the terms that are simple to compute.

[0057] The most obvious of these terms is the sinc function. The sinc function is the sine function divided by the angle:

sin .times. .times. c .times. .theta. = sin .times. .theta. .theta. , ##EQU00024##

and so being a ratio with a trigonometric function is a clear candidate for isolation.

[0058] This can be used to evaluate the s/.theta. terms from the exponentiation and the reciprocal .PHI./.theta. from the logarithm, because here .theta.=sin .PHI., and so .PHI./.theta.=.PHI./sin .PHI..

[0059] The next function to parameterize is in the logarithm and also fairly straight-forward:

c - s .theta. .theta. 2 = cos .times. .theta. - sin .times. .theta. .theta. .theta. 2 . ##EQU00025##

[0060] The third function that requires parameterization is more difficult and comes from the exponentiation. It is necessary to rewrite the term:

a .times. .gamma. .theta. '2 .times. .theta. 2 - ( e .theta. '2 + .gamma. .times. .PHI. .theta. 3 ) = .times. - e .theta. '2 + .gamma. .function. ( a .theta. '2 .times. .theta. 2 - .PHI. .theta. 3 ) , = .times. - e .theta. '2 + .gamma. .theta. '3 .times. ( a .theta. ' .times. .theta. r 2 .theta. 2 - .PHI..theta. '3 .theta. 3 ) , ##EQU00026##

Since:

[0061] sin .times. .PHI. = .theta. .theta. ' , .times. cos .times. .PHI. = a .theta. ' , ##EQU00027##

This term is then:

- e .theta. '2 + .gamma. .theta. '3 .times. ( cos .times. .PHI. sin 2 .times. .PHI. - .PHI. sin 3 .times. .PHI. ) . ##EQU00028##

So the final part of this term:

cos .times. .PHI. sin 2 .times. .PHI. - .PHI. sin 3 .times. .PHI. , ##EQU00029##

[0062] is now the third function. For each of these lookup functions, the values as the independent variable tends to zero may be generated via a standard Taylor expansion around zero.

[0063] To better match the hardware available, each ln(.theta.') and factor of e.sup.a may be switched out for log.sub.2 .theta.' and 2.sup.a respectively, without loss of generality, to make the real part of the logarithm better match the special function e.sub.A, but would make the definition not directly compatible with base-e in the quaternion or dual quaternion logarithm and exponentiation. It is also possible to achieve this for the imaginary part by expand the trigonometry functions in terms of rotations or quadrants instead of radians by going back to and rewriting the angle definition of the quaternion logarithm by explicitly writing the angle as a number of rotations multiplied by 2.pi.. Then, while considering that the logarithm and exponentiation must be inverses and respect the properties of the transform, these extraneous factors of .pi. may be cancelled ax. This would result in a marginally cleaner derivation of these functions, if more involved, and would result in different cancellations around the bare angle in these functions. For brevity and an expeditious implementation, the worked expansions quoted here have omitted this possible permutation.

[0064] IX. Piecewise-Polynomial Interpolant Lookup Tables for (Trigonometric) Functions

[0065] As all three of the lookup functions required are even functions only the positive half of each has to be modelled. Further, it is assumed that converting between rotations and radians is handled, so the interval [0, .pi.] in radians is mapped to the interval [0, 1].

[0066] Each [0, 1] interval is split into 2.sup.n intervals. Then for each interval [2.sup.-n.mu., 2.sup.-n(.mu.+1)] where .mu. is some integer [0, 2.sup.n], the interval is rescaled to [0, 1]. However, due to the scaling of the interval, the Taylor expansion may be used while keeping the interval scaling coefficient h to produce:

f .function. ( x + 0 2 .times. h ) = f .function. ( x ) , .times. f .function. ( x + 1 2 .times. h ) = f .function. ( x ) + f ' .function. ( x ) 1 ! .times. ( 1 2 .times. h ) + f '' .function. ( x ) 2 ! .times. ( 1 2 .times. h ) 2 + O .function. ( h 2 ) , .times. f .function. ( x + 2 2 .times. h ) = f .function. ( x ) + f ' .function. ( x ) 1 ! .times. ( 2 2 .times. h ) + f '' .function. ( x ) 2 ! .times. ( 2 2 .times. h ) 2 + O .function. ( h 2 ) . ##EQU00030##

[0067] Rewriting these Taylor series as a matrix yields:

[ 1 0 0 1 1 2 .times. h 1 4 .times. h 2 1 h h 2 ] .function. [ f .function. ( x ) f ' .function. ( x ) f '' .function. ( x ) ] = [ f .function. ( x + 0 2 .times. h ) f .function. ( x + 1 2 .times. h ) f .function. ( x + 2 2 .times. h ) ] , ##EQU00031##

then inverting the Taylor series to show:

[ f .function. ( x ) f ' .function. ( x ) f '' .function. ( x ) ] = [ 1 0 0 - 3 h 4 h - 1 h 2 h 2 - 4 h 2 2 h 2 ] .function. [ f .function. ( x + 0 2 .times. h ) f .function. ( x + 1 2 .times. h ) f .function. ( x + 2 2 .times. h ) ] . ##EQU00032##

This then shows how f'(x) and f''(x) scale when the function values stay the same, but the interval distances change.

[0068] An interpolant with a Lagrange basis may be computed as:

f ~ .function. ( x ) = f ' .function. ( 0 2 ) x - 1 2 0 2 - 1 2 x - 2 2 0 2 - 2 2 + x - 1 2 1 2 - 0 2 f ' .function. ( 1 2 ) x - 2 2 1 2 - 2 2 + x - 0 2 2 2 - 0 2 x - 1 2 2 2 - 1 2 f ' .function. ( 2 2 ) , ##EQU00033##

and collecting terms in x yields a similar form to the inverted Taylor series matrix:

f ~ .function. ( x ) = f ' .function. ( 0 2 ) + ( - 3 .times. f ' .function. ( 0 2 ) + 4 .times. f ' .function. ( 1 2 ) - f ' .function. ( 2 2 ) ) .times. x + ( 2 .times. f ' .function. ( 0 2 ) = 4 .times. f ' .function. ( 1 2 ) + 2 .times. f ' .function. ( 2 2 ) ) .times. x 2 . ##EQU00034##

[0069] But crucially, the rescaling of the interval from a length of 2.sup.-n to a length of 1, is a scale up of the h factor by 2.sup.n while keeping the values of the function the same, so this effectively multiplies a factor of 2.sup.n with the first derivative which by the Taylor series is the coefficient of x above, as can be seen from the inverse of the Taylor series matrix. A factor of 2.sup.-2n is effectively multiplied by the second derivative which is also the coefficient of x.sup.2 above similarly shown in the inverted Taylor series matrix.

[0070] This reduces the number of bits required to represent each value to a given accuracy, allowing the use of reduced bit-width multipliers and reduced bit depth lookup tables when evaluating each term of the polynomial interpolation.

[0071] Since these functions are trigonometric in nature, their derivatives are tightly bounded, meaning that even as the multipliers become smaller, the accuracy remains constant. If it is assumed for illustration that all function evaluations, first derivatives and second derivatives are in the desired range and so evaluate to values in the range [0, 1], then the function can be described to roughly 3n-bits of accuracy using one n.times.n multiplier for the x.sup.2 and one 2n.times.2n multiplier for the x term when coupled with the standard approach to evaluating polynomials through Horner's method.

[0072] This is then:

result=s0x1.times.(s1+x2s2),

where result is the result is to roughly 3n-bits of accuracy, s0 is the constant term to 3n-bits of accuracy, x1 is the independent variable of the interpolation required to 2n-bits of accuracy, s1 is the linear term requiring 2n-bits of storage (because it is shifted down, it is actually 3n-bits of accuracy), x2 is a further copy of the independent variable of the interpolation but only required to n-bits of accuracy and s2 is the quadratic term requiring n-bits of storage (because it is shifted down, it is actually 3n-bits of accuracy). This can then be stored as three tables of varying bit depth, each with 2.sup.n table elements. This same approach also can be extended to higher powers using more tables or the quadratic table may be cut to yield a linear approximation. This may then be extended to more accuracy using either more tables or more table elements.

[0073] However, for this scheme to be most effective, the function evaluations, first derivatives and second derivatives of the function desired to be approximated must in the desired range evaluate to values in the range [0, 1]. Any deviation from this causes the result to shed accuracy as more bits are necessary and cannot be devoted to accurate results.

[0074] This approach may be readily extended to provide lookup tables for many functions, often requiring range reduction by bit shifting, including square root, reciprocal, reciprocal square root, among others.

[0075] This approach is ideal for FPGA architectures where multiplication units are fixed sizes and scarce, while lookup tables are plentiful. This is also beneficial, especially in this implementation where because the `shallow` pipeline unit requires a fast turnaround for results, the tables may be dynamically switched out between cycles to allow the function to be approximated to be selected on demand and on a per-pipeline step basis.

[0076] X. Building trigonometric lookup tables for the `shallow` pipeline unit

[0077] This design has elected to merge the quadratic lookup tables into the shallow pipeline unit alongside the very simple operations described.

[0078] To create a table for the first function sin(x)/x to manipulate this into the range [0, 1], this is restructured as:

t 1 .function. ( x ) = sin .function. ( .pi. .times. x ) .pi. .times. x . ( Function .times. .times. 1 ) ##EQU00035##

[0079] FIG. 1 shows a graph 100 of Function 1, where the x-axis 110 is x and the y-axis 120 is t.sub.1 (x). The Function 1 plot 130 is shown as dot-dash line, its first derivative 140 is shown as a dashed line, and its second derivative 150 is shown as a solid line.

[0080] At least one bit of accuracy appears to be lost in the first derivative 140 as it is negative and has a range greater than one and three bits in the second derivative 150, as it is both positive and negative and fits within the range [-4, +4). These ranges that are too large can be bit shifted in the result, but the table and multiplies can only accept the most significant bits causing a loss of precision, seemingly of three bits (the three required to represent the integer range [-4, +4)).

[0081] The second trigonometric function is again expanded with the change of variables to take the independent variable into the range [0, 1]:

t 2 .function. ( x ) = - cos .function. ( .pi. .times. x ) - sin .function. ( .pi. .times. x ) .pi. .times. x .pi. 2 .times. x 2 , ( Function .times. .times. 2 ) ##EQU00036##

where a negation has been applied to make the function always positive. This adds an extra bit of precision to the constant term, which is needed for maximum precision and the negation can be folded into other operations.

[0082] FIG. 2 shows a graph 200 of Function 2, where the x-axis 210 is x and the y-axis 120 is t.sub.2(x). The Function 2 plot 230 is shown as dot-dash line, its first derivative 240 is shown as a dashed line, and its second derivative 250 is shown as a solid line. Here the first derivative curve is in the range [-0.5, +0.5) so there are no bits of precision lost even with a signed representation. However, one bit of precision is lost on the second derivative curve as its easiest fit range is [-1, +1).

[0083] The third trigonometric function is, after having changed variables to fit the interval:

t 3 ' .function. ( x ) = cos .function. ( .pi. .times. x ) sin 2 .function. ( .pi. .times. x ) - .pi. .times. x sin 3 .function. ( .pi. .times. x ) , ( Function .times. .times. 3 ) ##EQU00037##

[0084] FIG. 3 shows a graph 300 of Function 3, where the x-axis 310 is x and the y-axis 320 is t.sub.3'(x). The Function 3 plot 330 is shown as dot-dash line, its first derivative 340 is shown as a dashed line, and its second derivative 350 is shown as a solid line. All of the required function properties tend quickly to negative infinity at 1, making direct approximation difficult. This suggests that the appropriate way to handle the approximation of this function is through its reciprocal. Helpfully, the logarithm/exponentiation methods make this easily accessible. Further, to allow more bits to be gleaned from the lookup tables, a factor of 2/3 is added. Finally, the function to be approximated is:

t 3 ' .function. ( x ) = - 2 3 .times. sin 2 .function. ( .pi.x ) cos .function. ( .pi.x ) - .pi. .times. x sin .function. ( .pi.x ) , ( Function .times. .times. 4 ) ##EQU00038##

[0085] FIG. 4 shows a graph 400 of Function 4, where the x-axis 410 is x and the y-axis 420 is t.sub.3'.sup.(x). The Function 4 plot 430 is shown as dot-dash line, its first derivative 440 is shown as a dashed line, and its second derivative 450 is shown as a solid line. This modified reciprocal of Function 3 is effectively the function (2/3)/((cos .pi.x/sin.sup.2 .pi.x)-(.pi.x/sin.sup.3 .pi.x)).

[0086] FIG. 4 shows that Function 4 generates a function evaluation that can approximated, along with its first derivative and second derivative. This has an issue in that the second derivative loses four bits of accuracy with a range between [-8, +8), but is otherwise a functional approximation.

[0087] When the function is used, since it is taken to a logarithm before being applied as a multiplication, the logarithm form allows the -2/3 constant to be extracted and reciprocal taken as a simple additional operation to the `shallow` pipeline:

TABLE-US-00002 Operation description Action result Exponentiation Constant two-thirds negate log.sub.2(2/3) - .alpha. 2/(3.parallel.a + bi.parallel.)

This inverts the effect of the extra changes, resulting in the logarithm of the original function t.sub.3'(x).

[0088] A further special function for computing the conversion between revolutions and radians may be spliced with the square root function to convert more efficiently from the radians expressed in the logarithm. This is:

TABLE-US-00003 Operation description Action result Exponentiation Square root and subtract 2.pi. (a/2) - log.sub.2(2.pi.) {square root over (.parallel.a + bi.parallel.)}/(2.pi.)

[0089] Taken together these span the methods needed.

[0090] XI. Conclusion

[0091] In the foregoing specification, specific embodiments have been described. However, one of ordinary skill in the art appreciates that various modifications and changes can be made without departing from the scope of the invention as set forth in the claims below. Accordingly, the specification and figures are to be regarded in an illustrative rather than a restrictive sense, and all such modifications are intended to be included within the scope of present teachings.

[0092] Moreover, in this document, relational terms such as first and second, top and bottom, and the like may be used solely to distinguish one entity or action from another entity or action without necessarily requiring or implying any actual such relationship or order between such entities or actions. The terms "comprises, " "comprising, " "has", "having, " "includes", "including, " "contains", "containing" or any other variation thereof, are intended to cover a non-exclusive inclusion, such that a process, method, article, or apparatus that comprises, has, includes, contains a list of elements does not include only those elements but may include other elements not expressly listed or inherent to such process, method, article, or apparatus. An element proceeded by "comprises . . . a", "has . . . a", "includes . . . a", "contains . . . a" does not, without more constraints, preclude the existence of additional identical elements in the process, method, article, or apparatus that comprises, has, includes, contains the element. The terms "a" and "an" are defined as one or more unless explicitly stated otherwise herein. The terms "substantially", "essentially", "approximately", "about" or any other version thereof, are defined as being close to as understood by one of ordinary skill in the art. The term "coupled" as used herein is defined as connected, although not necessarily directly and not necessarily mechanically. A device or structure that is "configured" in a certain way is configured in at least that way but may also be configured in ways that are not listed.

[0093] The Abstract of the Disclosure is provided to allow the reader to quickly ascertain the nature of the technical disclosure. It is submitted with the understanding that it will not be used to interpret or limit the scope or meaning of the claims. In addition, in the foregoing Detailed Description, various features are grouped together in various embodiments for the purpose of streamlining the disclosure. This method of disclosure is not to be interpreted as reflecting an intention that the claimed embodiments require more features than are expressly recited in each claim. Rather, as the following claims reflect, inventive subject matter lies in less than all features of a single disclosed embodiment. Thus, the following claims are hereby incorporated into the Detailed Description, with each claim standing on its own as a separately claimed subject matter.

您可能还喜欢...