AVLite is a lightweight, extensible autonomous vehicle software stack designed for rapid prototyping, research, and education. It provides clean abstractions for perception, planning, and control while maintaining flexibility through a plugin-based architecture.
ROS2 & Autoware Ready: Built-in ROS2 executor extension (executer_ROS2) with native Autoware message support (Trajectory, ControlCommand, etc.).
AVLite follows a modular architecture with clear separation of concerns:
flowchart TB
subgraph ENTRY[" "]
direction LR
VIZ["π₯οΈ Visualization Β· c50\nReal-time Tkinter GUI"]
HL["β¨οΈ Headless Mode\nTerminal dashboard Β· rich"]
VIZ ~~~ HL
end
EXEC["βοΈ Execution Layer Β· c40\nSyncExecuter Β· AsyncThreadedExecuter Β· Factory"]
subgraph COMPONENTS[" "]
direction LR
PERC["Perception Β· c10 (optional)\nLocalization Β· Mapping\nDetection Β· Tracking Β· Prediction"]
PLAN["Planning Β· c20\nGlobal Β· Local Β· Lattice"]
CTRL["Control Β· c30\nStanley Β· PID"]
WB["World Bridge Β· c40\nBasicSim Β· Carla Β· Gazebo Β· ROS2"]
PERC ~~~ PLAN ~~~ CTRL ~~~ WB
end
COMMON["π§ Common Β· c60\nSettings Β· Capabilities Β· TrajectoryTracker Β· CollisionChecker"]
ENTRY --> EXEC
EXEC --> COMPONENTS
COMPONENTS --> COMMON
- c10_perception: Interfaces and built-in algorithms for detection (
FastBEVLidarDetection), tracking (KalmanTracker), prediction, and localization (LidarLocalization) - c20_planning: Global planning (
GlobalCenterlineRacePlanner,HDMapGlobalPlanner) and local planning (lattice-basedGreedyLatticePlanner) - c30_control: Vehicle control algorithms (Stanley, PID)
- c40_execution: Execution orchestration with support for sync/async modes, simulator bridges, and
replan_global() - c50_visualization: Real-time Tkinter-based GUI for debugging and monitoring
- c60_common: Utilities, settings management, capability definitions (
AnyOf,satisfies_requirements), andHDMap(OpenDRIVE parsing) - extensions: Plugin system for custom components (includes ROS2 executor with Autoware messages)
Strategy Pattern Architecture: All major components (perception, localization, planning, control) use the strategy pattern with automatic registration, allowing runtime selection and hot-reloading without code changes.
Capability-Based System: Components declare their requirements and capabilities, enabling automatic compatibility checking between perception/localization strategies and world bridges.
Optional Perception & Localization: Both perception and localization are optional in the execution pipeline. Run with ground truth data or plug in your own strategies as needed.
YAML-Based Configuration: Profile-based configuration system allows quick switching between different algorithm combinations and parameters.
Hot Reloading: Modify code and configuration files while the system is running without restarting.
Multiple Simulator Support: Works with BasicSim (built-in), CARLA, Gazebo, and ROS2/Autoware through abstract world bridge interface.
Extensible Plugin System: Add custom perception, planning, or control algorithms as plugins without modifying core code.
- Lightweight: Small codebase focused on clarity over production complexity
- No middleware lock-in: Works standalone; ROS2/Autoware integration is optional via built-in extension
- Multi-simulator: Same code runs on BasicSim, Carla, or Gazebo
- Rapid iteration: Hot-reload code and tune parameters without restarting
- Minimal dependencies: Core needs only NumPy, Matplotlib, Tkinter
- Educational: Numbered modules and clean abstractions for learning
Minimal (core functionality):
pip install -r requirements-minimal.txtFull (includes joystick support, dev tools, docs):
pip install -r requirements-full.txtOptional integrations (install separately as needed):
- CARLA: Install from CARLA releases
- ROS2 + Autoware: Install ROS2 (Humble/Iron/Jazzy) and optionally
autoware_auto_msgsfor native Autoware message support. AVLite'sexecuter_ROS2extension provides ROS2 nodes and Autoware message converters out of the box.
Run from source:
python -m avliteInstall system-wide:
pip install .- Launch the visualizer:
python -m avlite - Select a profile from the Config tab (e.g., "default")
- Click "Start/Stop Stack" to begin execution
- Right-click on the plot to spawn NPC vehicles
- Adjust parameters in real-time through the GUI
For long-running deployments (robots, servers, CI) AVLite ships a minimal terminal dashboard that runs the executer without a GUI.
# Run with the 'default' profile
python -m avlite headless
# Pick a profile (saved from the visualizer)
python -m avlite headless -p my_robot_profile
python -m avlite headless my_robot_profile # positional shortcut
# Useful options
python -m avlite headless -p my_robot_profile \
--log-level WARNING \
--control-dt 0.01 --replan-dt 0.5 --perceiveThe dashboard shows live FPS, ego state, lap counter, and recent log lines. Press Ctrl+C to stop.
Requires the optional rich package:
pip install rich- Configure with the visualizer (
python -m avlite): pick the bridge, strategies, and tune parameters until it behaves the way you want. - Save the result as a named profile from the Config tab.
- Deploy that profile on your robot/server with
python -m avlite headless -p <profile>.
The same YAML profiles drive both the GUI and headless mode, so what you see in the visualizer is what the robot will run.
Profiles are split across layer YAML files (c10_perception.yaml, β¦). Shipped defaults are in the repository configs/ directory. Saving from the GUI or settings window writes to ~/.config/avlite/ with the same filenames; load prefers the user copy when present. Set AVLITE_CONFIG_DIR to use a different user config directory.
python -m avlite config help
python -m avlite config validate --profile defaultSee Configuration in the docs for paths, CLI, and resetting to repo defaults.
AVLite has a community plugin system that lets anyone publish perception, planning, control, executer, or world-bridge strategies as a small Git repository.
Browse and install from the GUI:
python -m avlite pluginsThe browser fetches the official registry
(https://github.com/AV-Lab/avlite-community-plugins) and lets you
install, uninstall, and register plugins with the active profile.
Installed plugins live under $XDG_DATA_HOME/avlite/plugins
(or ~/.local/share/avlite/plugins); override with AVLITE_PLUGINS_DIR.
Publish your own plugin:
-
Build a plugin following the Plugin Development Guide.
-
Push it to a public Git repository.
-
Fork https://github.com/AV-Lab/avlite-community-plugins, add an entry to
plugins.yaml:plugins: - name: my_cool_planner repository: https://github.com/<you>/my_cool_planner version: latest # or a tag/commit SHA description: One-line summary author: Your Name
-
Open a pull request. Once merged it shows up automatically in every user's
avlite pluginsbrowser.
AVLite uses a numbered module system for easy navigation:
avlite/
βββ c10_perception/ # Perception components
β βββ c11_perception_model.py
β βββ c12_perception_strategy.py
β βββ c13_localization_strategy.py
β βββ c14_mapping_strategy.py
β βββ c15_perception_algs.py # FastBEVLidarDetection, KalmanTracker, ConstantVelocityPrediction
β βββ c16_localization_algs.py # LidarLocalization (ICP)
β βββ c17_mapping_algs.py
β βββ c19_settings.py
βββ c20_planning/ # Planning components
β βββ c21_planning_model.py
β βββ c22_global_planning_strategy.py
β βββ c23_local_planning_strategy.py
β βββ c24_global_hdmap_planners.py # HDMapGlobalPlanner
β βββ c24_global_planners.py
β βββ c25_global_race_planners.py # GlobalCenterlineRacePlanner
β βββ c26_local_lattice_planners.py
β βββ c27_lattice.py
β βββ c29_settings.py
βββ c30_control/ # Control components
β βββ c31_control_model.py
β βββ c32_control_strategy.py
β βββ c33_pid.py
β βββ c34_stanley.py
β βββ c39_settings.py
βββ c40_execution/ # Execution and simulation
β βββ c41_world_bridge.py
β βββ c42_executer.py
β βββ c43_factory.py
β βββ c44_sync_executer.py
β βββ c45_async_threaded_executer.py
β βββ c46_basic_sim.py
β βββ c49_settings.py
βββ c50_visualization/ # GUI and plotting
β βββ c50_community_plugins_app.py
β βββ c51_visualizer_app.py
β βββ c52_plot_views.py
β βββ c53_perceive_plan_control_views.py
β βββ c54_exec_views.py
β βββ c55_log_view.py
β βββ c56_config_views.py
β βββ c57_plot_lib.py
β βββ c58_ui_lib.py
β βββ c59_settings.py
βββ c60_common/ # Utilities
β βββ c61_capabilities.py
β βββ c62_sensor_data.py
β βββ c63_trajectory_tracker.py
β βββ c64_collision_checking.py
β βββ c65_fps_tracker.py
β βββ c67_hdmap.py # HDMap (OpenDRIVE parsing)
β βββ c68_settings_schema.py
β βββ c69_setting_utils.py
βββ extensions/ # Built-in extensions
βββ bridge_carla/
βββ bridge_gazebo/
βββ bridge_ROS2/
βββ executer_ROS2/
βββ multi_object_prediction/
The numbering scheme allows quick navigation: search for "c23" to find local planning, "c34" for Stanley controller, etc.
See the Plugin Development Guide for detailed instructions on creating custom perception, planning, and control components.

