Exemple #1
0
void kalmannFilter(kalmannData *KD, double y[2]){
	double temp1[2][2];
	double temp2[2][2];
	double temp3[2][2];
	double tempVect1[2];
	double tempVect2[2];

	//calculate Xd
	Matrix_mal_Vektor_2D(KD->A,KD->Xlast, KD->Xd);

	//calculate Pd
	double transA[2][2];
	Matrixmultiplikation2D(KD->A,KD->Plast,temp1); // KEINEN RESULT POINTER???? FRAGEN!!
	Transponiert2D(KD->A, transA);
	Matrixmultiplikation2D(temp1,transA,temp2);
	Matrixaddition2D(temp2, KD->Q, KD->Pd);

	//Calculate K

	//klammer berechnen
	double transC[2][2];
	Transponiert2D(KD->C, transC);
	Matrixmultiplikation2D(KD->C,KD->Pd,temp1);
	Matrixmultiplikation2D(temp1, transC, temp2);
	Matrixaddition2D(temp2, KD->R, temp3);
	double inverseKlammer[2][2];
	Matrix_Inverse(temp3, inverseKlammer);

	//rest
	Matrixmultiplikation2D(KD->Pd,transC, temp1);
	Matrixmultiplikation2D(temp1, inverseKlammer, KD->K);

	//calculate X
	Matrix_mal_Vektor_2D(KD->C,KD->Xd,tempVect1);
	Skalar_mal_Vektor(-1,tempVect1);
	Vektoraddition2D(y,tempVect1,tempVect2);
	Matrix_mal_Vektor_2D(KD->K,tempVect2, tempVect1);
	Vektoraddition2D(KD->Xd,tempVect1,KD->X);

	//calculate P

	//klammer
	Matrixmultiplikation2D(KD->K, KD->C, temp1);
	Skalar_mal_Matrix(-1,temp1);
	Matrixaddition2D(KD->I,temp1, temp2);
	Matrixmultiplikation2D(temp2, KD->Pd,KD->P);


	//"Aus neu mach alt"
	KD->Xlast[0] = 	KD->X[0];
	KD->Xlast[1] = 	KD->X[1];

	KD->Plast[0][0] = 	KD->P[0][0];
	KD->Plast[0][1] = 	KD->P[0][1];
	KD->Plast[1][0] = 	KD->P[1][0];
	KD->Plast[1][1] = 	KD->P[1][1];



}
Exemple #2
0
PlutoMatrix *pluto_matrix_inverse(PlutoMatrix *mat)
{
    assert(mat->nrows == mat->ncols);

    PlutoMatrix *inv;

    int dim = mat->nrows;

    Matrix *pinv = Matrix_Alloc(dim, dim);
    Matrix *pmat = pluto_matrix_to_polylib(mat);

    Matrix_Inverse(pmat, pinv);
    
    inv = polylib_matrix_to_pluto(pinv);

    Matrix_Free(pmat);
    Matrix_Free(pinv);

    return inv;
}
Exemple #3
0
/* 
 * Return the Z-polyhderon 'Zpol' in canonical form: 'Result' (for the Z-poly-
 * hedron in canonical form) and Basis 'Basis' (for the basis with respect to 
 * which 'Result' is in canonical form.   
 */
void CanonicalForm(ZPolyhedron *Zpol,ZPolyhedron **Result,Matrix **Basis) {

  Matrix *B1 = NULL, *B2=NULL, *T1 , *B2inv;
  int i, l1, l2;
  Value tmp;
  Polyhedron *Image, *ImageP;
  Matrix *H, *U, *temp, *Hprime, *Uprime, *T2;
  
#ifdef DOMDEBUG
  FILE *fp;
  fp = fopen("_debug", "a");
  fprintf(fp,"\nEntered CANONICALFORM\n");
  fclose(fp);
#endif
  
  if(isEmptyZPolyhedron (Zpol)) {
    Basis[0] = Identity(Zpol->Lat->NbRows);
    Result[0] = ZDomain_Copy (Zpol);
    return ;
  }
  value_init(tmp);
  l1 = FindHermiteBasisofDomain(Zpol->P,&B1);
  Image = DomainImage (Zpol->P,(Matrix *)Zpol->Lat,MAXNOOFRAYS);
  l2 = FindHermiteBasisofDomain(Image,&B2);
    
  if (l1 != l2)
    fprintf(stderr,"In CNF : Something wrong with the Input Zpolyhedra \n"); 
  
  B2inv = Matrix_Alloc(B2->NbRows, B2->NbColumns);
  temp = Matrix_Copy(B2);
  Matrix_Inverse(temp,B2inv);
  Matrix_Free(temp);
  
  temp = Matrix_Alloc(B2inv->NbRows,Zpol->Lat->NbColumns);
  T1 = Matrix_Alloc(temp->NbRows,B1->NbColumns);
  Matrix_Product(B2inv,(Matrix *)Zpol->Lat,temp);
  Matrix_Product(temp,B1,T1);  
  Matrix_Free(temp);
  
  T2 = ChangeLatticeDimension(T1,l1);
  temp = ChangeLatticeDimension(T2,T2->NbRows+1);

  /* Adding the affine part */
  for(i = 0; i < l1; i ++)
    value_assign(temp->p[i][temp->NbColumns-1],T1->p[i][T1->NbColumns-1]);
  
  AffineHermite(temp,&H,&U);
  Hprime = ChangeLatticeDimension(H,Zpol->Lat->NbRows);
  
  /* Exchanging the Affine part */
  for(i = 0; i < l1; i ++) {
    value_assign(tmp,Hprime->p[i][Hprime->NbColumns-1]);
    value_assign(Hprime->p[i][Hprime->NbColumns-1],Hprime->p[i][H->NbColumns-1]);
    value_assign(Hprime->p[i][H->NbColumns-1],tmp);
  }
  Uprime = ChangeLatticeDimension(U,Zpol->Lat->NbRows);
  
  /* Exchanging the Affine part */
  for (i = 0;i < l1; i++) {
    value_assign(tmp,Uprime->p[i][Uprime->NbColumns-1]);
    value_assign(Uprime->p[i][Uprime->NbColumns-1],Uprime->p[i][U->NbColumns-1]);
    value_assign(Uprime->p[i][U->NbColumns-1],tmp);
  }    
  Polyhedron_Free (Image);
  Matrix_Free (B2inv);
  B2inv = Matrix_Alloc(B1->NbRows, B1->NbColumns);
  Matrix_Inverse(B1,B2inv);
  ImageP = DomainImage(Zpol->P, B2inv, MAXNOOFRAYS);
  Matrix_Free(B2inv);
  Image = DomainImage(ImageP, Uprime, MAXNOOFRAYS);
  Domain_Free(ImageP);
  Result[0] = ZPolyhedron_Alloc(Hprime, Image);
  Basis[0] = Matrix_Copy(B2); 
  
  /* Free the variables */
  Polyhedron_Free (Image);
  Matrix_Free (B1);
  Matrix_Free (B2);
  Matrix_Free (temp);
  Matrix_Free (T1);
  Matrix_Free (T2);
  Matrix_Free (H);
  Matrix_Free (U);
  Matrix_Free (Hprime);
  Matrix_Free (Uprime);
  value_clear(tmp);
  return;
} /* CanonicalForm */ 
Exemple #4
0
ERet DeferredRenderer::RenderScene( const SceneView& sceneView, const Clump& sceneData )
{
	gfxMARKER(RenderScene);

	if( sceneView.viewportWidth != m_viewportWidth || sceneView.viewportHeight != m_viewportHeight )
	{
		this->ResizeBuffers( sceneView.viewportWidth, sceneView.viewportHeight, false );
		m_viewportWidth = sceneView.viewportWidth;
		m_viewportHeight = sceneView.viewportHeight;
	}

	mxDO(BeginRender_GBuffer());

	G_PerCamera	cbPerView;
	{
		cbPerView.g_viewMatrix = sceneView.viewMatrix;

		cbPerView.g_viewProjectionMatrix = sceneView.viewMatrix * sceneView.projectionMatrix;

		cbPerView.g_inverseViewMatrix = Matrix_OrthoInverse( sceneView.viewMatrix );
		cbPerView.g_projectionMatrix = sceneView.projectionMatrix;
		cbPerView.g_inverseProjectionMatrix = ProjectionMatrix_Inverse( sceneView.projectionMatrix );
		cbPerView.g_inverseViewProjectionMatrix = Matrix_Inverse( cbPerView.g_viewProjectionMatrix );

		cbPerView.g_WorldSpaceCameraPos = sceneView.worldSpaceCameraPos;

		float n = sceneView.nearClip;
		float f = sceneView.farClip;
		float x = 1 - f / n;
		float y = f / n;
		float z = x / f;
		float w = y / f;
		cbPerView.g_ZBufferParams = Float4_Set( x, y, z, w );

		cbPerView.g_ZBufferParams2 = Float4_Set( n, f, 1.0f/n, 1.0f/f );

		float H = sceneView.projectionMatrix[0][0];
		float V = sceneView.projectionMatrix[2][1];
		float A = sceneView.projectionMatrix[1][2];
		float B = sceneView.projectionMatrix[3][2];
		cbPerView.g_ProjParams = Float4_Set( H, V, A, B );

		// x = 1/H
		// y = 1/V
		// z = 1/B
		// w = -A/B
		cbPerView.g_ProjParams2 = Float4_Set( 1/H, 1/V, 1/B, -A/B );

		llgl::UpdateBuffer(llgl::GetMainContext(), m_hCBPerCamera, sizeof(cbPerView), &cbPerView);
	}


	// G-Buffer Stage: Render all solid objects to a very sparse G-Buffer
	{
		gfxMARKER(Fill_Geometry_Buffer);

		mxDO(FxSlow_SetRenderState(m_hRenderContext, *m_rendererData, "Default"));

		G_PerObject	cbPerObject;

		TObjectIterator< rxModel >	modelIt( sceneData );
		while( modelIt.IsValid() )
		{
			const rxModel& model = modelIt.Value();

			const Float3x4* TRS = model.m_transform;

			{
				cbPerObject.g_worldMatrix = Float3x4_Unpack( *TRS );
				cbPerObject.g_worldViewMatrix = Matrix_Multiply(cbPerObject.g_worldMatrix, sceneView.viewMatrix);
				cbPerObject.g_worldViewProjectionMatrix = Matrix_Multiply(cbPerObject.g_worldMatrix, sceneView.viewProjectionMatrix);

				llgl::UpdateBuffer(m_hRenderContext, m_hCBPerObject, sizeof(cbPerObject), &cbPerObject);
			}

			const rxMesh* mesh = model.m_mesh;

			for( int iSubMesh = 0; iSubMesh < mesh->m_parts.Num(); iSubMesh++ )
			{
				const rxSubmesh& submesh = mesh->m_parts[iSubMesh];
				const rxMaterial* material = model.m_batches[iSubMesh];
				const FxShader* shader = material->m_shader;

				if( shader->localCBs.Num() )
				{
					mxASSERT(shader->localCBs.Num()==1);
					const ParameterBuffer& uniforms = material->m_uniforms;
					const FxCBuffer& rCB = shader->localCBs[0];
					llgl::UpdateBuffer(m_hRenderContext, rCB.handle, uniforms.GetDataSize(), uniforms.ToPtr() );
				}

				llgl::DrawCall	batch;
				batch.Clear();

				SetGlobalUniformBuffers( &batch );
				BindMaterial( material, &batch );

				batch.inputLayout = Rendering::g_inputLayouts[VTX_Draw];
				batch.topology = mesh->m_topology;

				batch.VB[0] = mesh->m_vertexBuffer;
				batch.IB = mesh->m_indexBuffer;
				batch.b32bit = (mesh->m_indexStride == sizeof(UINT32));

				batch.baseVertex = submesh.baseVertex;
				batch.vertexCount = submesh.vertexCount;
				batch.startIndex = submesh.startIndex;
				batch.indexCount = submesh.indexCount;

				llgl::Submit(m_hRenderContext, batch);
			}

			modelIt.MoveToNext();
		}
	}

	EndRender_GBuffer();

	// Deferred Lighting Stage: Accumulate all lights as a screen space operation
	{
		gfxMARKER(Deferred_Lighting);

		llgl::ViewState	viewState;
		{
			viewState.Reset();
			viewState.colorTargets[0].SetDefault();
			viewState.targetCount = 1;
			viewState.flags = llgl::ClearColor;
		}
		llgl::SubmitView(m_hRenderContext, viewState);

		{
			gfxMARKER(Directional_Lights);

			mxDO(FxSlow_SetRenderState(m_hRenderContext, *m_rendererData, "Deferred_Lighting"));

			FxShader* shader;
			mxDO(GetByName(*m_rendererData, "deferred_directional_light", shader));
			mxDO2(FxSlow_SetResource(shader, "GBufferTexture0", llgl::AsResource(m_colorRT0->handle), Rendering::g_samplers[PointSampler]));
			mxDO2(FxSlow_SetResource(shader, "GBufferTexture1", llgl::AsResource(m_colorRT1->handle), Rendering::g_samplers[PointSampler]));
			mxDO2(FxSlow_SetResource(shader, "DepthTexture", llgl::AsResource(m_depthRT->handle), Rendering::g_samplers[PointSampler]));

			TObjectIterator< rxGlobalLight >	lightIt( sceneData );
			while( lightIt.IsValid() )
			{
				rxGlobalLight& light = lightIt.Value();

				//mxDO(FxSlow_Commit(m_hRenderContext,shader));
				DirectionalLight lightData;
				{
					lightData.direction = Matrix_TransformNormal(sceneView.viewMatrix, light.m_direction);
					lightData.color = light.m_color;
				}
				mxDO2(FxSlow_UpdateUBO(m_hRenderContext,shader,"DATA",&lightData,sizeof(lightData)));

				DrawFullScreenTriangle(shader);

				lightIt.MoveToNext();
			}
		}


		{
			gfxMARKER(Point_Lights);

			mxDO(FxSlow_SetRenderState(m_hRenderContext, *m_rendererData, "Deferred_Lighting"));

			FxShader* shader;
			mxDO(GetAsset(shader,MakeAssetID("deferred_point_light.shader"),m_rendererData));
			mxDO2(FxSlow_SetResource(shader, "GBufferTexture0", llgl::AsResource(m_colorRT0->handle), Rendering::g_samplers[PointSampler]));
			mxDO2(FxSlow_SetResource(shader, "GBufferTexture1", llgl::AsResource(m_colorRT1->handle), Rendering::g_samplers[PointSampler]));
			mxDO2(FxSlow_SetResource(shader, "DepthTexture", llgl::AsResource(m_depthRT->handle), Rendering::g_samplers[PointSampler]));

			TObjectIterator< rxLocalLight >	lightIt( sceneData );
			while( lightIt.IsValid() )
			{
				rxLocalLight& light = lightIt.Value();

				//mxDO(FxSlow_Commit(m_hRenderContext,shader));
				PointLight lightData;
				{
					Float3 viewSpaceLightPosition = Matrix_TransformPoint(sceneView.viewMatrix, light.position);
					lightData.Position_InverseRadius = Float4_Set(viewSpaceLightPosition, 1.0f/light.radius);
					lightData.Color_Radius = Float4_Set(light.color, light.radius);
				}
				mxDO2(FxSlow_UpdateUBO(m_hRenderContext,shader,"DATA",&lightData,sizeof(lightData)));

				DrawFullScreenTriangle(shader);

				lightIt.MoveToNext();
			}
		}
	}


// Thursday, March 26, 2015 Implementing Weighted, Blended Order-Independent Transparency 
//http://casual-effects.blogspot.ru/2015/03/implemented-weighted-blended-order.html

// Forward+ notes
//http://bioglaze.blogspot.fi/2014/07/2048-point-lights-60-fps.html

	// Material Stage: Render all solid objects again while combining the lighting
	// from Stage 2 with certain material-properties (colors, reflections, glow, fog, etc.)
	// to produce the final image

#if 0
	{
		llgl::ViewState	viewState;
		{
			viewState.Reset();
			viewState.colorTargets[0].SetDefault();
			viewState.targetCount = 1;
		}
		llgl::SubmitView(m_hRenderContext, viewState);
	}

	{
		mxDO(FxSlow_SetRenderState(m_hRenderContext, *m_rendererData, "NoCulling"));

		FxShader* shader;
		mxDO(GetByName(*m_rendererData, "full_screen_triangle", shader));
		mxDO(FxSlow_SetResource(shader, "t_sourceTexture", llgl::AsResource(pColorRT1->handle), Rendering::g_samplers[PointSampler]));
		mxDO(FxSlow_Commit(m_hRenderContext,shader));

		DrawFullScreenTriangle(shader);
	}
#endif

#if 0
	{
		llgl::ViewState	viewState;
		{
			viewState.Reset();
			viewState.colorTargets[0].SetDefault();
			viewState.targetCount = 1;
		}
		llgl::SubmitView(m_hRenderContext, viewState);
	}

	{
		FxShader* shader;

		mxDO(FxSlow_SetRenderState(m_hRenderContext, *m_rendererData, "Default"));
		{
			mxDO(GetAsset(shader,MakeAssetID("debug_draw_colored.shader"),m_rendererData));
			mxDO(FxSlow_SetUniform(shader,"g_color",RGBAf::GRAY.ToPtr()));
			mxDO(FxSlow_Commit(m_hRenderContext,shader));
			DBG_Draw_Models_With_Custom_Shader(sceneView, sceneData, *shader);
		}

		mxDO(FxSlow_SetRenderState(m_hRenderContext, *m_rendererData, "NoCulling"));
		{
			mxDO(GetAsset(shader,MakeAssetID("debug_draw_normals.shader"),m_rendererData));
			float lineLength = 4.0f;
			mxDO(FxSlow_SetUniform(shader,"g_lineLength",&lineLength));
			mxDO(FxSlow_Commit(m_hRenderContext,shader));
			DBG_Draw_Models_With_Custom_Shader(sceneView, sceneData, *shader, Topology::PointList);
		}
	}
#endif

	return ALL_OK;
}
Exemple #5
0
/* headingKalman
 *
 * Implements a 1-dimensional, 1st order Kalman Filter
 *
 * That is, it deals with heading and heading rate (h and h') but no other
 * state variables.  The state equations are:
 *
 *                     X    =    A       X^
 * h = h + h'dt -->  | h  | = | 1 dt | | h  |
 * h' = h'           | h' |   | 0  1 | | h' |
 *
 * Kalman Filtering is not that hard. If it's hard you haven't found the right
 * teacher. Try taking CS373 from Udacity.com
 *
 * This notation is Octave (Matlab) syntax and is based on the Bishop-Welch
 * paper and references the equation numbers in that paper.
 * http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html
 *
 * returns : current heading estimate
 */
float headingKalman(float dt, float Hgps, bool gps, float dHgyro, bool gyro)
{
    A[1] = dt;

    /* Initialize, first time thru
    x = H*z0
    */

    //fprintf(stdout, "gyro? %c  gps? %c\n", (gyro)?'Y':'N', (gps)?'Y':'N');

    // Depending on what sensor measurements we've gotten,
    // switch between observer (H) matrices and measurement noise (R) matrices
    // TODO 3 incorporate HDOP or sat count in R
    if (gps) {
        H[0] = 1.0;
        z[0] = Hgps;
    } else {
        H[0] = 0;
        z[0] = 0;
    }

    if (gyro) {
        H[3] = 1.0;
        z[1] = dHgyro;
    } else {
        H[3] = 0;
        z[1] = 0;
    }

    //Matrix_print(2,2, A, "1. A");
    //Matrix_print(2,2, P, "   P");
    //Matrix_print(2,1, x, "   x");
    //Matrix_print(2,1, K, "   K");
    //Matrix_print(2,2, H, "2. H");
    //Matrix_print(2,1, z, "   z");

    /**********************************************************************
      * Predict
      %
      * In this step we "move" our state estimate according to the equation
      *
      * x = A*x; // Eq 1.9
      ***********************************************************************/
    float xp[2];
    Matrix_Multiply(2,2,1, xp, A, x);

    //Matrix_print(2,1, xp, "3. xp");

    /**********************************************************************
     * We also have to "move" our uncertainty and add noise. Whenever we move,
     * we lose certainty because of system noise.
     *
     * P = A*P*A' + Q; // Eq 1.10
     ***********************************************************************/
    float At[4];
    Matrix_Transpose(2,2, At, A);
    float AP[4];
    Matrix_Multiply(2,2,2, AP, A, P);
    float APAt[4];
    Matrix_Multiply(2,2,2, APAt, AP, At);
    Matrix_Add(2,2, P, APAt, Q);

    //Matrix_print(2,2, P, "4. P");

    /**********************************************************************
     * Measurement aka Correct
     * First, we have to figure out the Kalman Gain which is basically how
     * much we trust the sensor measurement versus our prediction.
     *
     * K = P*H'*inv(H*P*H' + R);    // Eq 1.11
     ***********************************************************************/
    float Ht[4];
    //Matrix_print(2,2, H,    "5. H");
    Matrix_Transpose(2,2, Ht, H);
    //Matrix_print(2,2, Ht,    "5. Ht");

    float HP[2];
    //Matrix_print(2,2, P,    "5. P");
    Matrix_Multiply(2,2,2, HP, H, P);
    //Matrix_print(2,2, HP,    "5. HP");

    float HPHt[4];
    Matrix_Multiply(2,2,2, HPHt, HP, Ht);
    //Matrix_print(2,2, HPHt,    "5. HPHt");

    float HPHtR[4];
    //Matrix_print(2,2, R,    "5. R");
    Matrix_Add(2,2, HPHtR, HPHt, R);
    //Matrix_print(2,2, HPHtR,    "5. HPHtR");

    Matrix_Inverse(2, HPHtR);
    //Matrix_print(2,2, HPHtR,    "5. HPHtR");

    float PHt[2];
    //Matrix_print(2,2, P,    "5. P");
    //Matrix_print(2,2, Ht,    "5. Ht");
    Matrix_Multiply(2,2,2, PHt, P, Ht);
    //Matrix_print(2,2, PHt,    "5. PHt");

    Matrix_Multiply(2,2,2, K, PHt, HPHtR);

    //Matrix_print(2,2, K,    "5. K");

    /**********************************************************************
     * Then we determine the discrepancy between prediction and measurement
     * with the "Innovation" or Residual: z-H*x, multiply that by the
     * Kalman gain to correct the estimate towards the prediction a little
     * at a time.
     *
     * x = x + K*(z-H*x);            // Eq 1.12
     ***********************************************************************/
    float Hx[2];
    Matrix_Multiply(2,2,1, Hx, H, xp);

    //Matrix_print(2,2, H, "6. H");
    //Matrix_print(2,1, x, "6. x");
    //Matrix_print(2,1, Hx, "6. Hx");

    float zHx[2];
    Matrix_Subtract(2,1, zHx, z, Hx);
    zHx[0] = clamp180(zHx[0]);

    //Matrix_print(2,1, z, "6. z");
    //Matrix_print(2,1, zHx, "6. zHx");

    float KzHx[2];
    Matrix_Multiply(2,2,1, KzHx, K, zHx);

    //Matrix_print(2,2, K, "6. K");
    //Matrix_print(2,1, KzHx, "6. KzHx");

    Matrix_Add(2,1, x, xp, KzHx);
    x[0] = clamp360(x[0]);    // Clamp to 0-360 range

    //Matrix_print(2,1, x, "6. x");

    /**********************************************************************
     * We also have to adjust the certainty. With a new measurement, the
     * estimate certainty always increases.
     *
     * P = (I-K*H)*P;                // Eq 1.13
     ***********************************************************************/
    float KH[4];
    //Matrix_print(2,2, K, "7. K");
    Matrix_Multiply(2,2,2, KH, K, H);
    //Matrix_print(2,2, KH, "7. KH");
    float IKH[4];
    Matrix_Subtract(2,2, IKH, I, KH);
    //Matrix_print(2,2, IKH, "7. IKH");
    float P2[4];
    Matrix_Multiply(2,2,2, P2, IKH, P);
    Matrix_Copy(2, 2, P, P2);

    //Matrix_print(2,2, P, "7. P");
    return x[0];
}