9 m_startDriving =
false;
12 m_state.drivingLane =
true;
13 m_state.indicatorLeft =
false;
14 m_state.indicatorRight =
false;
15 m_state.velocity = 0.f;
16 m_state.velocityOfWheelFeedback = 0.f;
17 m_state.timeLeftLaneBlocked = 0;
18 m_state.timeRightLaneBlocked = 0;
19 m_state.stopLineDistance = -1;
25 std::unique_lock<std::mutex> lock(m_mtx);
26 m_velocityReference = velocityReference;
27 m_state.velocity = m_velocityReference;
30 std::unique_lock<std::mutex> lock(m_mtx);
31 m_velocityAtParkingZone = velocityReference;
34 m_distanceAfterSwitchBackToLaneMeter = valueM;
37 m_criticalObstacleDistanceForLaneChangingCM = valueCM;
44 m_startDriving =
true;
48 void Decision::update(std::shared_ptr<PositionTimepoint> positionTimepoint, std::tuple<float, float, float, float> laneBlocked) {
49 std::unique_lock<std::mutex> lock(m_mtx);
52 newState.
timestamp = m_nodePtr->get_clock()->now().nanoseconds();
56 auto toNormalDrive = [&]() {
57 log_cout(
"[Decision] toNormalDrive");
60 newState.
velocity = m_velocityReference;
62 auto toObstacleEvasion = [&]() {
63 log_cout(
"[Decision] toObstacleEvasion");
65 newState.
velocity = m_velocityReference * 0.75f;
67 auto toIntersection = [&]() {
73 log_cout(
"[Decision] toIntersection");
75 newState.
velocity = m_velocityReference;
78 auto toParkingZone = [&]() {
85 log_cout(
"[Decision] toParkingZone");
89 auto toParking = [&]() {
95 bool cannotDriveOnLefLane = std::get<0>(laneBlocked) >= 0 && std::get<0>(laneBlocked) < m_criticalObstacleDistanceForLaneChangingCM;
96 bool cannotDriveOnRigLane = std::get<1>(laneBlocked) >= 0 && std::get<1>(laneBlocked) < m_criticalObstacleDistanceForLaneChangingCM;
98 this->update_lanes(newState, cannotDriveOnLefLane, cannotDriveOnRigLane);
110 if(cannotDriveOnRigLane) {
113 if(m_state.stopLineDistance >= 0 && m_state.stopLineDistance <= 1.f) {
116 if(m_state.startTargetDistance >= 0 && m_state.startTargetDistance <= 1.f) {
121 m_state.startTargetDistance = -1.f;
127 if(cannotDriveOnRigLane) {
128 newState.
velocity = m_velocityReference * 0.8f;
131 if(cannotDriveOnLefLane) {
132 if(std::get<0>(laneBlocked) < std::get<1>(laneBlocked)) {
145 this->switch_lane_if_possible(newState);
152 this->switch_lane_if_possible(newState);
160 log_cout(
"[Decision] Intersection\n - RightLaneObjectDistance: ", std::get<1>(laneBlocked),
"\n - IntersectionRightBeforeLeftDistance: ", std::get<2>(laneBlocked));
164 if((std::get<2>(laneBlocked) >= 0.f && std::get<2>(laneBlocked) <= 85.f)
165 || (std::get<0>(laneBlocked) >= 0 && std::get<0>(laneBlocked) <= 0.6f)
166 || (std::get<1>(laneBlocked) >= 0 && std::get<1>(laneBlocked) <= 0.6f)) {
169 else if (std::get<2>(laneBlocked) < 0.f && !cannotDriveOnRigLane && (std::get<3>(laneBlocked) < 0.f || std::get<3>(laneBlocked) > 0.5f)) {
170 if(newState.
timestamp - m_state.timeInSituationState > 3e9) {
184 newState.
velocity = m_velocityAtParkingZone;
187 newState.
velocity = get_velocity_reference();
190 if(m_stopAtStartLine && (newState.
timestamp - m_state.timeInSituationState) < 1e9) {
198 if(newState.
timestamp - m_state.timeInSituationState > 4e9) {
200 log_cout(
"[Decision] Parking: Searching TIMEOUT");
214 if(newState.
timestamp - m_state.timeInSituationState > 8e9) {
216 log_cout(
"[Decision] Parking: Parking TIMEOUT");
224 this->set_indicators(newState);
235 std::unique_lock<std::mutex> lock(m_mtx);
236 m_state.stopLineDistance = value;
240 std::unique_lock<std::mutex> lock(m_mtx);
241 m_state.startTargetDistance = value;
245 std::unique_lock<std::mutex> lock(m_mtx);
253 m_state.parkingState = state;
256 m_state.parkingState = state;
260 log_warning(
"[Decision] Can NOT set this parking state: ", state);
265 std::unique_lock<std::mutex> lock(m_mtx);
266 m_state.tofRightValue = right;
267 m_state.tofRearValue = rear;
276 if(m_state.drivingLane ==
false && newState.
drivingLane ==
true) {
282 if(m_state.drivingLane ==
true && newState.
drivingLane ==
false) {
291 if(m_state.indicatorLeft ==
true || m_state.indicatorRight ==
true) {
307 if(((newState.
timestamp - m_state.timeLeftLaneBlocked) / 1000000000.f) * (m_state.velocityOfWheelFeedback / 1000.f) < m_distanceAfterSwitchBackToLaneMeter) {
317 if(((newState.
timestamp - m_state.timeRightLaneBlocked) / 1000000000.f) * (m_state.velocityOfWheelFeedback / 1000.f) < m_distanceAfterSwitchBackToLaneMeter) {
325 return m_state.indicatorLeft;
328 return m_state.indicatorRight;
331 return m_state.drivingLane;
334 return m_state.velocity;
337 return m_state.velocity == 0.f;
340 std::unique_lock<std::mutex> lock(m_mtx);
341 return m_state.situationState;