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;