Autoware.Auto
ndt_localizer_nodes.hpp
Go to the documentation of this file.
1 // Copyright 2020 the Autoware Foundation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // Co-developed by Tier IV, Inc. and Apex.AI, Inc.
16 
17 #ifndef NDT_NODES__NDT_LOCALIZER_NODES_HPP_
18 #define NDT_NODES__NDT_LOCALIZER_NODES_HPP_
19 
20 #include <common/types.hpp>
22 #include <ndt/ndt_localizer.hpp>
24 #include <sensor_msgs/msg/point_cloud2.hpp>
27 #include <rclcpp/rclcpp.hpp>
28 #include <utility>
29 #include <string>
30 #include <memory>
31 #include <limits>
32 
35 
36 namespace autoware
37 {
38 namespace localization
39 {
40 namespace ndt_nodes
41 {
42 // Alias common types.
43 
44 // TODO(yunus.caliskan) remove the hard-coded optimizer set up and make it fully configurable
45 using Optimizer_ =
48 
52 template<typename OptimizerT = Optimizer_, typename PoseInitializerT = PoseInitializer_>
53 class NDT_NODES_PUBLIC P2DNDTLocalizerNode
55  sensor_msgs::msg::PointCloud2,
56  sensor_msgs::msg::PointCloud2,
57  ndt::StaticNDTMap,
58  ndt::P2DNDTLocalizer<OptimizerT>,
59  PoseInitializerT>
60 {
61 public:
68  Localizer,
69  PoseInitializerT>;
71  using Transform = typename Localizer::Transform;
72 
73  using EigTranslation = Eigen::Vector3d;
74  using EigRotation = Eigen::Quaterniond;
75  static constexpr auto EPS = std::numeric_limits<ndt::Real>::epsilon();
76 
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>()}
90  {
91  init();
92  }
93 
94 
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>()}
104  {
105  init();
106  }
107 
108 protected:
110  const RegistrationSummary & summary,
111  const PoseWithCovarianceStamped & pose, const Transform & guess) override
112  {
113  bool ret = true;
114  switch (summary.optimization_summary().termination_type()) {
116  // Numerical failure, result is unusable.
117  ret = false;
118  break;
120  ret = on_non_convergence(summary, pose, guess);
121  break;
122  default:
123  break;
124  }
125  if (ret) {
126  // Check if translation is valid
127  ret = translation_valid(pose, guess);
128  }
129  if (ret) {
130  // Check if rotation is valid
131  ret = rotation_valid(pose, guess);
132  }
133  return ret;
134  }
135 
136 private:
137  virtual bool on_non_convergence(
138  const RegistrationSummary &,
139  const PoseWithCovarianceStamped &, const Transform &)
140  {
141  // In practice, it's hard to come up with a perfect termination criterion for ndt
142  // optimization and even non-convergence may be a decent effort in localizing the
143  // vehicle. Hence the result is not discarded on non-convergence.
144  RCLCPP_DEBUG(this->get_logger(), "Localizer optimizer failed to converge.");
145  return true;
146  }
147 
152  virtual bool translation_valid(const PoseWithCovarianceStamped & pose, const Transform guess)
153  {
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);
162  }
163 
168  virtual bool rotation_valid(const PoseWithCovarianceStamped & pose, const Transform guess)
169  {
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
174  };
175  EigRotation guess_rotation{guess.transform.rotation.w,
176  guess.transform.rotation.x,
177  guess.transform.rotation.y,
178  guess.transform.rotation.z
179  };
180  return std::fabs(pose_rotation.angularDistance(guess_rotation)) <=
181  (m_predict_rotation_threshold + EPS);
182  }
183 
184  void init()
185  {
186  // Fetch localizer configuration
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>()))
193  };
194 
195  const auto outlier_ratio{this->declare_parameter(
196  "localizer.optimization.outlier_ratio").template get<float64_t>()};
197 
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>()
205  };
206 
207  // Construct and set the localizer.
208  const float32_t step_max{static_cast<float32_t>(this->declare_parameter(
209  "localizer.optimizer.line_search.step_max").
210  template get<float64_t>())};
211  const float32_t step_min{static_cast<float32_t>(this->declare_parameter(
212  "localizer.optimizer.line_search.step_min").
213  template get<float64_t>())};
214  // TODO(igor): make the line search configurable.
215  auto localizer_ptr = std::make_unique<Localizer>(
216  localizer_config,
217  OptimizerT{
218  common::optimization::MoreThuenteLineSearch{
219  step_max, step_min,
221  optimizer_options
222  },
223  outlier_ratio);
224  auto map_ptr = std::make_unique<ndt::StaticNDTMap>();
225 
226  this->set_localizer(std::move(localizer_ptr));
227  this->set_map(std::move(map_ptr));
228  }
229 
230  ndt::Real m_predict_translation_threshold;
231  ndt::Real m_predict_rotation_threshold;
232 };
233 } // namespace ndt_nodes
234 } // namespace localization
235 } // namespace autoware
236 
237 #endif // NDT_NODES__NDT_LOCALIZER_NODES_HPP_
autoware::localization::ndt_nodes::P2DNDTLocalizerNode<>::EigTranslation
Eigen::Vector3d EigTranslation
Definition: ndt_localizer_nodes.hpp:73
types.hpp
This file includes common type definition.
autoware::localization::localization_common::OptimizedRegistrationSummary
Definition: optimized_registration_summary.hpp:32
autoware::localization::ndt::Real
float64_t Real
Definition: ndt_common.hpp:38
autoware::localization::ndt_nodes::Optimizer_
common::optimization::NewtonsMethodOptimizer< common::optimization::MoreThuenteLineSearch > Optimizer_
Definition: ndt_localizer_nodes.hpp:46
autoware::common::optimization::OptimizationSummary::termination_type
TerminationType termination_type() const noexcept
Get termination type.
Definition: optimizer_options.cpp:86
autoware::localization::localization_nodes::RelativeLocalizerNode
Definition: localization_node.hpp:72
autoware
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24
localization_node.hpp
autoware::localization::ndt::P2DNDTLocalizer
Definition: ndt_localizer.hpp:238
autoware::common::optimization::TerminationType::FAILURE
@ FAILURE
autoware::localization::ndt_nodes::P2DNDTLocalizerNode<>::Transform
typename Localizer::Transform Transform
Definition: ndt_localizer_nodes.hpp:71
autoware::localization::ndt_nodes::P2DNDTLocalizerNode::P2DNDTLocalizerNode
P2DNDTLocalizerNode(const std::string &node_name, const rclcpp::NodeOptions &node_options, const PoseInitializerT &pose_initializer)
Definition: ndt_localizer_nodes.hpp:95
motion::planning::recordreplay_planner_nodes::Transform
geometry_msgs::msg::TransformStamped Transform
Definition: recordreplay_planner_node.hpp:56
visibility_control.hpp
ndt_nodes
Definition: ndt_nodes.launch.py:1
autoware::localization::localization_common::OptimizedRegistrationSummary::optimization_summary
OptimizationSummary optimization_summary() const
Get optimization summary.
Definition: optimized_registration_summary.cpp:36
autoware::localization::ndt::P2DNDTLocalizer::PoseWithCovarianceStamped
typename ParentT::PoseWithCovarianceStamped PoseWithCovarianceStamped
Definition: ndt_localizer.hpp:246
autoware::common::types::float32_t
float float32_t
Definition: types.hpp:45
autoware::localization::ndt_nodes::P2DNDTLocalizerNode<>::EigRotation
Eigen::Quaterniond EigRotation
Definition: ndt_localizer_nodes.hpp:74
autoware::localization::ndt::StaticNDTMap
Definition: ndt_map.hpp:131
autoware::common::optimization::NewtonsMethodOptimizer
Optimizer using the Newton method with line search.
Definition: newtons_method_optimizer.hpp:37
autoware::localization::ndt_nodes::P2DNDTLocalizerNode::P2DNDTLocalizerNode
P2DNDTLocalizerNode(const std::string &node_name, const std::string &name_space, const PoseInitializerT &pose_initializer)
Definition: ndt_localizer_nodes.hpp:81
autoware::localization::localization_nodes::RelativeLocalizerNode< sensor_msgs::msg::PointCloud2, sensor_msgs::msg::PointCloud2, ndt::StaticNDTMap, ndt::P2DNDTLocalizer< Optimizer_ >, PoseInitializer_ >::PoseWithCovarianceStamped
geometry_msgs::msg::PoseWithCovarianceStamped PoseWithCovarianceStamped
Definition: localization_node.hpp:75
autoware::mapping::ndt_mapping_nodes::Localizer
localization::ndt::P2DNDTLocalizer< Optimizer, NDTMap > Localizer
Definition: ndt_mapping_nodes.hpp:49
autoware::localization::ndt_nodes::P2DNDTLocalizerNode::validate_output
bool validate_output(const RegistrationSummary &summary, const PoseWithCovarianceStamped &pose, const Transform &guess) override
Definition: ndt_localizer_nodes.hpp:109
autoware::common::optimization::MoreThuenteLineSearch::OptimizationDirection::kMaximization
@ kMaximization
ndt_localizer.hpp
autoware::common::types::float64_t
double float64_t
Definition: types.hpp:47
autoware::common::optimization::TerminationType::NO_CONVERGENCE
@ NO_CONVERGENCE
autoware::localization::ndt_nodes::P2DNDTLocalizerNode
Definition: ndt_localizer_nodes.hpp:53
more_thuente_line_search.hpp
autoware::perception::filters::filter_node_base::PointCloud2
sensor_msgs::msg::PointCloud2 PointCloud2
Definition: filter_node_base.cpp:32
autoware::localization::localization_common::BestEffortInitializer
Definition: initialization.hpp:107
newtons_method_optimizer.hpp