15 #ifndef TRAFFIC_SIMULATOR__API__API_HPP_
16 #define TRAFFIC_SIMULATOR__API__API_HPP_
18 #include <simulation_api_schema.pb.h>
20 #include <boost/variant.hpp>
24 #include <rclcpp/rclcpp.hpp>
25 #include <rosgraph_msgs/msg/clock.hpp>
28 #include <std_msgs/msg/float64.hpp>
44 #include <traffic_simulator_msgs/msg/behavior_parameter.hpp>
65 template <
typename NodeT,
typename AllocatorT = std::allocator<
void>,
typename... Ts>
67 : configuration(configuration),
69 rclcpp::node_interfaces::get_node_parameters_interface(
std::forward<NodeT>(node))),
71 std::make_shared<entity::EntityManager>(node, configuration, node_parameters_)),
75 traffic_controller_ptr_(
std::make_shared<traffic::TrafficController>(
77 configuration.auto_sink_entity_types)),
78 clock_pub_(rclcpp::create_publisher<rosgraph_msgs::msg::Clock>(
79 node,
"/clock", rclcpp::QoS(rclcpp::KeepLast(1)).best_effort(),
80 rclcpp::PublisherOptionsWithAllocator<AllocatorT>())),
81 debug_marker_pub_(rclcpp::create_publisher<visualization_msgs::msg::MarkerArray>(
82 node,
"debug_marker", rclcpp::QoS(100), rclcpp::PublisherOptionsWithAllocator<AllocatorT>())),
83 real_time_factor_subscriber(rclcpp::create_subscription<std_msgs::msg::Float64>(
84 node,
"/real_time_factor", rclcpp::QoS(rclcpp::KeepLast(1)).best_effort(),
85 [
this](
const std_msgs::msg::Float64 & message) {
90 if (message.data >= 0.001) {
91 clock_.realtime_factor = message.data;
92 simulation_api_schema::UpdateStepTimeRequest request;
93 request.set_simulation_step_time(clock_.getStepTime());
94 zeromq_client_.call(request);
97 clock_(node->get_parameter(
"use_sim_time").as_bool(), std::forward<decltype(
xs)>(
xs)...),
101 entity_manager_ptr_->setTrafficLights(traffic_lights_ptr_);
105 simulation_api_schema::InitializeRequest request;
112 if (not zeromq_client_.
call(request).result().success()) {
118 template <
typename ParameterT,
typename... Ts>
121 return getParameter<ParameterT>(node_parameters_, std::forward<Ts>(
xs)...);
124 template <
typename Node>
127 if (!node.has_parameter(
"port")) node.declare_parameter(
"port", 5555);
128 return node.get_parameter(
"port").as_int();
135 template <
typename Pose>
138 const traffic_simulator_msgs::msg::VehicleParameters & parameters,
142 auto register_to_entity_manager = [&]() {
144 return entity_manager_ptr_->isEntityExist(name) or
146 name, pose, parameters,
getCurrentTime(), configuration, node_parameters_);
153 auto register_to_environment_simulator = [&]() {
156 }
else if (!entity_manager_ptr_->isEntityExist(name)) {
158 "Entity ", name,
" can not be registered in simulator - it has not been spawned yet.");
160 simulation_api_schema::SpawnVehicleEntityRequest req;
162 req.mutable_parameters()->set_name(name);
163 req.set_asset_key(model3d);
165 entity_manager_ptr_->getEntity(name).getMapPose(), *req.mutable_pose());
168 req.set_initial_speed(0.0);
169 return zeromq_client_.
call(req).result().success();
173 return register_to_entity_manager() and register_to_environment_simulator();
176 template <
typename Pose>
179 const traffic_simulator_msgs::msg::PedestrianParameters & parameters,
183 auto register_to_entity_manager = [&]() {
188 auto register_to_environment_simulator = [&]() {
191 }
else if (!entity_manager_ptr_->isEntityExist(name)) {
193 "Entity ", name,
" can not be registered in simulator - it has not been spawned yet.");
195 simulation_api_schema::SpawnPedestrianEntityRequest req;
197 req.mutable_parameters()->set_name(name);
198 req.set_asset_key(model3d);
200 entity_manager_ptr_->getEntity(name).getMapPose(), *req.mutable_pose());
201 return zeromq_client_.
call(req).result().success();
205 return register_to_entity_manager() and register_to_environment_simulator();
208 template <
typename Pose>
211 const traffic_simulator_msgs::msg::MiscObjectParameters & parameters,
214 auto register_to_entity_manager = [&]() {
219 auto register_to_environment_simulator = [&]() {
222 }
else if (!entity_manager_ptr_->isEntityExist(name)) {
224 "Entity ", name,
" can not be registered in simulator - it has not been spawned yet.");
226 simulation_api_schema::SpawnMiscObjectEntityRequest req;
228 req.mutable_parameters()->set_name(name);
229 req.set_asset_key(model3d);
231 entity_manager_ptr_->getEntity(name).getMapPose(), *req.mutable_pose());
232 return zeromq_client_.
call(req).result().success();
236 return register_to_entity_manager() and register_to_environment_simulator();
246 const std::string & name,
const geometry_msgs::msg::PoseWithCovarianceStamped & new_pose,
250 const std::string &,
const simulation_api_schema::ImuSensorConfiguration & configuration)
254 const simulation_api_schema::PseudoTrafficLightDetectorConfiguration &);
258 const std::string &,
const double lidar_sensor_delay,
263 const std::string &,
double detection_sensor_range,
bool detect_all_objects_in_range,
264 double pos_noise_stddev,
int random_seed,
double probability_of_lost,
265 double object_recognition_delay);
294 const double radius,
const double rate,
const double speed,
297 const bool allow_spawn_outside_lane =
false,
const bool require_footprint_fitting =
false,
298 const bool random_orientation =
false, std::optional<int> random_seed = std::nullopt) -> void;
304 return traffic_lights_ptr_->getConventionalTrafficLights();
312 #define FORWARD_TO_ENTITY_MANAGER(NAME) \
318 template <typename... Ts> \
319 decltype(auto) NAME(Ts &&... xs) \
321 assert(entity_manager_ptr_); \
322 return (*entity_manager_ptr_).NAME(std::forward<decltype(xs)>(xs)...); \
324 static_assert(true, "")
337 #undef FORWARD_TO_ENTITY_MANAGER
340 bool updateTimeInSim();
342 bool updateEntitiesStatusInSim();
344 bool updateTrafficLightsInSim();
348 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters_;
350 const std::shared_ptr<entity::EntityManager> entity_manager_ptr_;
352 const std::shared_ptr<TrafficLights> traffic_lights_ptr_;
354 const std::shared_ptr<traffic::TrafficController> traffic_controller_ptr_;
356 const rclcpp::Publisher<rosgraph_msgs::msg::Clock>::SharedPtr clock_pub_;
358 const rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr debug_marker_pub_;
360 const rclcpp::Subscription<std_msgs::msg::Float64>::SharedPtr real_time_factor_subscriber;
#define FORWARD_TO_ENTITY_MANAGER(NAME)
Definition: api.hpp:312
auto spawn(const std::string &name, const Pose &pose, const traffic_simulator_msgs::msg::MiscObjectParameters ¶meters, const std::string &model3d="")
Definition: api.hpp:209
decltype(auto) getEntityPointer(Ts &&... xs)
Forward to arguments to the EntityManager:: getEntityPointer function.
Definition: api.hpp:325
auto getV2ITrafficLights()
Definition: api.hpp:300
decltype(auto) getHdmapUtils(Ts &&... xs)
Forward to arguments to the EntityManager:: getHdmapUtils function.
Definition: api.hpp:327
double getCurrentTime() const noexcept
Definition: api.hpp:271
decltype(auto) getFirstEgoName(Ts &&... xs)
Forward to arguments to the EntityManager:: getFirstEgoName function.
Definition: api.hpp:326
decltype(auto) resetBehaviorPlugin(Ts &&... xs)
Forward to arguments to the EntityManager:: resetBehaviorPlugin function.
Definition: api.hpp:330
decltype(auto) getEgoEntity(Ts &&... xs)
Forward to arguments to the EntityManager:: getEgoEntity function.
Definition: api.hpp:323
auto addTrafficSource(const double radius, const double rate, const double speed, const geometry_msgs::msg::Pose &position, const traffic::TrafficSource::Distribution &distribution, const bool allow_spawn_outside_lane=false, const bool require_footprint_fitting=false, const bool random_orientation=false, std::optional< int > random_seed=std::nullopt) -> void
Add a traffic source to the simulation.
Definition: api.cpp:290
API(NodeT &&node, const Configuration &configuration, Ts &&... xs)
Definition: api.hpp:66
auto getEntity(const std::string &name) -> entity::EntityBase &
Definition: api.cpp:116
void startNpcLogic()
Definition: api.cpp:280
auto getConventionalTrafficLights()
Definition: api.hpp:302
decltype(auto) isEntityExist(Ts &&... xs)
Forward to arguments to the EntityManager:: isEntityExist function.
Definition: api.hpp:328
int getZMQSocketPort(Node &node)
Definition: api.hpp:125
bool checkCollision(const std::string &first_entity_name, const std::string &second_entity_name)
Definition: api.cpp:100
bool attachOccupancyGridSensor(const simulation_api_schema::OccupancyGridSensorConfiguration &)
Definition: api.cpp:165
void setVerbose(const bool verbose)
Definition: api.cpp:32
auto getROS2Parameter(Ts &&... xs) const -> decltype(auto)
Definition: api.hpp:119
auto spawn(const std::string &name, const Pose &pose, const traffic_simulator_msgs::msg::VehicleParameters ¶meters, const std::string &behavior=VehicleBehavior::defaultBehavior(), const std::string &model3d="")
Definition: api.hpp:136
bool attachDetectionSensor(const simulation_api_schema::DetectionSensorConfiguration &)
Definition: api.cpp:142
decltype(auto) isNpcLogicStarted(Ts &&... xs)
Forward to arguments to the EntityManager:: isNpcLogicStarted function.
Definition: api.hpp:329
auto spawn(const std::string &name, const Pose &pose, const traffic_simulator_msgs::msg::PedestrianParameters ¶meters, const std::string &behavior=PedestrianBehavior::defaultBehavior(), const std::string &model3d="")
Definition: api.hpp:177
auto respawn(const std::string &name, const geometry_msgs::msg::PoseWithCovarianceStamped &new_pose, const geometry_msgs::msg::PoseStamped &goal_pose) -> void
Definition: api.cpp:55
void closeZMQConnection()
Definition: api.hpp:131
decltype(auto) getEntityNames(Ts &&... xs)
Forward to arguments to the EntityManager:: getEntityNames function.
Definition: api.hpp:324
bool attachPseudoTrafficLightDetector(const simulation_api_schema::PseudoTrafficLightDetectorConfiguration &)
Definition: api.cpp:134
bool despawnEntities()
Definition: api.cpp:48
bool despawn(const std::string &name)
Definition: api.cpp:34
bool attachLidarSensor(const simulation_api_schema::LidarConfiguration &)
Definition: api.cpp:177
auto attachImuSensor(const std::string &, const simulation_api_schema::ImuSensorConfiguration &configuration) -> bool
Definition: api.cpp:126
bool updateFrame()
Definition: api.cpp:253
Definition: simulation_clock.hpp:24
auto getCurrentRosTime() -> rclcpp::Time
Definition: simulation_clock.cpp:41
double realtime_factor
Definition: simulation_clock.hpp:49
auto getCurrentScenarioTime() const
Definition: simulation_clock.hpp:32
auto getCurrentSimulationTime() const
Definition: simulation_clock.hpp:37
auto getStepTime() const
Definition: simulation_clock.hpp:39
Definition: traffic_lights.hpp:132
Definition: ego_entity.hpp:35
Definition: entity_base.hpp:51
Definition: misc_object_entity.hpp:27
Definition: pedestrian_entity.hpp:34
Definition: vehicle_entity.hpp:37
std::vector< std::tuple< VehicleOrPedestrianParameter, std::string, std::string, double > > Distribution
Definition: traffic_source.hpp:69
Definition: zmq_multi_client.hpp:33
void closeConnection()
Definition: zmq_multi_client.cpp:33
auto call(const simulation_api_schema::SimulationRequest &) -> simulation_api_schema::SimulationResponse
Definition: zmq_multi_client.cpp:43
void toProto(const geometry_msgs::msg::Point &p, geometry_msgs::Point &proto)
Definition: conversions.cpp:22
const TransportProtocol protocol
Definition: constants.hpp:30
Definition: lanelet_wrapper.hpp:39
LidarType
Definition: helper.hpp:141
geometry_msgs::msg::Pose Pose
Definition: lanelet_map.hpp:30
geometry_msgs::msg::Pose Pose
Definition: lanelet_wrapper.hpp:65
geometry_msgs::msg::PoseStamped PoseStamped
Definition: lanelet_wrapper.hpp:66
Definition: junit5.hpp:25
std::string string
Definition: junit5.hpp:26
Although there were no syntactic errors in the description of the scenario, differences in meaning an...
Definition: exception.hpp:44
A problem occurred that interfered with the continuation of the simulation.
Definition: exception.hpp:47
Definition: configuration.hpp:31
auto lanelet2_map_path() const -> boost::filesystem::path
Definition: configuration.hpp:152
bool verbose
Definition: configuration.hpp:36
const bool standalone_mode
Definition: configuration.hpp:40
static auto autoware() noexcept -> const std::string &
Definition: api.hpp:51
Definition: pedestrian_entity.hpp:37
static auto defaultBehavior() noexcept -> const std::string &
Definition: pedestrian_entity.hpp:56
Definition: vehicle_entity.hpp:40
static auto defaultBehavior() -> const std::string &
Definition: vehicle_entity.hpp:59
class definition for the traffic controller