Teoría de la marginación DSO y código correspondiente para tomar nota

1. La matriz jacobiana de DSO consta de tres partes:

        Una parte es jacobiana geométrica, que describe las cantidades geométricas relativas de cada cantidad, como la tasa de cambio de rotación y traslación;

        La segunda parte es el jacobiano de luminosidad, que describe el jacobiano de cada magnitud en relación con el parámetro de luminosidad;

        Imagen de tres partes jacobiana, es decir, degradado de imagen;

        La función objetivo es la fórmula 4 del artículo sobre la función del error de luminosidad más pequeño

2.FEJ

        El jacobiano geométrico y de luminosidad suele ser una función suave en relación con las variables independientes; mientras que el jacobiano de imagen depende de los datos de la imagen y no es lo suficientemente suave; por lo tanto, en el proceso de optimización, el jacobiano geométrico y de luminosidad solo se calcula una vez al principio. de la iteración y permanecerá sin cambios desde entonces. La imagen jacobiana se actualiza con iteración. Este enfoque se denomina primera estimación jacobiana (FEJ).

3. Matriz diagonal

        El punto de profundidad inverso necesita un marco anfitrión, y luego el punto debe proyectarse en un marco nuevo, por lo que un punto corresponde a dos marcos y una información de profundidad inversa. Entonces, la parte de pose de la matriz de Hesse no es una matriz diagonal. Pero la parte del punto de profundidad inverso sigue siendo una matriz diagonal .

4. Marginación

        Desde un punto de vista probabilístico, llamamos a este paso marginación porque en realidad convertimos el problema de encontrar (∆xc, ∆xp) (pose, profundidad inversa) en un problema de encontrar ∆xc primero y luego el proceso ∆xp. Este paso equivale a hacer una expansión de probabilidad condicional:
           P (xc, xp) = P (xc) · P (xp | xc) El
resultado es que se obtiene la distribución marginal de xc, por lo que se llama marginación. En el proceso de marginación mencionado anteriormente, en realidad marginamos todos los puntos de profundidad inversa. Al principio, se eliminó primero la profundidad inversa, por lo que se marginó la profundidad inversa y se obtuvo la distribución de los bordes de la pose.

        Por ejemplo, hay frame1, frame2, frame3 ... frame8 en la ventana de key frame y los puntos de característica pt1 ... ptn en estos marcos. Por ejemplo, si un fotograma de framex se va a descartar y expulsar de la ventana del fotograma clave, la forma directa de aparecer en la mente es descartar directamente el framex y los puntos característicos relacionados pt, y solo optimizar los fotogramas restantes en la ventana y sus puntos característicos correspondientes. Sin embargo, descartar directamente las variables resultará en la pérdida de información. Framex puede ser capaz de restringir más los marcos adyacentes, y el método de descarte directo destruirá estas restricciones. En DSO, la forma correcta de eliminar un framex de la ventana es marginarlo de la duda. La marginación es el uso del complemento de Schur.

Resuelve la ecuación de la siguiente manera:

                              

        A la marginación a la que prestamos atención, es decir, solo resolvemos las variables que queremos mantener, y da igual a aquellas variables que queremos marginar, para lograr el propósito de reducir los cálculos. Obviamente, lo que quieres marginar es la información de profundidad inversa del punto, y lo que quieres conservar es información como pose y luminosidad. Lo que queremos marginar aquí es eliminar δρ (sobre la profundidad inversa) y mantener δX (sobre los parámetros de la cámara fotométrica de pose, etc.), y eliminar la ecuación anterior para obtener:

                  

Entre ellos se llama suplemento de Shure en el medio. Con esta fórmula triangular superior, podemos calcular directamente δX.

De esta forma, podemos actualizar algunas variables de forma iterativa. En el proceso anterior, construimos Hx = b utilizando información de variable marginada, es decir, no tenemos restricciones de descarte artificial, por lo que no perderemos información, pero al calcular los resultados, solo nos actualizamos Los valores de esas variables que desea conservar. Este es el proceso de marginación. La marginación en DSO significa que ya no necesitamos este punto / marco. Cuando está marginado, pasamos su información al último a priori en lugar de usar este punto / marco.

5. Ventana corredera

       En la eliminación de Schur, es decir, la marginalización. Resolver la ecuación incremental de la parte de pose es la principal cantidad de cálculo (visual slamP253). El significado físico del coeficiente S de esa ecuación: el bloque de matriz distinto de cero en la línea fuera de la diagonal de la matriz S indica que hay un punto de hoja de ruta de observación común entre las dos variables de la cámara correspondientes a este lugar, a veces llamado vista común (Co-visibilidad). Por el contrario, si el bloque es cero, significa que las dos cámaras no observan juntas.

6. Código marginado

void EnergyFunctional::marginalizePointsF()
{
	assert(EFDeltaValid);
	assert(EFAdjointsValid);
	assert(EFIndicesValid);

	allPointsToMarg.clear();
	//循环关键帧窗口的帧
	for(EFFrame* f : frames)
	{
	//循环点
		for(int i=0;i<(int)f->points.size();i++)
		{
			EFPoint* p = f->points[i];
			//判定为需要边缘化的点  
			if(p->stateFlag == EFPointStatus::PS_MARGINALIZE)
			{
				p->priorF *= setting_idepthFixPriorMargFac;
				for(EFResidual* r : p->residualsAll)
					if(r->isActive())
                        connectivityMap[(((uint64_t)r->host->frameID) << 32) + ((uint64_t)r->target->frameID)][1]++;
				allPointsToMarg.push_back(p);
			}
		}
	}

	accSSE_bot->setZero(nFrames);
	accSSE_top_A->setZero(nFrames);
	//准备边缘化的点算一些东西
	for(EFPoint* p : allPointsToMarg)
	{
	//这些点用来计算的acc会保留下来
	//这些点还会参与位姿 相机参数以及仿射的矩阵
	//计算的结果存在Hdd_accLF 等 标号为LF变量中
		accSSE_top_A->addPoint<2>(p, this);
	//用LF来计算SCH的相关值吧
		accSSE_bot->addPoint(p, false);
		//算完了就把这个点删除了
		removePoint(p);
	}
	MatXX M, Msc;
	VecX Mb, Mbsc;
	// 解出来一组M Mb  Msc  Mbsc 来  是解方程组的元素
	accSSE_top_A->stitchDouble(M, Mb, this, false, false);
	accSSE_bot->stitchDouble(Msc, Mbsc, this);

	resInM+= accSSE_top_A->nres[0];

//这步跟方程结合看。就是计算了边缘化的点的对舒尔方程的约束
//点没了 约束留下来了

//舒尔消元的公式左侧第二行那个减式
	MatXX H =  M - Msc;
//舒尔消元的公式右侧第二行那个减式
    VecX b =  Mb - Mbsc;

	if(setting_solverMode & SOLVER_ORTHOGONALIZE_POINTMARG)
	{
		// have a look if prior is there.
		bool haveFirstFrame = false;
		for(EFFrame* f : frames) if(f->frameID==0) haveFirstFrame=true;

		if(!haveFirstFrame)
			orthogonalize(&b, &H);
	}

//将舒尔补乘个系数放到整体的黑塞矩阵中去,完成了点被边缘化掉但是
//关于计算相机位姿部分的约束保留下来的功效
	HM += setting_margWeightFac*H;
	bM += setting_margWeightFac*b;
//零空间 重新修正一次 bM HM   
	if(setting_solverMode & SOLVER_ORTHOGONALIZE_FULL)
	{
		orthogonalize(&bM, &HM);
	}

	EFIndicesValid = false;
	makeIDX();
}

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/gbz3300255/article/details/111307554
Recomendado
Clasificación