Previously, the class Shape and its subclasses Rectangle, Circle, Polygon, ShapeGroup and SemiTrailerTruck in the module commonroad.geometry.shape were used to represent both the general shape of an obstacle and the occupancy of an obstacle at a certain time step. Due to the semantic differences (the shape of an obstacle does not have an absolute position and orientation but the occupancy does), we created separate data structures for them:
- Obstacle shape: The class ObstacleShape and its subclasses in the module commonroad.geometry.obstacle_shapes are used to represent the general shape of an obstacle.
- Occupancy: The class Occupancy and its subclasses in the module commonroad.geometry.occupancy are used to represent an occupied area, e.g., the occupancy of an obstacle at a certain time step.
Please take a look at the class diagram in the
documentation
for more details.
The ObstacleShape classes offer methods
to compute the Occupancy of the shape at a
given state, e.g., for RectObstacleShape,
this involves rotation by the state's orientation and translation by the state's position.
These methods correspond the rotate_translate_local method of the old commonroad.geometry.shape
classes.
The Occupancy classes offer geometric operations and conversion
to a shapely object.
They also implement IDrawable like the old
commonroad.geometry.shape
classes.
The following additional changes were made as part of this class separation:
- The old Occupany
class in the module
commonroad.prediction.predictionwas removed and its usages were replaced by the new Occupancy class. The main difference is that the new Occupancy class does not have a time step anymore. - Therefore, the class Prediction now has the property
occupanciesproviding a dictionary mapping each time step to the occupancy, instead of the old propertyoccupancy_setwhich provided a list. - The method
find_lanelet_by_shapeof the class Lanelet was removed and replaced byfind_lanelet_by_occupancy(which does the same but takes an instance of the new Occupancy class as argument instead of the old Shape class). Furthermore, the methodfind_lanelet_by_shapely_shapewas added which takes a shapely geometry as argument. - The Obstacle class and its subclasses were adjusted accordingly, i.e., they use the new ObstacleShape classes now for storing their basic shape, and the Occupancy classes for their occupancy at a certain time step.
If you are using a Shape class from commonroad.geometry.shape in your own CommonRoad related project, you need to replace it by
- ObstacleShape or its desired subclass, if your shape does not have an absolute position and orientation in the plane, but rather describes the general shape of object.
- Occupancy or its desired subclass, if your shape describes an occupied area with an absolute position and orientation in the plane.
With this release, commonroad-io supports protobuf as file format for scenarios (additionally to the existing XML format). For protobuf format, static properties of scenarios such as road network and other frequently changed properties like dynamic obstacles/ planning problems are stored separately. (XML format remains unchanged.) Moreover, the internal representation for intersections was improved and allows for modeling more sophisticated intersections.
- Update to new template-repository structure
- Add test cases for all hash and equality functions,check all CommonRoad element classes
- Improved icon rendering for semi-trailer truck
- Github actions static code evaluation and python versions
- New Australia and US traffic signs
- New lanelet type:
restricted_area LaneletNetwork.create_from_lanelet_networknow also includes intersections- Support for Python 3.13
- TR2 cost function enum value
DynamicObstaclecannot be hashed if some optional attributes are missingTrafficLightCycledoes not invalidate cached cycle init timesteps after modification
- Github actions for ubuntu, windows, and macOS
- Gitlab runner for arm64 ubuntu
- Support for reading xml and protobuf byte streams
- Support for numpy
>=2.0 - Adjustable zorder for dynamic obstacle & lanelet visualization
- AreaBorder can have multiple adjacent lanelets
- Performance regression for occupancy_set lookups in TrajectoryPrediction
- Matplotlib
>=3.9.0support
- Support for Python 3.8
- Country-independent traffic sign enum
- Missing country-specific max speed sign IDs
- Automatically generated TrafficSignIDCountries enum for importing in other scripts
- GroundTruthPredictor class to use stored trajectories as prediction
- Function to append a state to a trajectory
- Typo:
TrafficSigInterpreter→TrafficSignInterpreter - Typo EMERGENCY_STOP traffic sign enum name
- Activation condition for drawing occupancies
- Traffic sign with first occurrence set to None can be hashed
- Traffic light can be plotted without a TrafficLightCycle
- Optimization-based planner tutorial now uses planner and predictor interfaces
- Simplified traffic sign matching in FileReader
- The occupancy set, initial time step, and final time step are now computed properties of TrajectoryPrediction
- Trajectory now allows direct access to the state list
- Drawing occupancies by default false
- Improved visual appearance of notebooks
- Setters for initial and final time step in predictions
- Setter for occupancy_set in TrajectoryPrediction
- Function to convert 3D scenarios to 2D scenarios
- Support for Python 3.12
- Function to retrieve all lanelets referencing a given traffic sign/light
- New line marking types
- Traffic light shape
- Conversion to initial state in function create_dynamic_obstacle of solution object
- Traffic signs for Zamunda now use images of German traffic signs
- Code formatting (flake8, black, isort)
- Images for Zamunda traffic signs
- Function commonorad.common.util.interpolate_angle
- Type information for lanelet init function
- Dynamic obstacles can now store a history of their states
- Function to update the initial state of a dynamic obstacle while storing the previous state in the history
- Function to update behavior predictions of dynamic obstacles
- Function to find lanelet predecessors in range to lanelet network
- Function to compute all predecessor lanelets starting from a provided lanelet and merge them to a single lanelet for each route.
- Documentation for renderers (including video creation)
- Abstract interfaces for motion planner and prediction for usage in other tools
- New ExtendedPMState to support states with position, velocity, orientation, and acceleration
- Orientation property to PMState
- Hash and equality functions for area
- Function create_from_lanelet_network deletes references to removed lanelets
- Write environment time to XML in correct format
- Failing visualization of lanelets, stop lines, traffic signs, and traffic lights with z-coordinate
- Traffic lights now correctly change size in interactive matplotlib plots (only affected matplotlib>=3.7)
- Considering state attributes not part of dataclass definition in state to state conversion
- Enforce InitialState class for initial state property of dynamic obstacle
- Hash function of obstacle
- Cleanup lanelet, traffic sign, and traffic light references in function create_from_lanelet_list by default
- Equality checks of scenario elements no longer emit a warning on inequality (except if the elements are of different types)
- Duplicated initial_state property of dynamic obstacle
- Area for modelling drivable areas which cannot be represented by lanelets
- New weather and time of day options
- Allow file reader to determine format based on suffix
- Visualization of all traffic signs by setting
show_traffic_signs = Nonein draw parameters - Validity functions to support z-axis
- Unreferenced traffic signs for lanelet networks filtered by lanelet type
- Visualization of direction arrow of narrow lanelets
- Traffic light cycle optional
- Traffic light in separate python file
- Allow file reader to determine format based on suffix
- Broaden types allowed as file names
- Open files safely by using a context manager
- Use correct suffix when inferring filename from scenario id
- function get_default_cycle for traffic lights
- support for Python 3.7
- Support for shapely>=2.0.0
- Writing scenarios without location to protobuf
- Dashed lanelet boundaries with fixed dash position
- Default plot limits for focused obstacle
- Use dt from scenario as default for video creation
- Apply axis visible-option also for video creation
- Protobuf FileReader marking road network related IDs as used
- State attribute comparison
- Name of SIDEWALK and BUSLANE traffic signs to PEDESTRIAN_SIDEWALK and BUS_LANE
- Packaging and dependency management using poetry
- Drawing parameters as dataclasses (support for context help)
- Documentation for drawing parameters
- Support for Python 3.11
- Function to convert a state into a 1D-numpy array
- Progress bar for video creation
- Callback for modifying axes during plotting a video
- Name of position in lateral and longitudinal state
- ParamServer and dictionary specification of drawing parameters
- Failing visualization of a trajectory at it's initial time step
- Broken lanelet visualization with matplotlib >3.5
- Function for getting lanelet orientation closest to a given position
- Function for getting most likely lanelet given an obstacle state
- Function for erasing lanelet network from scenario
- Function for replacing lanelet network of a scenario with new one
- Support for Protobuf format
- Predefined classes for specific states, point-mass model, kinematic single-track model, etc.
- Function for computing shape group occupancy from state
- Support for kinematic single-track model with one on-axle trailer
- Three new lanelet types: parking, border, and restricted
- Move tests, tutorial, and documentation folder to root directory
- State classes in separate Python file
- setter method for lanelet network in scenario class
- Default constructor for ScenarioID produces invalid Benchmark ID
- Changeable state list leads to inconsistent final time step of trajectory
- Various small bug fixes
- Video creation with custom draw parameters
- Obstacle icon with custom color
- Remove support for Python 3.6
- Side-effect circle and rectangle init functions
- Parsing solution files with old time format
- Invalid lanelet occupancy computation using buffered polygons
- Various small bug fixes
- Polyline utility functions, e.g., resampling, path length, orientation, curvature, intersection
__eq__and__hash__functions for LaneletNetwork and related classes (e.g., traffic sign, traffic light, stop line, etc.)- Compatibility for Shapely 2.0
- New traffic signs for Germany
- License switched to BSD-3
- Date in solution file now stored in the dateTime format (
%Y-%m-%dT%H:%M:%S)
- Various small bug fixes
- Spatial indexing via STRTree in LaneletNetwork for faster computation of lanelet queries via positions or shapes
- The function LaneletNetwork.create_from_lanelet_network accepts now a shape and set of lanelet types which should be excluded
- Shapely polygon for lanelets is created by default
- Function convert_to_polygon() within Lanelet class is deprecated and will be removed in the next release
- Various small bug fixes
- Parameter
draw_params={"focus_obstacle_id": obstacle_id}focuses the plot or video on a dynamic_obstacle - About 150 new traffic signs from Germany, Spain, and US added
- added new cost function TR1 to SolutionWriter
- Various small bug fixes
- Support for over 50 new traffic signs from Germany
- Support of phantom obstacles
- New visualization module which supports MVC pattern
- Functions for adding and removing traffic signs, traffic lights, and intersections from a scenario or lanelet network
- New icon visualization interface and new icons for bus, truck, and bicycle (developed by Simon Sagmeister - TUM FTM)
- Scaling of traffic signs is coupled with the zoom level
- Various small bug fixes
- Support of environment obstacles, e.g. buildings
- Several new traffic signs
- New ScenarioID class for the representation of benchmarks
- New line marking types unknown and no_marking
- Crossings for intersections
The creation of lanelet assignments for obstacles is now optional. This decreases the loading time of scenarios. The lanelet assignment can still be performed manually after loading a scenario.
- Docstrings for properties
- Autoscaling visualization when plotting trajectories.
- Function generate_object_id works now if no element has been added before and reserves ID if object will be added later
- Runtime warning during calls to find_lanelet_by_position
- Various small bug fixes
- Traffic signs are not visualized by default
- new tags for compatibility with 2018b XML format
- new lanelet types: unknown and interstate
- Various small bug fixes
- Support of 2020a Scenarios with TrafficLights, TrafficSigns, and Intersection objects
- SignalStates store information on turn lights, horn, hazard lights, and blue lights of DynamicObstacles
- New Solution object simplifies creating solution xml files and automatically checks the validity of benchmark IDs
- GeoTransformation object stores location and transformation information for lanelet networks extracted from the real world
###Changed
- SolutionReader can now read solution files generated by the CommonRoadSolutionReader
- CommonRoadSolutionWriter can directly write computation times and the CPU model into the solution file
- Visualization is improved and now supports legends
- Various small bug fixes
- The old commonroad.common.solution_writer.CommonRoadSolutionWriter is deprecated and replaced by commonroad.common.solution.CommonRoadSolutionWriter
- Increased decimal precision of file writer when lanelets join into or split from other lanelets
- Minimum of 3 points per lanelet border are required
- File writer writes goal lanes correctly
- LaneletNetwork/find_lanelet_by_id returns None instead of an error if it's not contained in network
- Initial version