scenario_simulator_v2 C++ API
publisher.hpp
Go to the documentation of this file.
1 // Copyright 2015 TIER IV, Inc. All rights reserved.
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 #ifndef CONCEALER__PUBLISHER_HPP_
16 #define CONCEALER__PUBLISHER_HPP_
17 
18 #include <autoware_vehicle_msgs/msg/velocity_report.hpp>
19 #include <geometry_msgs/msg/pose_with_covariance_stamped.hpp>
20 #include <get_parameter/get_parameter.hpp>
21 #include <nav_msgs/msg/odometry.hpp>
22 #include <random>
23 #include <rclcpp/rclcpp.hpp>
24 #include <sensor_msgs/msg/imu.hpp>
25 
26 namespace concealer
27 {
28 template <typename>
29 struct Identity
30 {
31  explicit constexpr Identity(
32  const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &, const std::string &)
33  {
34  }
35 
36  template <typename T>
37  constexpr auto operator()(T && x) const -> decltype(auto)
38  {
39  return std::forward<decltype(x)>(x);
40  }
41 };
42 
43 template <typename ValueType>
45 {
46  static_assert(std::is_floating_point_v<std::decay_t<ValueType> >, "Unsupported error type");
47 
48  std::normal_distribution<ValueType> additive, multiplicative;
49 
51  const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & node,
52  const std::string & prefix)
53  // clang-format off
54  : additive(
55  static_cast<ValueType>(common::getParameter<double>(node, prefix + ".additive.mean")),
56  static_cast<ValueType>(common::getParameter<double>(node, prefix + ".additive.standard_deviation"))),
58  static_cast<ValueType>(common::getParameter<double>(node, prefix + ".multiplicative.mean")),
59  static_cast<ValueType>(common::getParameter<double>(node, prefix + ".multiplicative.standard_deviation")))
60  // clang-format on
61  {
62  }
63 
64  auto apply(std::mt19937_64 & engine, const ValueType value) -> ValueType
65  {
66  return value * (multiplicative(engine) + static_cast<ValueType>(1)) + additive(engine);
67  }
68 };
69 
70 template <typename>
72 
79 {
80  const std::random_device::result_type seed;
81 
82  std::mt19937_64 engine;
83 
84  explicit RandomNumberEngine(
85  const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & node,
86  const std::string & topic);
87 };
88 
89 template <>
90 struct NormalDistribution<nav_msgs::msg::Odometry> : public RandomNumberEngine
91 {
93 
94  // clang-format off
107  // clang-format on
108 
109  explicit NormalDistribution(
110  const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &, const std::string &);
111 
112  auto operator()(nav_msgs::msg::Odometry odometry) -> nav_msgs::msg::Odometry;
113 };
114 
115 template <>
116 struct NormalDistribution<autoware_vehicle_msgs::msg::VelocityReport> : public RandomNumberEngine
117 {
119 
120  // clang-format off
124  // clang-format on
125 
126  explicit NormalDistribution(
127  const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &, const std::string &);
128 
129  auto operator()(autoware_vehicle_msgs::msg::VelocityReport velocity_report)
130  -> autoware_vehicle_msgs::msg::VelocityReport;
131 };
132 
133 template <>
134 struct NormalDistribution<geometry_msgs::msg::PoseWithCovarianceStamped> : public RandomNumberEngine
135 {
136  // clang-format off
149  // clang-format on
150 
151  explicit NormalDistribution(
152  const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &, const std::string &);
153 
154  auto operator()(geometry_msgs::msg::PoseWithCovarianceStamped pose)
155  -> geometry_msgs::msg::PoseWithCovarianceStamped;
156 };
157 
158 template <>
159 struct NormalDistribution<sensor_msgs::msg::Imu> : public RandomNumberEngine
160 {
161  // clang-format off
180  // clang-format on
181 
183  bool active{true};
184 
185  explicit NormalDistribution(
186  const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &, const std::string &);
187 
188  auto operator()(sensor_msgs::msg::Imu imu) -> sensor_msgs::msg::Imu;
189 };
190 
191 template <typename Message, template <typename> typename Randomizer = Identity>
193 {
194  typename rclcpp::Publisher<Message>::SharedPtr publisher;
195 
196  Randomizer<Message> randomize;
197 
198 public:
199  template <typename Node>
200  explicit Publisher(const std::string & topic, Node & node)
201  : publisher(node.template create_publisher<Message>(topic, rclcpp::QoS(1).reliable())),
202  randomize(node.get_node_parameters_interface(), topic)
203  {
204  }
205 
206  template <typename... Ts>
207  auto operator()(Ts &&... xs) -> decltype(auto)
208  {
209  return publisher->publish(randomize(std::forward<decltype(xs)>(xs)...));
210  }
211 
212  auto getRandomizer() const noexcept -> const Randomizer<Message> & { return randomize; }
213  auto getRandomizer() noexcept -> Randomizer<Message> & { return randomize; }
214 };
215 } // namespace concealer
216 
217 #endif // CONCEALER__PUBLISHER_HPP_
Definition: publisher.hpp:193
auto operator()(Ts &&... xs) -> decltype(auto)
Definition: publisher.hpp:207
auto getRandomizer() const noexcept -> const Randomizer< Message > &
Definition: publisher.hpp:212
auto getRandomizer() noexcept -> Randomizer< Message > &
Definition: publisher.hpp:213
Publisher(const std::string &topic, Node &node)
Definition: publisher.hpp:200
Definition: concatenate.hpp:24
Definition: autoware_universe.hpp:40
Definition: junit5.hpp:25
std::string string
Definition: junit5.hpp:26
Definition: publisher.hpp:30
constexpr Identity(const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &, const std::string &)
Definition: publisher.hpp:31
constexpr auto operator()(T &&x) const -> decltype(auto)
Definition: publisher.hpp:37
Definition: publisher.hpp:45
std::normal_distribution< ValueType > multiplicative
Definition: publisher.hpp:48
auto apply(std::mt19937_64 &engine, const ValueType value) -> ValueType
Definition: publisher.hpp:64
NormalDistributionError(const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &node, const std::string &prefix)
Definition: publisher.hpp:50
std::normal_distribution< ValueType > additive
Definition: publisher.hpp:46
NormalDistributionError< float > heading_rate_error
Definition: publisher.hpp:123
NormalDistributionError< float > longitudinal_velocity_error
Definition: publisher.hpp:121
NormalDistributionError< float > lateral_velocity_error
Definition: publisher.hpp:122
NormalDistributionError< double > covariance_diagonal_roll_roll_error
Definition: publisher.hpp:146
NormalDistributionError< double > covariance_diagonal_x_x_error
Definition: publisher.hpp:143
NormalDistributionError< double > covariance_diagonal_z_z_error
Definition: publisher.hpp:145
NormalDistributionError< double > position_local_z_error
Definition: publisher.hpp:139
NormalDistributionError< double > covariance_diagonal_pitch_pitch_error
Definition: publisher.hpp:147
NormalDistributionError< double > covariance_diagonal_yaw_yaw_error
Definition: publisher.hpp:148
NormalDistributionError< double > orientation_p_error
Definition: publisher.hpp:141
NormalDistributionError< double > covariance_diagonal_y_y_error
Definition: publisher.hpp:144
NormalDistributionError< double > orientation_y_error
Definition: publisher.hpp:142
NormalDistributionError< double > position_local_x_error
Definition: publisher.hpp:137
NormalDistributionError< double > position_local_y_error
Definition: publisher.hpp:138
NormalDistributionError< double > orientation_r_error
Definition: publisher.hpp:140
NormalDistributionError< double > linear_x_error
Definition: publisher.hpp:101
NormalDistributionError< double > orientation_r_error
Definition: publisher.hpp:98
NormalDistributionError< double > angular_y_error
Definition: publisher.hpp:105
NormalDistributionError< double > linear_z_error
Definition: publisher.hpp:103
NormalDistributionError< double > position_local_z_error
Definition: publisher.hpp:97
NormalDistributionError< double > position_local_x_error
Definition: publisher.hpp:95
NormalDistributionError< double > orientation_y_error
Definition: publisher.hpp:100
NormalDistributionError< double > position_local_y_error
Definition: publisher.hpp:96
double speed_threshold
Definition: publisher.hpp:92
NormalDistributionError< double > linear_y_error
Definition: publisher.hpp:102
NormalDistributionError< double > angular_z_error
Definition: publisher.hpp:106
NormalDistributionError< double > orientation_p_error
Definition: publisher.hpp:99
NormalDistributionError< double > angular_x_error
Definition: publisher.hpp:104
NormalDistributionError< double > orientation_covariance_diagonal_yaw_yaw_error
Definition: publisher.hpp:173
NormalDistributionError< double > linear_acceleration_y_error
Definition: publisher.hpp:169
NormalDistributionError< double > angular_velocity_y_error
Definition: publisher.hpp:166
NormalDistributionError< double > linear_acceleration_x_error
Definition: publisher.hpp:168
NormalDistributionError< double > angular_velocity_z_error
Definition: publisher.hpp:167
NormalDistributionError< double > angular_velocity_covariance_diagonal_y_y_error
Definition: publisher.hpp:175
NormalDistributionError< double > angular_velocity_x_error
Definition: publisher.hpp:165
NormalDistributionError< double > angular_velocity_covariance_diagonal_z_z_error
Definition: publisher.hpp:176
NormalDistributionError< double > orientation_r_error
Definition: publisher.hpp:162
NormalDistributionError< double > linear_acceleration_covariance_diagonal_y_y_error
Definition: publisher.hpp:178
NormalDistributionError< double > angular_velocity_covariance_diagonal_x_x_error
Definition: publisher.hpp:174
NormalDistributionError< double > orientation_covariance_diagonal_pitch_pitch_error
Definition: publisher.hpp:172
NormalDistributionError< double > linear_acceleration_covariance_diagonal_x_x_error
Definition: publisher.hpp:177
NormalDistributionError< double > linear_acceleration_z_error
Definition: publisher.hpp:170
NormalDistributionError< double > orientation_p_error
Definition: publisher.hpp:163
NormalDistributionError< double > linear_acceleration_covariance_diagonal_z_z_error
Definition: publisher.hpp:179
NormalDistributionError< double > orientation_covariance_diagonal_roll_roll_error
Definition: publisher.hpp:171
NormalDistributionError< double > orientation_y_error
Definition: publisher.hpp:164
Definition: publisher.hpp:71
Provides common components for obtaining the seed and initializing the pseudo random number generator...
Definition: publisher.hpp:79
std::mt19937_64 engine
Definition: publisher.hpp:82
const std::random_device::result_type seed
Definition: publisher.hpp:80
RandomNumberEngine(const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &node, const std::string &topic)
Definition: publisher.cpp:26