23
23
#include " absl/memory/memory.h"
24
24
#include " cartographer/common/ceres_solver_options.h"
25
25
#include " cartographer/mapping/internal/3d/rotation_parameterization.h"
26
+ #include " cartographer/mapping/internal/3d/scan_matching/intensity_cost_function_3d.h"
26
27
#include " cartographer/mapping/internal/3d/scan_matching/occupied_space_cost_function_3d.h"
27
28
#include " cartographer/mapping/internal/3d/scan_matching/rotation_delta_cost_functor_3d.h"
28
29
#include " cartographer/mapping/internal/3d/scan_matching/translation_delta_cost_functor_3d.h"
@@ -48,6 +49,24 @@ proto::CeresScanMatcherOptions3D CreateCeresScanMatcherOptions3D(
48
49
options.add_occupied_space_weight (
49
50
parameter_dictionary->GetDouble (lua_identifier));
50
51
}
52
+ for (int i = 0 ;; ++i) {
53
+ const std::string lua_identifier =
54
+ " intensity_cost_function_options_" + std::to_string (i);
55
+ if (!parameter_dictionary->HasKey (lua_identifier)) {
56
+ break ;
57
+ }
58
+ const auto intensity_cost_function_options_dictionary =
59
+ parameter_dictionary->GetDictionary (lua_identifier);
60
+ auto * intensity_cost_function_options =
61
+ options.add_intensity_cost_function_options ();
62
+ intensity_cost_function_options->set_weight (
63
+ intensity_cost_function_options_dictionary->GetDouble (" weight" ));
64
+ intensity_cost_function_options->set_huber_scale (
65
+ intensity_cost_function_options_dictionary->GetDouble (" huber_scale" ));
66
+ intensity_cost_function_options->set_intensity_threshold (
67
+ intensity_cost_function_options_dictionary->GetDouble (
68
+ " intensity_threshold" ));
69
+ }
51
70
options.set_translation_weight (
52
71
parameter_dictionary->GetDouble (" translation_weight" ));
53
72
options.set_rotation_weight (
@@ -71,10 +90,10 @@ CeresScanMatcher3D::CeresScanMatcher3D(
71
90
void CeresScanMatcher3D::Match (
72
91
const Eigen::Vector3d& target_translation,
73
92
const transform::Rigid3d& initial_pose_estimate,
74
- const std::vector<PointCloudAndHybridGridPointers >&
93
+ const std::vector<PointCloudAndHybridGridsPointers >&
75
94
point_clouds_and_hybrid_grids,
76
95
transform::Rigid3d* const pose_estimate,
77
- ceres::Solver::Summary* const summary) {
96
+ ceres::Solver::Summary* const summary) const {
78
97
ceres::Problem problem;
79
98
optimization::CeresPose ceres_pose (
80
99
initial_pose_estimate, nullptr /* translation_parameterization */ ,
@@ -91,16 +110,35 @@ void CeresScanMatcher3D::Match(
91
110
for (size_t i = 0 ; i != point_clouds_and_hybrid_grids.size (); ++i) {
92
111
CHECK_GT (options_.occupied_space_weight (i), 0 .);
93
112
const sensor::PointCloud& point_cloud =
94
- *point_clouds_and_hybrid_grids[i].first ;
95
- const HybridGrid& hybrid_grid = *point_clouds_and_hybrid_grids[i].second ;
113
+ *point_clouds_and_hybrid_grids[i].point_cloud ;
114
+ const HybridGrid& hybrid_grid =
115
+ *point_clouds_and_hybrid_grids[i].hybrid_grid ;
96
116
problem.AddResidualBlock (
97
117
OccupiedSpaceCostFunction3D::CreateAutoDiffCostFunction (
98
118
options_.occupied_space_weight (i) /
99
119
std::sqrt (static_cast <double >(point_cloud.size ())),
100
120
point_cloud, hybrid_grid),
101
121
nullptr /* loss function */ , ceres_pose.translation (),
102
122
ceres_pose.rotation ());
123
+ if (point_clouds_and_hybrid_grids[i].intensity_hybrid_grid ) {
124
+ CHECK_GT (options_.intensity_cost_function_options (i).huber_scale (), 0 .);
125
+ CHECK_GT (options_.intensity_cost_function_options (i).weight (), 0 .);
126
+ CHECK_GT (
127
+ options_.intensity_cost_function_options (i).intensity_threshold (), 0 );
128
+ const IntensityHybridGrid& intensity_hybrid_grid =
129
+ *point_clouds_and_hybrid_grids[i].intensity_hybrid_grid ;
130
+ problem.AddResidualBlock (
131
+ IntensityCostFunction3D::CreateAutoDiffCostFunction (
132
+ options_.intensity_cost_function_options (i).weight () /
133
+ std::sqrt (static_cast <double >(point_cloud.size ())),
134
+ options_.intensity_cost_function_options (i).intensity_threshold (),
135
+ point_cloud, intensity_hybrid_grid),
136
+ new ceres::HuberLoss (
137
+ options_.intensity_cost_function_options (i).huber_scale ()),
138
+ ceres_pose.translation (), ceres_pose.rotation ());
139
+ }
103
140
}
141
+
104
142
CHECK_GT (options_.translation_weight (), 0 .);
105
143
problem.AddResidualBlock (
106
144
TranslationDeltaCostFunctor3D::CreateAutoDiffCostFunction (
0 commit comments