15#include <spdlog/sinks/stdout_color_sinks.h>
16#include <ad/rss/state/ProperResponse.hpp>
17#include <ad/rss/unstructured/Geometry.hpp>
18#include <ad/rss/world/Velocity.hpp>
24 std::string logger_name =
"RssRestrictor";
26 _logger = spdlog::get(logger_name);
28 _logger = spdlog::create<spdlog::sinks::stdout_color_sink_st>(logger_name);
37 if (log_level < spdlog::level::n_levels) {
40 const auto log_level_value =
static_cast<spdlog::level::level_enum
>(log_level);
43 _logger->set_level(log_level_value);
61 float mass = vehicle_physics.
mass;
62 float max_steer_angle_deg = 0.f;
63 float sum_max_brake_torque = 0.f;
65 for (
auto const &wheel : vehicle_physics.
wheels) {
66 sum_max_brake_torque += wheel.max_brake_torque;
67 radius = wheel.radius;
68 max_steer_angle_deg = std::max(max_steer_angle_deg, wheel.max_steer_angle);
76 _logger->debug(
"Lon {}, L {}, R {}; LatSpeed {}, Accel {}, Avg {}, Hdg {}, AllowedHeadingRanges {}",
77 proper_response.accelerationRestrictions.longitudinalRange,
78 proper_response.accelerationRestrictions.lateralLeftRange,
79 proper_response.accelerationRestrictions.lateralRightRange, ego_dynamics_on_route.
route_speed_lat,
81 ego_dynamics_on_route.
ego_heading, proper_response.headingRanges);
83 if (proper_response.accelerationRestrictions.lateralLeftRange.maximum <= ::ad::physics::Acceleration(0.0)) {
85 if (ego_dynamics_on_route.
route_speed_lat < ::ad::physics::Speed(0.0)) {
87 if (ego_dynamics_on_route.
route_speed_lon != ::ad::physics::Speed(0.0)) {
89 float desired_steer_ratio = -180.f *
static_cast<float>(angle_rad / M_PI) / max_steer_angle_deg;
92 desired_steer_ratio += 0.1f;
95 float orig_steer = restricted_vehicle_control.
steer;
96 restricted_vehicle_control.
steer = std::max(restricted_vehicle_control.
steer, desired_steer_ratio);
97 restricted_vehicle_control.
steer = std::min(restricted_vehicle_control.
steer, 1.0f);
99 _logger->debug(
"EgoVelocity: {}", ego_dynamics_on_route);
100 _logger->debug(
"Countersteer left to right: {} -> {}", orig_steer, restricted_vehicle_control.
steer);
105 if (proper_response.accelerationRestrictions.lateralRightRange.maximum <= ::ad::physics::Acceleration(0.0)) {
107 if (ego_dynamics_on_route.
route_speed_lat > ::ad::physics::Speed(0.0)) {
109 if (ego_dynamics_on_route.
route_speed_lon != ::ad::physics::Speed(0.0)) {
111 float desired_steer_ratio = -180.f *
static_cast<float>(angle_rad / M_PI) / max_steer_angle_deg;
114 desired_steer_ratio -= 0.1f;
117 float orig_steer = restricted_vehicle_control.
steer;
118 restricted_vehicle_control.
steer = std::min(restricted_vehicle_control.
steer, desired_steer_ratio);
119 restricted_vehicle_control.
steer = std::max(restricted_vehicle_control.
steer, -1.0f);
120 _logger->debug(
"EgoVelocity: {}", ego_dynamics_on_route);
121 _logger->debug(
"Countersteer right to left: {} -> {}", orig_steer, restricted_vehicle_control.
steer);
127 auto accel_lon = proper_response.accelerationRestrictions.longitudinalRange.maximum;
128 if (proper_response.unstructuredSceneResponse == ad::rss::state::UnstructuredSceneResponse::DriveAway) {
130 auto heading_allowed =
false;
131 if (!proper_response.headingRanges.empty()) {
133 auto max_steer_angle = max_steer_angle_deg * (ad::physics::cPI / ad::physics::Angle(180.0));
135 auto current_steering_angle =
static_cast<double>(ego_dynamics_on_route.
ego_heading) - vehicle_control.
steer * max_steer_angle;
137 for (
auto it = proper_response.headingRanges.cbegin(); (it != proper_response.headingRanges.cend() && !heading_allowed); ++it) {
138 heading_allowed = ad::rss::unstructured::isInsideHeadingRange(current_steering_angle, *it);
142 if (!heading_allowed) {
143 accel_lon = proper_response.accelerationRestrictions.longitudinalRange.minimum;
147 if (accel_lon > ::ad::physics::Acceleration(0.0)) {
152 if (accel_lon < ::ad::physics::Acceleration(0.0)) {
154 restricted_vehicle_control.
throttle = 0.0f;
156 double brake_acceleration =
157 std::fabs(
static_cast<double>(proper_response.accelerationRestrictions.longitudinalRange.minimum));
159 double sum_brake_torque = mass * brake_acceleration * radius / 100.0;
160 restricted_vehicle_control.
brake = std::min(
static_cast<float>(sum_brake_torque / sum_max_brake_torque), 1.0f);
164 if (restricted_vehicle_control != vehicle_control) {
166 "Restrictor active: throttle({} -> {}), brake ({} -> {}). steer ({} -> "
169 restricted_vehicle_control.
brake, vehicle_control.
steer, restricted_vehicle_control.
steer);
172 return restricted_vehicle_control;
for(int32 i=0;i< ResultPropJsonArray.Num();++i)
std::vector< WheelPhysicsControl > wheels