@@ -56,7 +56,8 @@ class cBA_BlockInstr : public cMemCheck
5656 cIrbCal_Cam1 & mMasterCam ; // < Master cam to fix Gauje
5757
5858 std::vector<std::string> mVParams ; // < copy of parameters
59- cCalculator<tREAL8> * mEqRigCam ; // < Calculator for
59+ cCalculator<tREAL8> * mEqRigCam ; // < Calculator for pair of camera
60+ cCalculator<tREAL8> * mEqRatRC ; // < calculator for rattachment to calib of rig-cam
6061 tREAL8 mMulSigmaTr ; // < Multiplier for sigma-trans
6162 tREAL8 mMulSigmaRot ; // < Multiplier for sigma-rot
6263 tINT4 mModeSaveSigma ;
@@ -68,8 +69,9 @@ class cBA_BlockInstr : public cMemCheck
6869 cWeightAv<tREAL8,tREAL8> mAvgRot ;
6970 std::map<std::string,tPoseR> mPoseInit ; // < Used in case of rattachment
7071 bool mUseRat2CurrBR ; // < Is there rattachment to current
71- tREAL8 mSigTrCurBR ; // <
72- tREAL8 mSigRotCurBR ; // <
72+ tREAL8 mMulSigTrCurBR ; // <
73+ tREAL8 mMulSigRotCurBR ; // <
74+ int mNbEqPair ;
7375
7476};
7577
@@ -98,6 +100,7 @@ cBA_BlockInstr::cBA_BlockInstr
98100 mMasterCam (mCalCams ->MasterCam ()),
99101 mVParams (aVParamsPair),
100102 mEqRigCam (EqBlocRig(true ,1 ,true )),
103+ mEqRatRC (EqBlocRig_RatE(true ,1 ,true )),
101104 mMulSigmaTr (cStrIO<double >::FromStr(GetDef(aVParamsPair,1 ,std::string(" 1.0" )))),
102105 mMulSigmaRot (cStrIO<double >::FromStr(GetDef(aVParamsPair,2 ,std::string(" 1.0" )))),
103106 mModeSaveSigma (cStrIO<int >::FromStr(GetDef(aVParamsPair,3 ,std::string(" 1" )))),
@@ -121,8 +124,8 @@ cBA_BlockInstr::cBA_BlockInstr
121124 if (mUseRat2CurrBR )
122125 {
123126 MMVII_INTERNAL_ASSERT_always (aVParamCur.size ()==2 ," Bad size for Block-Rat to Cur Block Rigid" );
124- mSigTrCurBR = cStrIO<double >::FromStr (aVParamCur.at (0 ));
125- mSigRotCurBR = cStrIO<double >::FromStr (aVParamCur.at (1 ));
127+ mMulSigTrCurBR = cStrIO<double >::FromStr (aVParamCur.at (0 ));
128+ mMulSigRotCurBR = cStrIO<double >::FromStr (aVParamCur.at (1 ));
126129 }
127130}
128131
@@ -138,20 +141,49 @@ cIrbCal_Block & cBA_BlockInstr::CalBl()
138141
139142void cBA_BlockInstr::OneIter_Rattach1Cam (const cIrb_Desc1Intsr& aDesc)
140143{
141-
142144 int aKCam = mCalCams ->IndexCamFromNameCalib (aDesc.NameInstr ());
143145
144146 if (aKCam<0 ) return ;
145147
146148 cPoseWithUK & aPUK = mCalCams ->KthCam (aKCam).PoseUKInBlock ();
147149 tPoseR aP0 = *MapGet (mPoseInit ,aDesc.NameInstr ());
148150
151+
149152 StdOut () << " OneIter_Rattach1CamOneIter_Rattach1Cam "
150153 << aDesc.NameInstr ()
151154 << " Tr=" << aPUK.Pose ().Tr () -aP0.Tr ()
152155 << " Rot=" << (aPUK.Pose ().Rot ()*aP0.Rot ().MapInverse ()).ToWPK ()
153156 << " \n " ;
154157
158+ if (!mUseRat2CurrBR )
159+ return ;
160+
161+ // weight multiplier to compense number of equation Pair-Times / Cam
162+ tREAL8 aMulNb = mNbEqPair / tREAL8 (mPoseInit .size ());
163+ std::vector<double > aWeight;
164+ for (int aK=0 ; aK<3 ; aK++)
165+ aWeight.push_back (aMulNb/Square (mMulSigTrCurBR * aDesc.Sigma ().SigmaTr ()));
166+
167+ for (int aK=0 ; aK<9 ; aK++)
168+ aWeight.push_back (aMulNb/Square (mMulSigRotCurBR * aDesc.Sigma ().SigmaRot ()));
169+
170+ // [2.1] the observation/context are the coeef of rotation-matrix for linearization ;:
171+ std::vector<double > aVObs;
172+
173+ aPUK.PushObs (aVObs,false );
174+ AppendIn (aVObs,aP0.Tr ().ToStdVector ());
175+ aP0.Rot ().Mat ().PushByLine (aVObs);
176+
177+ std::vector<int > aVInd;
178+ aPUK.PushIndexes (aVInd);
179+
180+ Sys ().R_CalcAndAddObs
181+ (
182+ mEqRatRC , // the equation itself
183+ aVInd,
184+ aVObs,
185+ cResidualWeighterExplicit<tREAL8>(false ,aWeight)
186+ );
155187}
156188
157189
@@ -163,6 +195,7 @@ void cBA_BlockInstr::OneItere_1PairCam
163195
164196 )
165197{
198+
166199 // [0] ============== Extract unkonwns (for bloc & poses) ========
167200
168201 // [0.1] Extract indexes of camera-calib in bloc
@@ -237,6 +270,8 @@ void cBA_BlockInstr::OneItere_1PairCam
237270 mAvgRot .Add (1.0 ,aSumRot);
238271
239272 mSigmaPair [aPair].AddNewSigma (cIrb_SigmaInstr (1.0 ,1.0 ,std::sqrt (aSumTr),std::sqrt (aSumRot)));
273+ mNbEqPair ++;
274+
240275}
241276
242277
@@ -261,6 +296,7 @@ void cBA_BlockInstr::OneItere_1TS(cIrbComp_TimeS& aDataS)
261296
262297void cBA_BlockInstr::OneItere ()
263298{
299+ mNbEqPair =0 ;
264300 mAvgTr .Reset ();
265301 mAvgRot .Reset ();
266302
0 commit comments