2828
2929#include < Eigen/Geometry>
3030
31+ #include " g2o/core/eigen_types.h"
32+
3133namespace g2o {
3234
35+ namespace {
36+ constexpr double kYSquaredBnd {0.1 };
37+
38+ void makeRot (Matrix3& R, const Vector3& normal) {
39+ Vector3 y (0 ., 1 ., 0 .);
40+ R.row (2 ) = normal;
41+ y = y - normal (1 ) * normal;
42+ const double ysquarednorm = y.squaredNorm ();
43+ if (ysquarednorm >= kYSquaredBnd ) {
44+ y /= std::sqrt (ysquarednorm);
45+ R.row (1 ) = y;
46+ R.row (0 ) = normal.cross (R.row (1 ));
47+ } else {
48+ Vector3 x (-1 ., 0 ., 0 .);
49+ x = x + normal (0 ) * normal;
50+ x.normalize ();
51+ R.row (0 ) = x;
52+ R.row (1 ) = -normal.cross (R.row (0 ));
53+ }
54+ }
55+
56+ Matrix3 prec (double e, const Matrix3& R) {
57+ Matrix3 prec_mat;
58+ prec_mat << e, 0 , 0 , 0 , e, 0 , 0 , 0 , 1 ;
59+ return R.transpose () * prec_mat * R;
60+ }
61+
62+ Matrix3 cov (double e, const Matrix3& R) {
63+ Matrix3 cov_mat;
64+ cov_mat << 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , e;
65+ return R.transpose () * cov_mat * R;
66+ }
67+ } // namespace
68+
3369EdgeGICP::EdgeGICP () {
3470 pos0.setZero ();
3571 pos1.setZero ();
@@ -40,55 +76,28 @@ EdgeGICP::EdgeGICP() {
4076 R1 .setIdentity ();
4177}
4278
43- void EdgeGICP::makeRot0 () {
44- Vector3 y;
45- y << 0 , 1 , 0 ;
46- R0 .row (2 ) = normal0;
47- y = y - normal0 (1 ) * normal0;
48- y.normalize (); // need to check if y is close to 0
49- R0 .row (1 ) = y;
50- R0 .row (0 ) = normal0.cross (R0 .row (1 ));
51- // cout << normal.transpose() << endl;
52- // cout << R0 << endl << endl;
53- // cout << R0*R0.transpose() << endl << endl;
54- }
79+ void EdgeGICP::makeRot0 () { makeRot (R0 , normal0); }
5580
56- void EdgeGICP::makeRot1 () {
57- Vector3 y;
58- y << 0 , 1 , 0 ;
59- R1 .row (2 ) = normal1;
60- y = y - normal1 (1 ) * normal1;
61- y.normalize (); // need to check if y is close to 0
62- R1 .row (1 ) = y;
63- R1 .row (0 ) = normal1.cross (R1 .row (1 ));
64- }
81+ void EdgeGICP::makeRot1 () { makeRot (R1 , normal1); }
6582
6683Matrix3 EdgeGICP::prec0 (double e) {
6784 makeRot0 ();
68- Matrix3 prec;
69- prec << e, 0 , 0 , 0 , e, 0 , 0 , 0 , 1 ;
70- return R0 .transpose () * prec * R0 ;
85+ return prec (e, R0 );
7186}
7287
7388Matrix3 EdgeGICP::prec1 (double e) {
7489 makeRot1 ();
75- Matrix3 prec;
76- prec << e, 0 , 0 , 0 , e, 0 , 0 , 0 , 1 ;
77- return R1 .transpose () * prec * R1 ;
90+ return prec (e, R1 );
7891}
7992
8093Matrix3 EdgeGICP::cov0 (double e) {
8194 makeRot0 ();
82- Matrix3 cov;
83- cov << 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , e;
84- return R0 .transpose () * cov * R0 ;
95+ return cov (e, R0 );
8596}
8697
8798Matrix3 EdgeGICP::cov1 (double e) {
8899 makeRot1 ();
89- Matrix3 cov;
90- cov << 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , e;
91- return R1 .transpose () * cov * R1 ;
100+ return cov (e, R1 );
92101}
93102
94103} // namespace g2o
0 commit comments