| 26 | |
| 27 | |
| 28 | class Vehicle: |
| 29 | def __init__(self, id: str) -> None: |
| 30 | self.id = id |
| 31 | # store the last 10[s] x position for scenario rebuild |
| 32 | # x, y: position(two doubles) of the named vehicle (center) within the last step |
| 33 | self.xQ = deque(maxlen=100) |
| 34 | self.yQ = deque(maxlen=100) |
| 35 | self.yawQ = deque(maxlen=100) |
| 36 | self.speedQ = deque(maxlen=100) |
| 37 | self.accelQ = deque(maxlen=100) |
| 38 | self.laneIDQ = deque(maxlen=100) |
| 39 | # lanePos: The position of the vehicle along the lane (the distance |
| 40 | # from the center of the car to the start of the lane in [m]) |
| 41 | self.lanePosQ = deque(maxlen=100) |
| 42 | self.routeIdxQ = deque(maxlen=100) |
| 43 | self.routes: list[str] = None |
| 44 | self.LLRSet: set[str] = None |
| 45 | self.LLRDict: dict[str, dict[str, set[str]]] = None |
| 46 | self.LCRDict: dict[str, str] = None |
| 47 | self.length: float = 5.0 # SUMO default value |
| 48 | self.width: float = 1.8 # SUMO default value |
| 49 | self.maxAccel: float = 3.0 # SUMO default value |
| 50 | self.maxDecel: float = 4.5 # SUMO default value |
| 51 | self.maxSpeed: float = 13.89 |
| 52 | self.vTypeID: str = None |
| 53 | self._iscontroled: bool = 0 |
| 54 | # the follow three parameters are used to obtain available lanes |
| 55 | self.lookForward: float = 100 |
| 56 | self.noChange: float = 5.0 |
| 57 | self.plannedTrajectory: Trajectory = None |
| 58 | self.dbTrajectory: Trajectory = None |
| 59 | self.end_lane: str = None |
| 60 | |
| 61 | # LLR: lane-level route |
| 62 | def getLaneLevelRoute(self, nb: NetworkBuild) -> tuple[set, dict]: |
| 63 | LLRSet: set[str] = set() |
| 64 | LLRDict: dict[str, dict[str, set[str]]] = {} |
| 65 | for i in range(len(self.routes)-1): |
| 66 | eid = self.routes[i] |
| 67 | LLRDict[eid] = {} |
| 68 | edgeIns = nb.getEdge(eid) |
| 69 | LLRSet = LLRSet | edgeIns.lanes |
| 70 | LLRDict[eid]['edgeLanes'] = edgeIns.lanes |
| 71 | nextEid = self.routes[i+1] |
| 72 | changeLanes = edgeIns.next_edge_info[nextEid] |
| 73 | LLRDict[eid]['changeLanes'] = changeLanes |
| 74 | nextEdge = nb.getEdge(nextEid) |
| 75 | changeJuncLanes = set() |
| 76 | for targetLane in nextEdge.lanes: |
| 77 | for cl in changeLanes: |
| 78 | clIns = nb.getLane(cl) |
| 79 | try: |
| 80 | changeJuncLanes.add(clIns.next_lanes[targetLane][0]) |
| 81 | except KeyError: |
| 82 | pass |
| 83 | |
| 84 | LLRSet = LLRSet | changeJuncLanes |
| 85 | LLRDict[eid]['junctionLanes'] = changeJuncLanes |