diff --git a/README.md b/README.md index a2abc00c1289a219221db0d132600bf1578a55c6..c3fa628f0db9381cd7686b351373fd87919d3859 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # ASN.1 module for VAM - ETSI TS 103 300-3 -This repository contains VRU Awareness Basic Service ETSI TS 103 300-3 – Specification of the VRU Awareness Message format. +This repository contains VRU Awareness Basic Service ETSI TS 103 300-3 Specification of the VRU Awareness Message format. +The text of the TS 103 300-1 V2.1.1 can be found using the link https://www.etsi.org/deliver/etsi_ts/103300_103399/10330003/02.01.01_60/ts_10330003v020101p.pdf. ## License @@ -13,3 +14,5 @@ To compile the VAM, the following dependencies are required: - **[CAM-PDU-Descriptions](https://forge.etsi.org/rep/ITS/asn1/cam_ts302637_2)** module from [ETSI EN 302 637-2 v1.4.1](https://www.etsi.org/deliver/etsi_en/302600_302699/30263702/01.04.01_60/en_30263702v010401p.pdf) - Cooperative Awareness Service - **[ITS-Container](https://forge.etsi.org/rep/ITS/asn1/cdd_ts102894_2)** module from [ETSI TS 102 894-2 v1.3.1](https://www.etsi.org/deliver/etsi_ts/102800_102899/10289402/01.03.01_60/ts_10289402v010301p.pdf) - Common Data Dictionary +- **[DSRC, AddGrpC](https://standards.iso.org/iso/ts/19091/)** modules from [ISO TS 19091](https://www.iso.org/standard/69897.html) - for intersection and lane identifiers +- **[ElectronicRegistrationIdentificationVehicleDataModule](https://standards.iso.org/iso/24534/-4/)** module from [ISO TS 24534-3](https://www.iso.org/standard/59306.html) diff --git a/VAM-PDU-Descriptions.asn b/VAM-PDU-Descriptions.asn index 614a49e3ea008c11d465c982e0b7aaa1f8fc95fe..bfb70ec07756302f3cd5f36b80bfc4e0c8c9f41f 100755 --- a/VAM-PDU-Descriptions.asn +++ b/VAM-PDU-Descriptions.asn @@ -1,102 +1,353 @@ +-- ETSI TS 103 300-3 V0.5.0 (2020-09) + VAM-PDU-Descriptions {itu-t(0) identified-organization(4) etsi(0) itsDomain(5) - wg1(1) ts(103300) vam(3) version(1)} + wg1(1) ts(103300) vam(1) version1(1)} DEFINITIONS AUTOMATIC TAGS ::= BEGIN IMPORTS - ItsPduHeader, ReferencePosition, AccelerationControl, - Heading, HeadingValue, Speed, StationID, VehicleLength, VehicleWidth, - PathHistory, ProtectedCommunicationZone, PtActivation, - Latitude, Longitude, ProtectedCommunicationZonesRSU - FROM ITS-Container {itu-t(0) identified-organization(4) etsi(0) - itsDomain(5) wg1(1) ts(102894) cdd(2) version(2)} + Curvature, CurvatureCalculationMode, ExteriorLights, Heading, + LanePosition, LateralAcceleration, LongitudinalAcceleration, + PathDeltaTime, PathHistory, ReferencePosition, Speed, + StationID, VerticalAcceleration, YawRate + FROM ITS-Container {itu-t(0) identified-organization(4) etsi(0) + itsDomain(5) wg1(1) ts(102894) cdd(2) version(2)} GenerationDeltaTime FROM CAM-PDU-Descriptions {itu-t(0) identified-organization(4) etsi(0) itsDomain(5) wg1(1) en(302637) cam(2) version(2)} + + -- Note: sVAM-Temp-Imports defines types that are intended to be updated within + -- or added to the Common Data Dictionary. Once the CDD has been updated, + -- VAM-Temp-Imports will also be updated to import the new types directly + -- from the CDD. The use of WITH SUCCESSORS ensures that the import + -- statement below will not have to change. + + AreaCircular, AreaPolygon, AreaRectangle, BasicContainer, ItsPduHeader + FROM VAM-Temp-Imports {itu-t(0) identified-organization(4) etsi(0) + itsDomain(5) wg1(1) ts(103300) temp-imports(255) version1(1)} + WITH SUCCESSORS + + IntersectionReferenceID, LaneID + FROM DSRC {iso (1) standard (0) signalizedIntersection (19091) profilec(2) + dsrc (2) version (2)} + ; + VAM ::= SEQUENCE { header ItsPduHeaderVam, vam VruAwareness } - -- contains StationId - -- StationId should change when certificate changes, or when VRU - -- enters or leaves a cluster (as leader or otherwise) ItsPduHeaderVam ::= ItsPduHeader(WITH COMPONENTS { ..., messageID(vam) }) - + VruAwareness ::= SEQUENCE { - generationDeltaTime GenerationDeltaTime, - vamParameters VamParameters, - vamExtensions SEQUENCE (SIZE(0..MAX)) OF VamExtension + generationDeltaTime GenerationDeltaTime, -- from CAM-PDU-Descriptions + vamParameters VamParameters } VamParameters ::= SEQUENCE { - activeProfile VruProfileId, - physicalProperties VruPhysicalProperties, - dyanmicProperties VruDynamicProperties, + basicContainer BasicContainer, -- from VAM-Temp-Imports + vruHighFrequencyContainer VruHighFrequencyContainer OPTIONAL, + vruLowFrequencyContainer VruLowFrequencyContainer OPTIONAL, + vruClusterInformationContainer VruClusterInformationContainer OPTIONAL, + vruClusterOperationContainer VruClusterOperationContainer OPTIONAL, + vruMotionPredictionContainer VruMotionPredictionContainer OPTIONAL, ... } + + + VruProfile ::= ENUMERATED { + unavailable(0), pedestrian(1), cyclist(2), motorcyclist(3), animal(4), + max(15) + } + + VruHighFrequencyContainer ::= SEQUENCE { + heading Heading, -- from ITS-Container + speed Speed, -- from ITS-Container + longitudinalAcceleration LongitudinalAcceleration, -- from ITS-Container + curvature Curvature OPTIONAL, -- from ITS-Container + curvatureCalculationMode CurvatureCalculationMode OPTIONAL, -- from ITS-Container + yawRate YawRate OPTIONAL, -- from ITS-Container + lateralAcceleration LateralAcceleration OPTIONAL, -- from ITS-Container + verticalAcceleration VerticalAcceleration OPTIONAL, -- from ITS-Container + vruLanePosition VruLanePosition OPTIONAL, + environment VruEnvironment OPTIONAL, + movementControl VruMovementControl OPTIONAL, + orientation VruOrientation OPTIONAL, + rollAngle VruRollAngle OPTIONAL, + deviceUsage VruDeviceUsage OPTIONAL, + ... + } + + VruLanePosition ::= CHOICE { + offRoadLanePosition OffRoadLanePosition, + vehicularLanePosition LanePosition, -- from ITS-Container + trafficIslandPosition TrafficIslandPosition, + mapPosition MapPosition, + ... + } + + OffRoadLanePosition ::= ENUMERATED { + unavailable(0), sidewalk(1), parkingLane(2), bikeLane(3), + max(15) + } + + TrafficIslandPosition ::= SEQUENCE { + oneSide NonIslandLanePosition, + otherSide NonIslandLanePosition, + ... + } + + NonIslandLanePosition ::= CHOICE { + offRoadLanePosition OffRoadLanePosition, + vehicularLanePosition LanePosition, -- from ITS-Container + mapPosition MapPosition, + ... + } + + MapPosition ::= SEQUENCE { + intersectionId IntersectionReferenceID, + lane LaneID + } + + VruEnvironment ::= ENUMERATED { + unavailable (0), intersectionCrossing(1), zebraCrossing(2), sidewalk (3), + onVehicleRoad(4), protectedGeographicArea(5), max (255) + -- values 6-254 reserved for later use + } + + VruMovementControl ::= ENUMERATED { + unavailable (0), braking(1), hardBraking(2), stopPedaling (3), + brakingAndStopPedaling(4), hardBrakingAndStopPedaling (5), + noReaction(6), max (255) + -- values 7-254 reserved for later use + } + + VruOrientation ::= Heading -- from ITS-Container + + VruRollAngle ::= Heading -- from ITS-Container + + VruDeviceUsage ::= ENUMERATED { + unavailable(0), other(1), idle(2), listeningToAudio(3), typing(4), + calling(5), playingGames(6), reading(7), viewing(8), max(255) + -- values 9-254 reserved for later use + } + + VruLowFrequencyContainer ::= SEQUENCE { + profileAndSubprofile VruProfileAndSubprofile OPTIONAL, + exteriorLights VruExteriorLights OPTIONAL, + sizeClass VruSizeClass OPTIONAL, + ... + } + + VruProfileAndSubprofile ::= CHOICE { + pedestrian VruSubProfilePedestrian, + bicyclist VruSubProfileBicyclist, + motorcylist VruSubProfileMotorcyclist, + animal VruSubProfileAnimal, + ... + } + + VruSubProfilePedestrian ::= ENUMERATED { + unavailable(0), ordinary-pedestrian(1), + road-worker(2), first-responder(3), + max(15) + } + + VruSubProfileBicyclist ::= ENUMERATED { + unavailable(0), bicyclist(1), wheelchair-user(2), horse-and-rider(3), + rollerskater(4), e-scooter(5), personal-transporter(6), + pedelec(7), speed-pedelec(8), + max(15) + } - VruProfileId ::= ENUMERATED { - pedestrian(1), lowSpeedTwoWheel(2), fullSpeedTwoWheel(3), animal(4), ... + VruSubProfileMotorcyclist ::= ENUMERATED { + unavailable(0), moped(1), motorcycle(2), motorcycle-and-sidecar-right(3), + motorcycle-and-sidecar-left(4), max(15) } - VruPhysicalProperties ::= CHOICE { - singleVruPhysInfo SingleVruPhysicalInfo, - clusterPhysInfo VruClusterPhysicalInfo, + VruSubProfileAnimal ::= ENUMERATED { + unavailable(0), wild-animal(1), farm-animal(2), service-animal(3), max(15) + } + + VruExteriorLights ::= SEQUENCE { + vruSpecific VruSpecificExteriorLights, -- defined below + vehicular ExteriorLights + } + + VruSpecificExteriorLights ::= BIT STRING { + unavailable (0), + backFlashLight (1), + helmetLight (2), + armLight (3), + legLight (4), + wheelLight (5) + } (SIZE(8)) + + VruSizeClass ::= ENUMERATED { + unavailable (0), low(1), medium(2), high (3), max(15) + -- values 4-14 reserved for later use + } + + VruClusterInformationContainer ::= SEQUENCE { + clusterId ClusterId, + clusterBoundingBoxShape ClusterBoundingBoxShape, + clusterCardinalitySize ClusterCardinalitySize, -- 0 means unknown + clusterProfiles ClusterProfiles, ... } - SingleVruPhysicalInfo ::= SEQUENCE { - referencePoint ReferencePosition, - orientation Heading, - clusterJoinInfo ClusterJoinInfo OPTIONAL, - clusterExitInfo StationID OPTIONAL, + ClusterId ::= INTEGER(0..255) + + ClusterBoundingBoxShape::= CHOICE { + clusterRectangle AreaRectangle, -- from VAM-Temp-Imports + clusterCircle AreaCircular, -- from VAM-Temp-Imports + clusterPolygon AreaPolygon, -- from VAM-Temp-Imports ... } + ClusterCardinalitySize ::= INTEGER {unavailable(0), onlyLeader(1)} (0..255) + + ClusterProfiles ::= BIT STRING { + pedestrian(0), + bicyclist(1), + motorcyclist(2), + animal(3) + } (SIZE(4)) + + -- this is OPTIONAL elements rather than a CHOICE because a + -- VRU ITS-S could be leaving one cluster and joining another. + VruClusterOperationContainer ::= SEQUENCE { + clusterJoinInfo ClusterJoinInfo OPTIONAL, + clusterLeaveInfo ClusterLeaveInfo OPTIONAL, + clusterBreakupInfo ClusterBreakupInfo OPTIONAL, + clusterIdChangeTimeInfo VruClusterOpTimestamp OPTIONAL, + ... + } + + VruClusterOpTimestamp ::= INTEGER (1..255) + ClusterJoinInfo ::= SEQUENCE { - clusterId StationID, - countdown INTEGER(0..7), + clusterId ClusterId, + joinTime VruClusterOpTimestamp, + ... + } + + ClusterLeaveInfo ::= SEQUENCE { + clusterId ClusterId, + clusterLeaveReason ClusterLeaveReason, ... } - VruClusterPhysicalInfo ::= SEQUENCE { - referencePoint ReferencePosition, -- middle of front edge of cluster - heading HeadingValue, -- direction of perp. line through referencePoint - width VruClusterSideLength, -- width (with referencePoint in the - -- middle) in units of 10 cm - length VruClusterSideLength, -- length (from referencePoint to rear of - -- cluster) in units of 10 cm - number INTEGER(0..255), -- 0 means unknown + ClusterBreakupInfo ::= SEQUENCE { + clusterBreakupReason ClusterBreakupReason, + breakupTime VruClusterOpTimestamp, ... } - VruClusterSideLength ::= INTEGER {tenCentimeters(1), outOfRange(61), unavailable(62)} (1..62) + ClusterLeaveReason ::= ENUMERATED { + notProvided (0), + clusterLeaderLost (1), + clusterDisbandedByLeader (2), + outOfClusterBoundingBox (3), + outOfClusterSpeedRange (4), + joiningAnotherCluster (5), + cancelledJoin (6), + failedJoin (7), + safetyCondition (8), + max(15) + } - -- none of these fields are OPTIONAL as each of the types below has an "unknown" value, which - -- should be used if the value isn't provided. - VruDynamicProperties ::= SEQUENCE { - heading Heading, - speed Speed, - longitudinalAcceleration LongitudinalAcceleration, - laterialAcceleration LateralAcceleration, - verticalAcceleration VerticalAcceleration, - yawRate YawRate, - pastLocations PathHistory, - predictedLocations PathHistory, + ClusterBreakupReason ::= ENUMERATED { + notProvided (0), + clusteringPurposeCompleted (1), + leaderMovedOutOfClusterBoundingBox (2), + joiningAnotherCluster (3), + enteringLowRiskAreaBasedOnMaps (4), + receptionOfCpmContainingCluster (5), + max(15) + } + + VruMotionPredictionContainer ::= SEQUENCE { + pathHistory PathHistory OPTIONAL, + pathPrediction SequenceOfVruPathPoint OPTIONAL, + safeDistance SequenceOfVruSafeDistanceIndication OPTIONAL, + trajectoryInterceptionIndication SequenceOfTrajectoryInterceptionIndication OPTIONAL, + accelerationChangeIndication AccelerationChangeIndication OPTIONAL, + headingChangeIndication HeadingChangeIndication OPTIONAL, + stabilityChangeIndication StabilityChangeIndication OPTIONAL, ... } - VamExtension ::= CHOICE { - dummy NULL, + SequenceOfVruPathPoint ::= SEQUENCE OF VruPathPoint + + VruPathPoint ::= SEQUENCE { + pathPosition ReferencePosition, + pathDeltaTime PathDeltaTime OPTIONAL + } + + + SequenceOfVruSafeDistanceIndication ::= + SEQUENCE(SIZE(1..8)) OF VruSafeDistanceIndication + + VruSafeDistanceIndication ::= SEQUENCE { + subjectStation StationID OPTIONAL, + stationSafeDistanceIndication StationSafeDistanceIndication, + timeToCollision ActionDeltaTime OPTIONAL, + ... + } + + StationSafeDistanceIndication ::= BOOLEAN + + SequenceOfTrajectoryInterceptionIndication ::= + SEQUENCE (SIZE(1..8)) OF TrajectoryInterceptionIndication + + TrajectoryInterceptionIndication ::= SEQUENCE { + subjectStation StationID OPTIONAL, + trajectoryInterceptionProbability TrajectoryInterceptionProbability, + trajectoryInterceptionConfidence TrajectoryInterceptionConfidence OPTIONAL, + ... + } + + TrajectoryInterceptionProbability ::= INTEGER { zero(0), twoPercent(1), + fourPercent(2), oneHundredPercent(50), unavailable (63) } (0..63) + + TrajectoryInterceptionConfidence ::= INTEGER { lessthan50percent(0), + between50and70Percent(1), between70and90Percent(2), above90Percent(3) } (0..3) + + HeadingChangeIndication ::= SEQUENCE { + direction LeftOrRight, + actionDeltaTime ActionDeltaTime, ... } + LeftOrRight ::= ENUMERATED { left, right } + + ActionDeltaTime ::= INTEGER {zero(0), hundredMs(1), twoHundredMs(2), + unavailable (127) } (0..127) + + AccelerationChangeIndication ::= SEQUENCE { + accelOrDecel AccelOrDecel, + actionDeltaTime ActionDeltaTime, + ... + } + + AccelOrDecel ::= ENUMERATED { accelerate, decelerate } + + StabilityChangeIndication ::= SEQUENCE { + lossProbability StabilityLossProbability, + actionDeltaTime ActionDeltaTime, + ... + } + + StabilityLossProbability ::= INTEGER { zero(0), twoPercent (1), + fourPercent(2), unavailable (63) } (0..63) + + END diff --git a/VAM-Temp-Imports.asn b/VAM-Temp-Imports.asn new file mode 100644 index 0000000000000000000000000000000000000000..70f459321d0c0f2ee893523ef275d0559267e962 --- /dev/null +++ b/VAM-Temp-Imports.asn @@ -0,0 +1,110 @@ +-- ETSI TS 103 300-3 V0.5.0 (2020-09) + +-- Note: This module defines types that are intended to be updated within +-- or added to the Common Data Dictionary. Defining the types in this +-- module allows them to be used by the VAM before the CDD has been +-- updated. Once the CDD has been updated, this module will also be +-- updated to import the new types directly from the CDD, and the +-- version number of this module will be incremented. + +VAM-Temp-Imports {itu-t(0) identified-organization(4) etsi(0) itsDomain(5) + wg1(1) ts(103300) temp-imports(255) version1(1)} + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + +ReferencePosition, StationID +FROM ITS-Container + {itu-t (0) identified-organization (4) etsi (0) itsDomain (5) wg1 (1) + ts (102894) cdd (2) version (2)} + +NodeOffsetPointXY, Offset-B10, Offset-B11, Offset-B12, Offset-B13, +Offset-B14, Offset-B16 +FROM DSRC + {iso (1) standard (0) signalizedIntersection (19091) profilec(2) dsrc (2) + version (2)} + +; + +-- identical to BasicContainer as used in CAM +BasicContainer ::= SEQUENCE { + stationType StationType, -- from VAM-Temp-Imports + referencePosition ReferencePosition, -- from ITS-Container + ... +} + +ItsPduHeader ::= SEQUENCE { + protocolVersion INTEGER (0..255), + messageID INTEGER{ denm(1), cam(2), poi(3), spatem(4), mapem(5), ivim(6), ev-rsr(7), tistpgtransaction(8), srem(9), ssem(10), evcsn(11), saem(12), rtcmem(13), vam(14) } (0..255), -- Mantis #7209, #7005 + stationID StationID +} + + + + +AreaCircular ::= SEQUENCE { + nodeCenterPoint OffsetPoint OPTIONAL, + radius Radius +} + +AreaPolygon ::= SEQUENCE { + polyPointList PolyPointList +} + +AreaRectangle ::= SEQUENCE { + nodeCenterPoint OffsetPoint OPTIONAL, + semiMajorRangeLength SemiRangeLength, + semiMinorRangeLength SemiRangeLength, + semiMajorRangeOrientation WGS84AngleValue, + semiHeight SemiRangeLength OPTIONAL +} + +OffsetPoint ::= SEQUENCE{ + nodeOffsetPointXY NodeOffsetPointXY (WITH COMPONENTS {..., node-LatLon ABSENT, regional ABSENT}), + nodeOffsetPointZ NodeOffsetPointZ OPTIONAL +} + + +NodeOffsetPointZ ::= CHOICE { + node-Z1 Offset-B10, -- node is within 5.11m of last node + node-Z2 Offset-B11, -- node is within 10.23m of last node + node-Z3 Offset-B12, -- node is within 20.47m of last node + node-Z4 Offset-B13, -- node is within 40.96m of last node + node-Z5 Offset-B14, -- node is within 81.91m of last node + node-Z6 Offset-B16 -- node is within 327.67m of last node +} + + +Radius ::= INTEGER { + zeroPointOneMeter (1), + oneMeter (10) +} (0..10000) + + +PolyPointList ::= SEQUENCE (SIZE(3..16, ...)) OF OffsetPoint + +SemiRangeLength ::= INTEGER { + zeroPointOneMeter (1), + oneMeter (10) +} (0..10000) + +WGS84AngleValue ::= INTEGER { + wgs84North (0), + wgs84East (900), + wgs84South (1800), + wgs84West (2700), + unavailable (3601) +} (0..3601) + +StationType ::= INTEGER { + unknown(0), pedestrian(1), cyclist(2), moped(3), motorcycle(4), + passengerCar(5), bus(6), lightTruck(7), heavyTruck(8), trailer(9), + specialVehicles(10), tram(11), lightVruVehicle(12), animal(13), + roadSideUnit(15) +} +(0..255) + +END diff --git a/motorcyclist-special-container.asn b/motorcyclist-special-container.asn new file mode 100644 index 0000000000000000000000000000000000000000..495b76cf5ef05ab3143e1aba7b9440f9633fc1b3 --- /dev/null +++ b/motorcyclist-special-container.asn @@ -0,0 +1,41 @@ +-- ETSI TS 103 300-3 V0.5.0 (2020-09s) + +-- This module defines a special container for motorcycles, to be integrated into the +-- Cooperative Awareness Message (CAM) defined in EN 302 637-2 + +VRU-Motorcyclist-Special-Container {itu-t(0) identified-organization(4) etsi(0) itsDomain(5) + wg1(1) ts(103300) motorcyclist-special-container(2) version1(1)} + + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + SequenceOfVruPathPoint, SequenceOfVruSafeDistanceIndication, + StabilityChangeIndication, VruOrientation, VruRollAngle, + VruSizeClass, VruSubProfileMotorcyclist +FROM VAM-PDU-Descriptions + {itu-t(0) identified-organization(4) etsi(0) itsDomain(5) + wg1(1) ts(103300) vam(1) version1(1)} + + PathHistory +FROM ITS-Container + {itu-t(0) identified-organization(4) etsi(0) + itsDomain(5) wg1(1) ts(102894) cdd(2) version(2)} +; + +MotorcylistSpecialContainer ::= SEQUENCE { + vruSubProfileMotorcyclist VruSubProfileMotorcyclist, + vruSizeClass VruSizeClass, + rollAngle VruRollAngle OPTIONAL, + orientation VruOrientation OPTIONAL, + vruSafeDistance SequenceOfVruSafeDistanceIndication OPTIONAL, + pathPrediction SequenceOfVruPathPoint OPTIONAL, + stabilityChangeIndication StabilityChangeIndication OPTIONAL, + ... +} + + + +END