29 const Eigen::MatrixXd &prior_Info,
const Eigen::MatrixXd &prior_grad)
30 : x_lin(x_lin_), x_type(x_type_) {
34 int state_error_size = 0;
35 for (
auto const &str : x_type_) {
38 state_error_size += 3;
39 }
else if (str ==
"quat_yaw") {
41 state_error_size += 1;
42 }
else if (str ==
"vec1") {
44 state_error_size += 1;
45 }
else if (str ==
"vec3") {
47 state_error_size += 3;
48 }
else if (str ==
"vec8") {
50 state_error_size += 8;
52 std::cerr <<
"type - " << str <<
" not implemented in prior" << std::endl;
53 std::exit(EXIT_FAILURE);
56 assert(
x_lin.rows() == state_size);
57 assert(
x_lin.cols() == 1);
58 assert(prior_Info.rows() == state_error_size);
59 assert(prior_Info.cols() == state_error_size);
60 assert(prior_grad.rows() == state_error_size);
61 assert(prior_grad.cols() == 1);
65 Eigen::LLT<Eigen::MatrixXd> lltOfI(prior_Info);
66 sqrtI = lltOfI.matrixL().transpose();
67 Eigen::MatrixXd I = Eigen::MatrixXd::Identity(prior_Info.rows(), prior_Info.rows());
68 b =
sqrtI.triangularView<Eigen::Upper>().solve(I) * prior_grad;
71 if (std::isnan(prior_Info.norm()) || std::isnan(
sqrtI.norm()) || std::isnan(
b.norm())) {
72 std::cerr <<
"prior_Info - " << std::endl << prior_Info << std::endl << std::endl;
73 std::cerr <<
"prior_Info_inv - " << std::endl << prior_Info.inverse() << std::endl << std::endl;
74 std::cerr <<
"b - " << std::endl <<
b << std::endl << std::endl;
75 std::exit(EXIT_FAILURE);
79 set_num_residuals(state_error_size);
80 for (
auto const &str : x_type_) {
82 mutable_parameter_block_sizes()->push_back(4);
83 if (str ==
"quat_yaw")
84 mutable_parameter_block_sizes()->push_back(4);
86 mutable_parameter_block_sizes()->push_back(1);
88 mutable_parameter_block_sizes()->push_back(3);
90 mutable_parameter_block_sizes()->push_back(8);
99 Eigen::MatrixXd res = Eigen::MatrixXd::Zero(num_residuals(), 1);
102 for (
size_t i = 0; i <
x_type.size(); i++) {
103 if (
x_type[i] ==
"quat") {
104 Eigen::Vector4d q_i = Eigen::Map<const Eigen::Vector4d>(parameters[i]);
108 res.block(local_it, 0, 3, 1) = -theta_err;
109 if (jacobians && jacobians[i]) {
110 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(jacobians[i], num_residuals(), 4);
113 Eigen::Matrix3d H_theta = -Jr_inv * R_lin.transpose();
114 jacobian.block(0, 0, num_residuals(), 3) =
sqrtI.block(0, local_it, num_residuals(), 3) * H_theta;
118 }
else if (
x_type[i] ==
"quat_yaw") {
119 Eigen::Vector3d ez = Eigen::Vector3d(0.0, 0.0, 1.0);
120 Eigen::Vector4d q_i = Eigen::Map<const Eigen::Vector4d>(parameters[i]);
124 res(local_it, 0) = -(ez.transpose() * theta_err)(0, 0);
125 if (jacobians && jacobians[i]) {
126 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(jacobians[i], num_residuals(), 4);
129 Eigen::Matrix<double, 1, 3> H_theta = -ez.transpose() * (Jr_inv * R_lin.transpose());
130 jacobian.block(0, 0, num_residuals(), 3) =
sqrtI.block(0, local_it, num_residuals(), 1) * H_theta;
134 }
else if (
x_type[i] ==
"vec1") {
135 double x = parameters[i][0];
136 res(local_it, 0) = x -
x_lin(global_it, 0);
137 if (jacobians && jacobians[i]) {
138 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> J_vi(jacobians[i], num_residuals(), 1);
139 J_vi.block(0, 0, num_residuals(), 1) =
sqrtI.block(0, local_it, num_residuals(), 1);
143 }
else if (
x_type[i] ==
"vec3") {
144 Eigen::Matrix<double, 3, 1> p_i = Eigen::Map<const Eigen::Matrix<double, 3, 1>>(parameters[i]);
145 res.block(local_it, 0, 3, 1) = p_i -
x_lin.block(global_it, 0, 3, 1);
146 if (jacobians && jacobians[i]) {
147 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(jacobians[i], num_residuals(), 3);
148 jacobian.block(0, 0, num_residuals(), 3) =
sqrtI.block(0, local_it, num_residuals(), 3);
152 }
else if (
x_type[i] ==
"vec8") {
153 Eigen::Matrix<double, 8, 1> p_i = Eigen::Map<const Eigen::Matrix<double, 8, 1>>(parameters[i]);
154 res.block(local_it, 0, 8, 1) = p_i -
x_lin.block(global_it, 0, 8, 1);
155 if (jacobians && jacobians[i]) {
156 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(jacobians[i], num_residuals(), 8);
157 jacobian.block(0, 0, num_residuals(), 8) =
sqrtI.block(0, local_it, num_residuals(), 8);
162 std::cerr <<
"type - " <<
x_type[i] <<
" not implemented in prior" << std::endl;
163 std::exit(EXIT_FAILURE);
173 for (
int i = 0; i < res.rows(); i++) {
174 residuals[i] = res(i, 0);