17 #ifndef NDT__NDT_LOCALIZER_HPP_ 18 #define NDT__NDT_LOCALIZER_HPP_ 22 #include <sensor_msgs/msg/point_cloud2.hpp> 23 #include <geometry_msgs/msg/transform.hpp> 24 #include <geometry_msgs/msg/pose_with_covariance_stamped.hpp> 29 #include <experimental/optional> 35 namespace localization
39 using CloudT = sensor_msgs::msg::PointCloud2;
48 typename NDTOptimizationProblemT,
49 typename OptimizationProblemConfigT,
69 const OptimizationProblemConfigT & optimization_problem_config,
70 const OptimizerT & optimizer,
73 m_optimization_problem_config{optimization_problem_config},
74 m_optimizer{optimizer},
75 m_scan{std::forward<ScanT>(scan)} {}
91 template<
typename MapT,
97 Summary *
const summary =
nullptr)
100 validate_msg(msg, map);
101 validate_guess(msg, transform_initial);
105 eig_pose_initial.setZero();
106 eig_pose_result.setZero();
115 NDTOptimizationProblemT problem(m_scan, map, m_optimization_problem_config);
116 const auto opt_summary = m_optimizer.solve(problem, eig_pose_initial, eig_pose_result);
119 throw std::runtime_error(
120 "NDT localizer has likely encountered a numerical " 121 "error during optimization.");
129 pose_out.header.stamp = msg.header.stamp;
130 pose_out.header.frame_id = map.frame_id();
133 set_covariance(problem, eig_pose_initial, eig_pose_result, pose_out);
134 if (summary !=
nullptr) {
142 const ScanT &
scan() const noexcept
159 return m_optimization_problem_config;
170 const NDTOptimizationProblemT & problem,
176 (void) initial_guess;
187 template<
typename MapT>
192 if (message_time < map.stamp()) {
193 throw std::logic_error(
194 "Lidar scan should not have a timestamp older than the timestamp of" 210 const auto stamp_tol = m_config.guess_time_tolerance();
213 std::chrono::duration_cast<std::decay_t<decltype(stamp_tol)>>(guess_scan_diff).
215 std::abs(stamp_tol.count()))
217 throw std::domain_error(
218 "Initial guess is not within: " + std::to_string(stamp_tol.count()) +
219 "ns range of the scan's time stamp. Either increase the tolerance range or" 220 "make sure the localizer takes in timely initial pose guesses.");
226 OptimizationProblemConfigT m_optimization_problem_config;
227 OptimizerT m_optimizer;
236 template<
typename OptimizerT,
typename MapT = StaticNDTMap>
238 P2DNDTScan, P2DNDTOptimizationProblem<MapT>, P2DNDTOptimizationConfig, OptimizerT>
241 using CloudT = sensor_msgs::msg::PointCloud2;
250 const OptimizerT & optimizer,
251 const Real outlier_ratio)
254 P2DNDTOptimizationConfig{outlier_ratio},
260 const P2DNDTOptimizationProblem<MapT> &,
273 #endif // NDT__NDT_LOCALIZER_HPP_ const ScanT & scan() const noexcept
Get the last used scan.
Definition: ndt_localizer.hpp:142
This constraint expresses the map interface requirements for the localizer.
Definition: ndt/include/ndt/constraints.hpp:36
geometry_msgs::msg::TransformStamped TransformStamped
Definition: motion_testing_publisher.hpp:37
Definition: ndt_scan.hpp:99
geometry_msgs::msg::PoseWithCovarianceStamped PoseWithCovarianceStamped
Definition: ndt_localizer.hpp:55
NDTLocalizerBase(const NDTLocalizerConfigBase &config, const OptimizationProblemConfigT &optimization_problem_config, const OptimizerT &optimizer, ScanT &&scan)
Definition: ndt_localizer.hpp:67
typename ParentT::Transform Transform
Definition: ndt_localizer.hpp:244
const NDTLocalizerConfigBase & config() const noexcept
Get the localizer configuration.
Definition: ndt_localizer.hpp:152
typename ParentT::PoseWithCovarianceStamped PoseWithCovarianceStamped
Definition: ndt_localizer.hpp:245
Eigen::Matrix< T, 6U, 1U > EigenPose
Definition: localization/ndt/include/ndt/utils.hpp:83
void set_covariance(const P2DNDTOptimizationProblem< MapT > &, const EigenPose< Real > &, const EigenPose< Real > &, PoseWithCovarianceStamped &) const override
Definition: ndt_localizer.hpp:259
Definition: optimization_problem.hpp:332
Config class for p2d optimziation problem.
Definition: ndt_config.hpp:54
const OptimizerT & optimizer() const noexcept
Get the optimizer.
Definition: ndt_localizer.hpp:147
Definition: optimized_registration_summary.hpp:32
Requires
Definition: ndt/include/ndt/constraints.hpp:29
float64_t Real
Definition: ndt_common.hpp:39
Definition: ndt_localizer.hpp:51
TIME_UTILS_PUBLIC std::chrono::system_clock::time_point from_message(builtin_interfaces::msg::Time t) noexcept
Convert from std::chrono::time_point from time message.
Definition: time_utils.cpp:80
config class for p2d ndt localizer
Definition: ndt_config.hpp:73
Definition: ndt_config.hpp:32
geometry_msgs::msg::TransformStamped Transform
Definition: ndt_localizer.hpp:54
sensor_msgs::msg::PointCloud2 CloudT
Definition: ndt_localizer.hpp:241
P2DNDTLocalizer(const P2DNDTLocalizerConfig &config, const OptimizerT &optimizer, const Real outlier_ratio)
Definition: ndt_localizer.hpp:248
virtual void set_covariance(const NDTOptimizationProblemT &problem, const EigenPose< Real > &initial_guess, const EigenPose< Real > &pose_result, PoseWithCovarianceStamped &solution) const
Definition: ndt_localizer.hpp:169
geometry_msgs::msg::TransformStamped Transform
Definition: recordreplay_planner_node.hpp:56
void validate_msg(const CloudT &msg, const MapT &map) const
Definition: ndt_localizer.hpp:188
uint32_t scan_capacity() const noexcept
Definition: ndt_config.hpp:89
sensor_msgs::msg::PointCloud2 CloudT
Definition: ndt_localizer.hpp:39
virtual void validate_guess(const CloudT &msg, const Transform &transform_initial) const
Definition: ndt_localizer.hpp:204
PoseWithCovarianceStamped register_measurement(const CloudT &msg, const Transform &transform_initial, const MapT &map, Summary *const summary=nullptr)
Definition: ndt_localizer.hpp:93
Definition: ndt_localizer.hpp:237
const OptimizationProblemConfigT & optimization_problem_config() const noexcept
Get the optimization problem configuration.
Definition: ndt_localizer.hpp:157
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24