Skip to content

Commit c751163

Browse files
Domsallnamdre
authored andcommitted
Add new calcAngleOffset() with known isChangingLanes()-bug
Signed-off-by: Dominik Salles <[email protected]>
1 parent e63aa96 commit c751163

File tree

4 files changed

+42
-30
lines changed

4 files changed

+42
-30
lines changed

src/microsim/MSLaneChangerSublane.cpp

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ MSLaneChangerSublane::abortLCManeuver(MSVehicle* vehicle) {
284284
vehicle->getLaneChangeModel().updateTargetLane();
285285
if (updatedSpeedLat) {
286286
// update angle after having reset lateral speed
287-
//vehicle->computeAngle();
287+
vehicle->setAngle(vehicle->computeAngle());
288288
}
289289
}
290290

@@ -478,24 +478,7 @@ MSLaneChangerSublane::startChangeSublane(MSVehicle* vehicle, ChangerIt& from, do
478478
// compute new angle of the vehicle from the x- and y-distances travelled within last time step
479479
// (should happen last because primaryLaneChanged() also triggers angle computation)
480480
// this part of the angle comes from the orientation of our current lane
481-
double laneAngle = vehicle->getLane()->getShape().rotationAtOffset(vehicle->getLane()->interpolateLanePosToGeometryPos(vehicle->getPositionOnLane())) ;
482-
if (vehicle->getLane()->getShape().length2D() == 0) {
483-
if (vehicle->getFurtherLanes().size() == 0) {
484-
laneAngle = vehicle->getAngle();
485-
} else {
486-
laneAngle = vehicle->getFurtherLanes().front()->getShape().rotationAtOffset(-NUMERICAL_EPS);
487-
}
488-
}
489-
// this part of the angle comes from the vehicle's lateral movement
490-
double changeAngle = 0;
491-
// avoid flicker
492-
if (fabs(latDist) > NUMERICAL_EPS) {
493-
// angle is between vehicle front and vehicle back (and depending on travelled distance)
494-
changeAngle = atan2(DIST2SPEED(latDist), vehicle->getVehicleType().getLength() + vehicle->getSpeed());
495-
if (MSGlobals::gLefthand) {
496-
changeAngle *= -1;
497-
}
498-
}
481+
double laneAngle = vehicle->computeAngle();
499482
if (vehicle->getLaneChangeModel().isOpposite()) {
500483
// reverse lane angle
501484
laneAngle += M_PI;
@@ -520,7 +503,7 @@ MSLaneChangerSublane::startChangeSublane(MSVehicle* vehicle, ChangerIt& from, do
520503
<< "\n";
521504
}
522505
#endif
523-
vehicle->setAngle(laneAngle + changeAngle, completedManeuver);
506+
vehicle->setAngle(laneAngle, completedManeuver);
524507

525508
// check if a traci maneuver must continue
526509
// getOwnState is reset to 0 when changing lanes so we use the stored reason

src/microsim/MSVehicle.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,9 +1440,9 @@ MSVehicle::computeAngle() const {
14401440
}
14411441
double result = (p1 != p2 ? p2.angleTo2D(p1) :
14421442
myLane->getShape().rotationAtOffset(myLane->interpolateLanePosToGeometryPos(getPositionOnLane())));
1443-
if (myLaneChangeModel->isChangingLanes()) {
1444-
result += lefthandSign * DEG2RAD(myLaneChangeModel->getAngleOffset());
1445-
}
1443+
1444+
result += lefthandSign * myLaneChangeModel->calcAngleOffset();
1445+
14461446
#ifdef DEBUG_FURTHER
14471447
if (DEBUG_COND) {
14481448
std::cout << SIMTIME << " computeAngle veh=" << getID() << " p1=" << p1 << " p2=" << p2 << " angle=" << RAD2DEG(result) << " naviDegree=" << GeomHelper::naviDegree(result) << "\n";
@@ -4295,6 +4295,7 @@ MSVehicle::executeMove() {
42954295
}
42964296
#endif
42974297
}
4298+
myLaneChangeModel->setPreviousAngleOffset(myLaneChangeModel->getAngleOffset());
42984299
myAngle = computeAngle();
42994300
}
43004301

src/microsim/lcmodels/MSAbstractLaneChangeModel.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ MSAbstractLaneChangeModel::MSAbstractLaneChangeModel(MSVehicle& v, const LaneCha
109109
myCanceledStateLeft(LCA_NONE),
110110
mySpeedLat(0),
111111
myAccelerationLat(0),
112+
myAngleOffset(0),
113+
myPreviousAngleOffset(0),
112114
myCommittedSpeed(0),
113115
myLaneChangeCompletion(1.0),
114116
myLaneChangeDirection(0),
@@ -734,13 +736,18 @@ MSAbstractLaneChangeModel::determineTargetLane(int& targetDir) const {
734736

735737

736738
double
737-
MSAbstractLaneChangeModel::getAngleOffset() const {
738-
const double totalDuration = (myVehicle.getVehicleType().wasSet(VTYPEPARS_MAXSPEED_LAT_SET)
739-
? SUMO_const_laneWidth / myVehicle.getVehicleType().getMaxSpeedLat()
740-
: STEPS2TIME(MSGlobals::gLaneChangeDuration));
739+
MSAbstractLaneChangeModel::calcAngleOffset() {
740+
double result = 0.;
741+
if (!(fabs(mySpeedLat) < NUMERICAL_EPS && fabs(myPreviousAngleOffset * 180 / PI) < NUMERICAL_EPS)) {
742+
if (myVehicle.getLength() < sqrt(SPEED2DIST(mySpeedLat) * SPEED2DIST(mySpeedLat) + SPEED2DIST(myVehicle.getSpeed()) * SPEED2DIST(myVehicle.getSpeed()))) {
743+
result = atan2(mySpeedLat, myVehicle.getSpeed());
744+
} else {
745+
result = myPreviousAngleOffset + asin((sin(PI / 2 - myPreviousAngleOffset) * (SPEED2DIST(mySpeedLat) - tan(myPreviousAngleOffset) * SPEED2DIST(myVehicle.getSpeed()))) / myVehicle.getLength());
746+
}
747+
}
741748

742-
const double angleOffset = 60 / totalDuration * (pastMidpoint() ? 1 - myLaneChangeCompletion : myLaneChangeCompletion);
743-
return myLaneChangeDirection * angleOffset;
749+
myAngleOffset = result;
750+
return result;
744751
}
745752

746753

src/microsim/lcmodels/MSAbstractLaneChangeModel.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,22 @@ class MSAbstractLaneChangeModel {
468468
int getShadowDirection() const;
469469

470470
/// @brief return the angle offset during a continuous change maneuver
471-
double getAngleOffset() const;
471+
double calcAngleOffset();
472+
473+
/// @brief return the angle offset resulting from lane change and sigma
474+
inline double getAngleOffset() const {
475+
return myAngleOffset;
476+
}
477+
478+
/// @brief set the angle offset resulting from lane change and sigma
479+
inline void setAngleOffset(const double angleOffset) {
480+
myAngleOffset = angleOffset;
481+
}
482+
483+
/// @brief set the angle offset of the previous time step
484+
inline void setPreviousAngleOffset(const double angleOffset) {
485+
myPreviousAngleOffset = angleOffset;
486+
}
472487

473488
/// @brief reset the flag whether a vehicle already moved to false
474489
inline bool alreadyChanged() const {
@@ -654,6 +669,12 @@ class MSAbstractLaneChangeModel {
654669
/// @brief the current lateral acceleration
655670
double myAccelerationLat;
656671

672+
/// @brief the current angle offset resulting from lane change and sigma
673+
double myAngleOffset;
674+
675+
/// @brief the angle offset of the previous time step resulting from lane change and sigma
676+
double myPreviousAngleOffset;
677+
657678
/// @brief the speed when committing to a change maneuver
658679
double myCommittedSpeed;
659680

0 commit comments

Comments
 (0)