44 using namespace Eigen;
 
   66     this->covMatrix = this->estimateCovariance(mPts, 
out);
 
   78     Matrix J_hessian(Matrix::Zero(6,6));
 
   79     Matrix d2J_dReadingdX(Matrix::Zero(6, max_nbr_point));
 
   80     Matrix d2J_dReferencedX(Matrix::Zero(6, max_nbr_point));
 
   82     Vector reading_point(Vector::Zero(3));
 
   83     Vector reference_point(Vector::Zero(3));
 
   85     Vector reading_direction(Vector::Zero(3));
 
   86     Vector reference_direction(Vector::Zero(3));
 
   91     if (normals.rows() < 3)    
 
   92         return std::numeric_limits<T>::max() * Matrix::Identity(6,6);
 
   94     T beta = -asin(transformation(2,0));
 
   95     T alpha = atan2(transformation(2,1), transformation(2,2));
 
   96     T gamma = atan2(transformation(1,0)/cos(beta), transformation(0,0)/cos(beta));
 
   97     T t_x = transformation(0,3);
 
   98     T t_y = transformation(1,3);
 
   99     T t_z = transformation(2,3);
 
  101     Vector tmp_vector_6(Vector::Zero(6));
 
  103     int valid_points_count = 0;
 
  106     for(
int i = 0; i < max_nbr_point; ++i)
 
  114             normal = normals.block(0,i,3,1);
 
  116             T reading_range = reading_point.norm();
 
  117             reading_direction = reading_point / reading_range;
 
  118             T reference_range = reference_point.norm();
 
  119             reference_direction = reference_point / reference_range;
 
  121             T n_alpha = normal(2)*reading_direction(1) - normal(1)*reading_direction(2);
 
  122             T n_beta = normal(0)*reading_direction(2) - normal(2)*reading_direction(0);
 
  123             T n_gamma = normal(1)*reading_direction(0) - normal(0)*reading_direction(1);
 
  125             T E = normal(0)*(reading_point(0) - gamma*reading_point(1) + beta*reading_point(2) + t_x - reference_point(0));
 
  126             E +=  normal(1)*(gamma*reading_point(0) + reading_point(1) - alpha*reading_point(2) + t_y - reference_point(1));
 
  127             E +=  normal(2)*(-beta*reading_point(0) + alpha*reading_point(1) + reading_point(2) + t_z - reference_point(2));
 
  129             T N_reading = normal(0)*(reading_direction(0) - gamma*reading_direction(1) + beta*reading_direction(2));
 
  130             N_reading +=  normal(1)*(gamma*reading_direction(0) + reading_direction(1) - alpha*reading_direction(2));
 
  131             N_reading +=  normal(2)*(-beta*reading_direction(0) + alpha*reading_direction(1) + reading_direction(2));
 
  133             T N_reference = -(normal(0)*reference_direction(0) + normal(1)*reference_direction(1) + normal(2)*reference_direction(2));
 
  136             tmp_vector_6 << normal(0), normal(1), normal(2), reading_range * n_alpha, reading_range * n_beta, reading_range * n_gamma;
 
  138             J_hessian += tmp_vector_6 * tmp_vector_6.transpose();
 
  140             tmp_vector_6 << normal(0) * N_reading, normal(1) * N_reading, normal(2) * N_reading, n_alpha * (E + reading_range * N_reading), n_beta * (E + reading_range * N_reading), n_gamma * (E + reading_range * N_reading);
 
  142             d2J_dReadingdX.block(0,valid_points_count,6,1) = tmp_vector_6;
 
  144             tmp_vector_6 << normal(0) * N_reference, normal(1) * N_reference, normal(2) * N_reference, reference_range * n_alpha * N_reference, reference_range * n_beta * N_reference, reference_range * n_gamma * N_reference;
 
  146             d2J_dReferencedX.block(0,valid_points_count,6,1) = tmp_vector_6;
 
  148             valid_points_count++;
 
  152     Matrix d2J_dZdX(Matrix::Zero(6, 2 * valid_points_count));
 
  153     d2J_dZdX.block(0,0,6,valid_points_count) = d2J_dReadingdX.block(0,0,6,valid_points_count);
 
  154     d2J_dZdX.block(0,valid_points_count,6,valid_points_count) = d2J_dReferencedX.block(0,0,6,valid_points_count);
 
  156     Matrix inv_J_hessian = J_hessian.inverse();
 
  161     return (sensorStdDev * sensorStdDev) * 
covariance;