|
@@ -20,10 +20,12 @@ internal class PositionCalculator : IPositionCalculator
|
|
{
|
|
{
|
|
this.calibrationVectors = calibrationVectors;
|
|
this.calibrationVectors = calibrationVectors;
|
|
|
|
|
|
- var cv = calibrationVectors;
|
|
|
|
|
|
+ if (calibrationVectors?.Count != 0)
|
|
|
|
+ {
|
|
|
|
+ var cv = calibrationVectors;
|
|
|
|
|
|
- Matrix<double> matrixA = DenseMatrix.OfArray(new double[,]
|
|
|
|
- { {cv[0].Item1.x, cv[0].Item1.z, 1, 0, 0, 0, -cv[0].Item2.x*cv[0].Item1.x, -cv[0].Item2.x*cv[0].Item1.z},
|
|
|
|
|
|
+ Matrix<double> matrixA = DenseMatrix.OfArray(new double[,]
|
|
|
|
+ { {cv[0].Item1.x, cv[0].Item1.z, 1, 0, 0, 0, -cv[0].Item2.x*cv[0].Item1.x, -cv[0].Item2.x*cv[0].Item1.z},
|
|
{0, 0, 0, cv[0].Item1.x, cv[0].Item1.z, 1, -cv[0].Item2.z*cv[0].Item1.x, -cv[0].Item2.z*cv[0].Item1.z},
|
|
{0, 0, 0, cv[0].Item1.x, cv[0].Item1.z, 1, -cv[0].Item2.z*cv[0].Item1.x, -cv[0].Item2.z*cv[0].Item1.z},
|
|
{cv[1].Item1.x, cv[1].Item1.z, 1, 0, 0, 0, -cv[1].Item2.x*cv[1].Item1.x, -cv[1].Item2.x*cv[1].Item1.z},
|
|
{cv[1].Item1.x, cv[1].Item1.z, 1, 0, 0, 0, -cv[1].Item2.x*cv[1].Item1.x, -cv[1].Item2.x*cv[1].Item1.z},
|
|
{0, 0, 0, cv[1].Item1.x, cv[1].Item1.z, 1, -cv[1].Item2.z*cv[1].Item1.x, -cv[1].Item2.z*cv[1].Item1.z},
|
|
{0, 0, 0, cv[1].Item1.x, cv[1].Item1.z, 1, -cv[1].Item2.z*cv[1].Item1.x, -cv[1].Item2.z*cv[1].Item1.z},
|
|
@@ -31,10 +33,10 @@ internal class PositionCalculator : IPositionCalculator
|
|
{0, 0, 0, cv[2].Item1.x, cv[2].Item1.z, 1, -cv[2].Item2.z*cv[2].Item1.x, -cv[2].Item2.z*cv[2].Item1.z},
|
|
{0, 0, 0, cv[2].Item1.x, cv[2].Item1.z, 1, -cv[2].Item2.z*cv[2].Item1.x, -cv[2].Item2.z*cv[2].Item1.z},
|
|
{cv[3].Item1.x, cv[3].Item1.z, 1, 0, 0, 0, -cv[3].Item2.x*cv[3].Item1.x, -cv[3].Item2.x*cv[3].Item1.z},
|
|
{cv[3].Item1.x, cv[3].Item1.z, 1, 0, 0, 0, -cv[3].Item2.x*cv[3].Item1.x, -cv[3].Item2.x*cv[3].Item1.z},
|
|
{0, 0, 0, cv[3].Item1.x, cv[3].Item1.z, 1, -cv[3].Item2.z*cv[3].Item1.x, -cv[3].Item2.z*cv[3].Item1.z}
|
|
{0, 0, 0, cv[3].Item1.x, cv[3].Item1.z, 1, -cv[3].Item2.z*cv[3].Item1.x, -cv[3].Item2.z*cv[3].Item1.z}
|
|
- });
|
|
|
|
|
|
+ });
|
|
|
|
|
|
- Matrix<double> matrixB = DenseMatrix.OfArray(new double[,]
|
|
|
|
- {
|
|
|
|
|
|
+ Matrix<double> matrixB = DenseMatrix.OfArray(new double[,]
|
|
|
|
+ {
|
|
{cv[0].Item2.x},
|
|
{cv[0].Item2.x},
|
|
{cv[0].Item2.z},
|
|
{cv[0].Item2.z},
|
|
{cv[1].Item2.x},
|
|
{cv[1].Item2.x},
|
|
@@ -43,20 +45,21 @@ internal class PositionCalculator : IPositionCalculator
|
|
{cv[2].Item2.z},
|
|
{cv[2].Item2.z},
|
|
{cv[3].Item2.x},
|
|
{cv[3].Item2.x},
|
|
{cv[3].Item2.z}
|
|
{cv[3].Item2.z}
|
|
- }
|
|
|
|
- );
|
|
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
|
|
- var lambda = (matrixA.Transpose() * matrixA).Inverse() * matrixA.Transpose() * matrixB;
|
|
|
|
- //lambda = lambda.InsertRow(lambda.RowCount, DenseVector.OfArray(new double[] { 1 }));
|
|
|
|
- //lambda = lambda.Resize(3, 3);
|
|
|
|
- this.lambda = DenseMatrix.OfArray(new double[,]
|
|
|
|
- {
|
|
|
|
|
|
+ var lambda = (matrixA.Transpose() * matrixA).Inverse() * matrixA.Transpose() * matrixB;
|
|
|
|
+ //lambda = lambda.InsertRow(lambda.RowCount, DenseVector.OfArray(new double[] { 1 }));
|
|
|
|
+ //lambda = lambda.Resize(3, 3);
|
|
|
|
+ this.lambda = DenseMatrix.OfArray(new double[,]
|
|
|
|
+ {
|
|
{ lambda[0,0], lambda[1,0], lambda[2,0]},
|
|
{ lambda[0,0], lambda[1,0], lambda[2,0]},
|
|
{ lambda[3,0], lambda[4,0], lambda[5,0]},
|
|
{ lambda[3,0], lambda[4,0], lambda[5,0]},
|
|
{ lambda[6,0], lambda[7,0], 1}
|
|
{ lambda[6,0], lambda[7,0], 1}
|
|
- });
|
|
|
|
|
|
+ });
|
|
|
|
|
|
- testCalibration();
|
|
|
|
|
|
+ testCalibration();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
public Vector3 WorldPositionToUnityPosition(Vector3 worldPosition)
|
|
public Vector3 WorldPositionToUnityPosition(Vector3 worldPosition)
|
|
@@ -72,7 +75,7 @@ internal class PositionCalculator : IPositionCalculator
|
|
|
|
|
|
private void testCalibration()
|
|
private void testCalibration()
|
|
{
|
|
{
|
|
- foreach(var c in calibrationVectors)
|
|
|
|
|
|
+ foreach (var c in calibrationVectors)
|
|
{
|
|
{
|
|
var test = DenseVector.OfArray(new double[] { c.Item1.x, c.Item1.z, 1 });
|
|
var test = DenseVector.OfArray(new double[] { c.Item1.x, c.Item1.z, 1 });
|
|
var testOutput = lambda * test;
|
|
var testOutput = lambda * test;
|