17 #ifndef NDT_NODES__NDT_LOCALIZER_NODES_HPP_
18 #define NDT_NODES__NDT_LOCALIZER_NODES_HPP_
24 #include <sensor_msgs/msg/point_cloud2.hpp>
27 #include <rclcpp/rclcpp.hpp>
38 namespace localization
52 template<
typename OptimizerT = Optimizer_,
typename PoseInitializerT = PoseInitializer_>
55 sensor_msgs::msg::PointCloud2,
56 sensor_msgs::msg::PointCloud2,
58 ndt::P2DNDTLocalizer<OptimizerT>,
75 static constexpr
auto EPS = std::numeric_limits<ndt::Real>::epsilon();
82 const std::string & node_name,
83 const std::string & name_space,
84 const PoseInitializerT & pose_initializer)
85 :
ParentT(node_name, name_space, pose_initializer),
86 m_predict_translation_threshold{
87 this->declare_parameter(
"predict_pose_threshold.translation").template get<double>()},
88 m_predict_rotation_threshold{
89 this->declare_parameter(
"predict_pose_threshold.rotation").template get<double>()}
96 const std::string & node_name,
97 const rclcpp::NodeOptions & node_options,
98 const PoseInitializerT & pose_initializer)
99 :
ParentT(node_name, node_options, pose_initializer),
100 m_predict_translation_threshold{
101 this->declare_parameter(
"predict_pose_threshold.translation").template get<double>()},
102 m_predict_rotation_threshold{
103 this->declare_parameter(
"predict_pose_threshold.rotation").template get<double>()}
120 ret = on_non_convergence(summary, pose, guess);
127 ret = translation_valid(pose, guess);
131 ret = rotation_valid(pose, guess);
137 virtual bool on_non_convergence(
138 const RegistrationSummary &,
139 const PoseWithCovarianceStamped &,
const Transform &)
144 RCLCPP_DEBUG(this->get_logger(),
"Localizer optimizer failed to converge.");
152 virtual bool translation_valid(
const PoseWithCovarianceStamped & pose,
const Transform guess)
154 EigTranslation pose_translation{pose.pose.pose.position.x,
155 pose.pose.pose.position.y,
156 pose.pose.pose.position.z};
157 EigTranslation guess_translation{guess.transform.translation.x,
158 guess.transform.translation.y,
159 guess.transform.translation.z};
160 EigTranslation diff = pose_translation - guess_translation;
161 return diff.norm() <= (m_predict_translation_threshold + EPS);
168 virtual bool rotation_valid(
const PoseWithCovarianceStamped & pose,
const Transform guess)
170 EigRotation pose_rotation{pose.pose.pose.orientation.w,
171 pose.pose.pose.orientation.x,
172 pose.pose.pose.orientation.y,
173 pose.pose.pose.orientation.z
175 EigRotation guess_rotation{guess.transform.rotation.w,
176 guess.transform.rotation.x,
177 guess.transform.rotation.y,
178 guess.transform.rotation.z
180 return std::fabs(pose_rotation.angularDistance(guess_rotation)) <=
181 (m_predict_rotation_threshold + EPS);
187 ndt::P2DNDTLocalizerConfig localizer_config{
188 static_cast<uint32_t
>(this->declare_parameter(
"localizer.scan.capacity").
189 template get<uint32_t>()),
190 std::chrono::milliseconds(
191 static_cast<uint64_t
>(
192 this->declare_parameter(
"localizer.guess_time_tolerance_ms").
template get<uint64_t>()))
195 const auto outlier_ratio{this->declare_parameter(
196 "localizer.optimization.outlier_ratio").template get<float64_t>()};
198 common::optimization::OptimizationOptions optimizer_options{
199 static_cast<uint64_t
>(
200 this->declare_parameter(
"localizer.optimizer.max_iterations").template get<uint64_t>()),
201 this->declare_parameter(
"localizer.optimizer.score_tolerance").template get<float64_t>(),
202 this->declare_parameter(
203 "localizer.optimizer.parameter_tolerance").template get<float64_t>(),
204 this->declare_parameter(
"localizer.optimizer.gradient_tolerance").template get<float64_t>()
209 "localizer.optimizer.line_search.step_max").
210 template get<float64_t>())};
212 "localizer.optimizer.line_search.step_min").
213 template get<float64_t>())};
215 auto localizer_ptr = std::make_unique<Localizer>(
218 common::optimization::MoreThuenteLineSearch{
224 auto map_ptr = std::make_unique<ndt::StaticNDTMap>();
226 this->set_localizer(std::move(localizer_ptr));
227 this->set_map(std::move(map_ptr));
230 ndt::Real m_predict_translation_threshold;
237 #endif // NDT_NODES__NDT_LOCALIZER_NODES_HPP_