15 #ifndef TRAFFIC_SIMULATOR__TRAFFIC__TRAFFIC_SOURCE_HPP_
16 #define TRAFFIC_SIMULATOR__TRAFFIC__TRAFFIC_SOURCE_HPP_
19 #include <geometry_msgs/msg/pose.hpp>
22 #include <traffic_simulator_msgs/msg/pedestrian_parameters.hpp>
23 #include <traffic_simulator_msgs/msg/vehicle_parameters.hpp>
43 const lanelet::Ids
ids;
51 auto operator()(
const std::vector<geometry_msgs::msg::Point> &,
const lanelet::Id)
const
67 std::vector<std::tuple<VehicleOrPedestrianParameter, std::string, std::string, double>>;
69 template <
typename Pose,
typename Parameters>
74 template <
typename Spawner>
77 const Distribution & distribution,
const std::optional<int> seed,
const double current_time,
82 spawn_vehicle_in_lane_coordinate(spawn),
83 spawn_pedestrian_in_lane_coordinate(spawn),
84 spawn_vehicle_in_world_coordinate(spawn),
85 spawn_pedestrian_in_world_coordinate(spawn),
86 engine_(seed ? seed.value() :
std::random_device()()),
87 angle_distribution_(0.0, boost::
math::constants::two_pi<double>()),
88 radius_distribution_(0.0, radius),
89 params_distribution_([&]() {
90 auto weights = std::vector<double>();
91 weights.reserve(distribution.size());
92 for ([[maybe_unused]]
auto && [parameter, behavior, model3d, weight] : distribution) {
93 weights.push_back(weight);
95 return std::discrete_distribution<std::size_t>(weights.begin(), weights.end());
97 start_execution_time_(
99 (std::isnan(current_time) ? 0.0 : current_time) + std::max(configuration.start_delay, 0.0)),
100 configuration_(configuration),
101 distribution_(distribution),
102 validate(
pose, radius_distribution_.max(),
false),
103 validate_considering_crosswalk(
pose, radius_distribution_.max(),
true)
107 void execute(
const double current_time,
const double step_time)
override;
113 const std::size_t
id;
120 -> std::pair<bool, std::optional<CanonicalizedLaneletPose>>;
122 static inline std::size_t source_count_ = 0;
124 std::size_t entity_count_ = 0;
134 std::mt19937 engine_;
136 std::uniform_real_distribution<double> angle_distribution_;
138 std::uniform_real_distribution<double> radius_distribution_;
140 std::discrete_distribution<std::size_t> params_distribution_;
142 const double start_execution_time_;
149 const Validator validate, validate_considering_crosswalk;
Definition: traffic_module_base.hpp:36
Definition: traffic_source.hpp:31
void execute(const double current_time, const double step_time) override
Definition: traffic_source.cpp:98
std::function< void(const std::string &, const Pose &, const Parameters &, const std::string &, const std::string &)> Spawner
Definition: traffic_source.hpp:72
traffic_simulator_msgs::msg::PedestrianParameters PedestrianParameter
Definition: traffic_source.hpp:35
const double rate
Definition: traffic_source.hpp:109
std::vector< std::tuple< VehicleOrPedestrianParameter, std::string, std::string, double > > Distribution
Definition: traffic_source.hpp:67
traffic_simulator_msgs::msg::VehicleParameters VehicleParameter
Definition: traffic_source.hpp:33
std::variant< VehicleParameter, PedestrianParameter > VehicleOrPedestrianParameter
Definition: traffic_source.hpp:37
const geometry_msgs::msg::Pose pose
Definition: traffic_source.hpp:111
TrafficSource(const double radius, const double rate, const geometry_msgs::msg::Pose &pose, const Distribution &distribution, const std::optional< int > seed, const double current_time, const Configuration &configuration, const Spawner &spawn)
Definition: traffic_source.hpp:75
const std::size_t id
Definition: traffic_source.hpp:113
Definition: bounding_box.hpp:32
Definition: lanelet_wrapper.hpp:43
geometry_msgs::msg::Pose Pose
Definition: lanelet_map.hpp:30
geometry_msgs::msg::Pose Pose
Definition: lanelet_wrapper.hpp:70
std::string string
Definition: junit5.hpp:26
Definition: traffic_source.hpp:56
bool require_footprint_fitting
Definition: traffic_source.hpp:59
bool allow_spawn_outside_lane
Definition: traffic_source.hpp:57
double start_delay
Definition: traffic_source.hpp:63
bool use_random_orientation
Definition: traffic_source.hpp:61
Definition: traffic_source.hpp:40
auto operator()(const std::vector< geometry_msgs::msg::Point > &, const lanelet::Id) const -> bool
whether the 2D polygon does fit inside the lanelet with the given id
Definition: traffic_source.cpp:34
const lanelet::Ids ids
Definition: traffic_source.hpp:43
static constexpr std::size_t spawning_lanes_limit
Definition: traffic_source.hpp:41
Validator(const geometry_msgs::msg::Pose &, const double source_radius, const bool include_crosswalk)
Definition: traffic_source.cpp:28