6 : ndi(ci), kp(q), stereo(stereo),
7 isValid(true), useCovar(false), pointPlane(false) {}
10 :
ndi(ci),
kp(q(0), q(1), 0),
14 :
ndi(0),
kp(0, 0, 0),
38 return err.head<2>().norm();
44 return err.squaredNorm();
46 return err.head<2>().squaredNorm();
63 Eigen::Matrix<double,3,1> pc = nd.
w2n * pt;
66 Eigen::Matrix<double,2,6> jacc;
69 Eigen::Matrix<double,2,3> jacp;
76 double ipz2 = 1.0/(pz*pz);
77 if (std::isnan(ipz2) ) { printf(
"[SetJac] infinite jac\n"); *(
int *)0x0 = 0; }
79 double ipz2fx = ipz2*nd.
Kcam(0,0);
80 double ipz2fy = ipz2*nd.
Kcam(1,1);
82 double ipz2fxq =
qScale*ipz2fx;
83 double ipz2fyq =
qScale*ipz2fy;
84 Eigen::Matrix<double,3,1> pwt;
87 pwt = (pt-nd.
trans).head<3>();
90 Eigen::Matrix<double,3,1> dp = nd.
dRdx * pwt;
91 jacc(0,3) = (pz*dp(0) - px*dp(2))*ipz2fxq;
92 jacc(1,3) = (pz*dp(1) - py*dp(2))*ipz2fyq;
95 jacc(0,4) = (pz*dp(0) - px*dp(2))*ipz2fxq;
96 jacc(1,4) = (pz*dp(1) - py*dp(2))*ipz2fyq;
99 jacc(0,5) = (pz*dp(0) - px*dp(2))*ipz2fxq;
100 jacc(1,5) = (pz*dp(1) - py*dp(2))*ipz2fyq;
104 jacc(0,0) = (pz*dp(0) - px*dp(2))*ipz2fx;
105 jacc(1,0) = (pz*dp(1) - py*dp(2))*ipz2fy;
107 jacc(0,1) = (pz*dp(0) - px*dp(2))*ipz2fx;
108 jacc(1,1) = (pz*dp(1) - py*dp(2))*ipz2fy;
110 jacc(0,2) = (pz*dp(0) - px*dp(2))*ipz2fx;
111 jacc(1,2) = (pz*dp(1) - py*dp(2))*ipz2fy;
116 jacp(0,0) = (pz*dp(0) - px*dp(2))*ipz2fx;
117 jacp(1,0) = (pz*dp(1) - py*dp(2))*ipz2fy;
119 jacp(0,1) = (pz*dp(0) - px*dp(2))*ipz2fx;
120 jacp(1,1) = (pz*dp(1) - py*dp(2))*ipz2fy;
122 jacp(0,2) = (pz*dp(0) - px*dp(2))*ipz2fx;
123 jacp(1,2) = (pz*dp(1) - py*dp(2))*ipz2fy;
126 for (
int i=0; i<2; i++)
127 for (
int j=0; j<6; j++)
128 if (std::isnan(jacc(i,j)) ) { printf(
"[SetJac] NaN in jacc(%d,%d)\n", i, j); *(
int *)0x0 = 0; }
132 jpp->
Hpp = jacp.transpose() * jacp;
133 jpp->
Hcc = jacc.transpose() * jacc;
134 jpp->
Hpc = jacp.transpose() * jacc;
135 jpp->
JcTE = jacc.transpose() *
err.head<2>();
136 jpp->
Bp = jacp.transpose() *
err.head<2>();
145 Eigen::Vector3d p1 = nd.
w2i * pt;
150 printf(
"[CalcErr] negative Z! Node %d \n",
ndi);
151 if (std::isnan(
err[0]) || std::isnan(
err[1]) ) printf(
"[CalcErr] NaN!\n");
153 err = Eigen::Vector3d(0.0,0.0,0.0);
157 err.head<2>() = p1.head<2>()/p1(2);
167 double b2 = huber*huber;
168 double e2 =
err.head<2>().squaredNorm();
171 double c = 2.0*huber*sqrt(e2) - b2;
172 double w = sqrt(c/e2);
186 return err.head<2>().squaredNorm();
193 Eigen::Matrix<double,3,1> pc = nd.
w2n * pt;
196 Eigen::Matrix<double,3,3> jacp;
199 Eigen::Matrix<double,3,6> jacc;
206 double ipz2 = 1.0/(pz*pz);
207 if (std::isnan(ipz2) ) { printf(
"[SetJac] infinite jac\n"); *(
int *)0x0 = 0; }
209 double ipz2fx = ipz2*nd.
Kcam(0,0);
210 double ipz2fy = ipz2*nd.
Kcam(1,1);
213 double ipz2fxq =
qScale*ipz2fx;
214 double ipz2fyq =
qScale*ipz2fy;
215 Eigen::Matrix<double,3,1> pwt;
218 pwt = (pt-nd.
trans).head(3);
221 Eigen::Matrix<double,3,1> dp = nd.
dRdx * pwt;
222 jacc(0,3) = (pz*dp(0) - px*dp(2))*ipz2fxq;
223 jacc(1,3) = (pz*dp(1) - py*dp(2))*ipz2fyq;
224 jacc(2,3) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
227 jacc(0,4) = (pz*dp(0) - px*dp(2))*ipz2fxq;
228 jacc(1,4) = (pz*dp(1) - py*dp(2))*ipz2fyq;
229 jacc(2,4) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
232 jacc(0,5) = (pz*dp(0) - px*dp(2))*ipz2fxq;
233 jacc(1,5) = (pz*dp(1) - py*dp(2))*ipz2fyq;
234 jacc(2,5) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
238 jacc(0,0) = (pz*dp(0) - px*dp(2))*ipz2fxq;
239 jacc(1,0) = (pz*dp(1) - py*dp(2))*ipz2fy;
240 jacc(2,0) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
242 jacc(0,1) = (pz*dp(0) - px*dp(2))*ipz2fxq;
243 jacc(1,1) = (pz*dp(1) - py*dp(2))*ipz2fy;
244 jacc(2,1) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
246 jacc(0,2) = (pz*dp(0) - px*dp(2))*ipz2fxq;
247 jacc(1,2) = (pz*dp(1) - py*dp(2))*ipz2fy;
248 jacc(2,2) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
253 jacp(0,0) = (pz*dp(0) - px*dp(2))*ipz2fxq;
254 jacp(1,0) = (pz*dp(1) - py*dp(2))*ipz2fy;
255 jacp(2,0) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
257 jacp(0,1) = (pz*dp(0) - px*dp(2))*ipz2fxq;
258 jacp(1,1) = (pz*dp(1) - py*dp(2))*ipz2fy;
259 jacp(2,1) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
261 jacp(0,2) = (pz*dp(0) - px*dp(2))*ipz2fxq;
262 jacp(1,2) = (pz*dp(1) - py*dp(2))*ipz2fy;
263 jacp(2,2) = (pz*dp(0) - (px-b)*dp(2))*ipz2fxq;
266 for (
int i=0; i<2; i++)
267 for (
int j=0; j<6; j++)
268 if (std::isnan(jacc(i,j)) ) { printf(
"[SetJac] NaN in jacc(%d,%d)\n", i, j); *(
int *)0x0 = 0; }
277 jpp->
Hpp = jacp.transpose() * jacp;
278 jpp->
Hcc = jacc.transpose() * jacc;
279 jpp->
Hpc = jacp.transpose() * jacc;
280 jpp->
JcTE = jacc.transpose() *
err;
281 jpp->
Bp = jacp.transpose() *
err;
290 Eigen::Vector3d p1 = nd.
w2i * pt;
291 Eigen::Vector3d p2 = nd.
w2n * pt;
292 Eigen::Vector3d pb(nd.
baseline,0,0);
305 p1 = nd.
w2i*Eigen::Vector4d(projpt.x(), projpt.y(), projpt.z(), 1.0);
306 p2 = nd.
w2n*Eigen::Vector4d(projpt.x(), projpt.y(), projpt.z(), 1.0);
309 double invp1 = 1.0/p1(2);
311 err.head<2>() = p1.head<2>()*invp1;
313 p2 = nd.
Kcam*(p2-pb);
315 err(2) = p2(0)/p2(2);
319 printf(
"[CalcErr] negative Z! Node %d\n",
ndi);
320 if (std::isnan(
err[0]) || std::isnan(
err[1]) ) printf(
"[CalcErr] NaN!\n");
328 if (abs(
err(0)) > 1e6 || abs(
err(1)) > 1e6 || abs(
err(2)) > 1e6)
330 printf(
"\n\n[CalcErr] Excessive error.\n");
341 double b2 = huber*huber;
342 double e2 = err.squaredNorm();
345 double c = 2.0*huber*sqrt(e2) - b2;
346 double w = sqrt(c/e2);
352 return err.squaredNorm();
Eigen::Matrix< double, 3, 3 > dRdx
Derivatives of the rotation matrix transpose wrt quaternion xyz, used for calculating Jacobian wrt po...
Eigen::Matrix< double, 3, 6 > Hpc
Point-to-camera Hessian (JpT*Jc)
Eigen::Matrix< double, 3, 4 > w2i
The transform from world to image coordinates.
void setJacobiansMono_(const Node &nd, const Point &pt, JacobProds *jpp)
Set monocular jacobians/hessians.
double calcErr(const Node &nd, const Point &pt, double huber=0.0)
Calculates re-projection error and stores it in err.
Eigen::Matrix< double, 3, 3 > Kcam
Projection to frame image coordinates. pre-multiply by the frame camera matrix.
Point point
An Eigen 4-vector containing the <x, y, z, w> coordinates of the point associated with the track...
static constexpr double qScale
Eigen::Matrix< double, 6, 6 > Hcc
Camera-to-camera Hessian (JcT*Jc)
void setJacobians(const Node &nd, const Point &pt, JacobProds *jpp)
Sets the jacobians and hessians for the projection to use for SBA.
Eigen::Matrix< double, 3, 3 > dRdy
void clearCovariance()
Clear the covariance matrix and no longer use it.
bool useCovar
Use a covariance matrix?
Proj()
Default constructor. Initializes to default values, kp = <0 0 0> and ndi = <0>. Also sets the project...
Eigen::Matrix< double, 3, 3 > Hpp
Point-to-point Hessian (JpT*Jp).
void setCovariance(const Eigen::Matrix3d &covar)
Set the covariance matrix to use for cost calculation. Without the covariance matrix, cost is calculated by: cost = ||err|| With a covariance matrix, the cost is calculated by: cost = (err)T*covar*(err)
Eigen::Vector3d err
Reprojection error.
Eigen::Matrix< double, 3, 1 > Bp
The B matrix with respect to points (JpT*Err)
void setJacobiansStereo_(const Node &nd, const Point &pt, JacobProds *jpp)
Set stereo jacobians/hessians.
double baseline
baseline for stereo
NODE holds graph nodes corresponding to frames, for use in sparse bundle adjustment. Each node has a 6DOF pose, encoded as a translation vector and rotation unit quaternion (Eigen classes). These represent the pose of the node in the world frame.
Eigen::Matrix< double, 6, 1 > JcTE
Another matrix with respect to cameras (JcT*Err)
bool stereo
Whether the projection is Stereo (True) or Monocular (False).
Eigen::Matrix< double, 3, 4 > w2n
Resultant transform from world to node coordinates.
double getErrNorm()
Get the correct norm of the error, depending on whether the projection is monocular or stereo...
double calcErrMono_(const Node &nd, const Point &pt, double huber)
Calculate error function for stereo.
Track()
Default constructor for Track.
int ndi
Node index, the camera node for this projection.
Eigen::Vector3d plane_point
Point for point-plane projections.
bool isValid
valid or not (could be out of bounds)
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Matrix< double, 4, 1 > trans
Translation in homogeneous coordinates, last element is 1.0.
Eigen::Vector3d kp
Keypoint, u,v,u-d vector.
double getErrSquaredNorm()
Get the correct squared norm of the error, depending on whether the projection is monocular or stereo...
JacobProds * jp
Jacobian products.
bool pointPlane
Whether this is a point-plane match (true) or a point-point match (false).
Eigen::Vector4d Point
Point holds 3D points using in world coordinates. Currently we just represent these as 4-vectors...
double calcErrStereo_(const Node &nd, const Point &pt, double huber)
Calculate error function for stereo.
Eigen::Matrix< double, 3, 3 > dRdz
Eigen::Matrix< double, 3, 3 > covarmat
Covariance matrix for cost calculation.
Eigen::Vector3d plane_normal
Normal for point-plane projections.