The visualization module provides comprehensive tools for visualizing Live for Speed (LFS) telemetry data. It includes real-time dashboards, analysis plots, track maps, and lap comparison tools.
The TelemetryDashboard class provides a web-based real-time telemetry dashboard using Dash and Plotly.
from src.visualization import TelemetryDashboard
# Create dashboard instance
dashboard = TelemetryDashboard(
host="127.0.0.1", # LFS server host
port=29999, # InSim port
app_name="LFS-Ayats", # Application name
update_interval=100 # Update every 100ms (10Hz)
)
# Run the dashboard server
dashboard.run(
debug=True, # Enable debug mode
port=8050, # Dashboard port
host="0.0.0.0" # Allow external connections
)
Then open your browser to http://localhost:8050
The plots module provides functions for creating detailed analysis visualizations.
from src.visualization import create_speed_vs_distance_plot
fig = create_speed_vs_distance_plot(
telemetry_list,
title="Speed Analysis - Lap 5"
)
fig.show() # or fig.write_html("speed_plot.html")
Features:
from src.visualization import create_trajectory_comparison_plot
trajectories = {
"Best Lap": best_lap_telemetry,
"Current Lap": current_lap_telemetry,
"Ideal Line": ideal_lap_telemetry
}
fig = create_trajectory_comparison_plot(trajectories)
fig.show()
Features:
from src.visualization import create_braking_analysis_plot
fig = create_braking_analysis_plot(telemetry_list)
fig.show()
Features:
from src.visualization import create_heatmap_plot
fig = create_heatmap_plot(telemetry_list)
fig.show()
Features:
from src.visualization import create_sector_times_plot
lap_data = [
{"lap": 1, "sector1": 20.5, "sector2": 18.3, "sector3": 22.1},
{"lap": 2, "sector1": 19.8, "sector2": 18.5, "sector3": 21.9},
]
fig = create_sector_times_plot(lap_data)
fig.show()
Features:
from src.visualization import create_g_force_plot
fig = create_g_force_plot(telemetry_list)
fig.show()
Features:
The map_view module provides various track map visualizations.
from src.visualization import create_track_map
fig = create_track_map(
telemetry_list,
title="Blackwood GP Track",
show_speed_colors=True, # Color by speed
height=600
)
fig.show()
Features:
from src.visualization import create_live_position_map
# Get current positions
positions = collector.get_latest_telemetry()
fig = create_live_position_map(
vehicle_positions=positions,
track_data=reference_lap, # Optional track outline
title="Live Race Positions"
)
fig.show()
Features:
from src.visualization import create_racing_line_map
fig = create_racing_line_map(
ideal_line=reference_lap,
current_line=current_lap,
title="Racing Line Analysis"
)
fig.show()
Features:
from src.visualization import create_corner_analysis_map
fig = create_corner_analysis_map(
telemetry_list,
corner_threshold=0.3
)
fig.show()
Features:
from src.visualization import create_3d_track_map
fig = create_3d_track_map(
telemetry_list,
title="3D Track Elevation",
height=700
)
fig.show()
Features:
The LapComparator class provides comprehensive lap comparison tools.
from src.visualization import LapComparator
# Create comparator
comparator = LapComparator()
# Add laps for comparison
comparator.add_lap("Lap 1", lap1_telemetry)
comparator.add_lap("Lap 2", lap2_telemetry)
comparator.add_lap("Best Lap", best_lap_telemetry)
# Create comparison plots
fig = comparator.create_comparison_plot()
fig.show()
fig = comparator.create_comparison_plot()
Shows speed vs distance for multiple laps overlaid on same plot.
fig = comparator.create_time_delta_plot(reference_lap, current_lap)
Shows cumulative time gain/loss throughout the lap:
fig = comparator.create_sector_comparison()
Grouped bar chart comparing sector times across all stored laps.
fig = comparator.create_trajectory_overlay()
Shows racing lines of all laps overlaid on track map.
# Get lap comparison statistics
comparison = comparator.compare_laps(lap1, lap2)
print(f"Faster lap: {comparison.lap_names[comparison.faster_lap]}")
print(f"Time difference: {comparison.total_time_diff:.3f}s")
print(f"Sector differences: {comparison.sector_diffs}")
# Get overall statistics
stats = comparator.get_statistics()
print(f"Fastest lap: {stats['fastest_lap']}")
print(f"Lap times: {stats['lap_times']}")
The components submodule provides reusable UI components for building custom dashboards.
from src.visualization.components import (
create_speed_gauge,
create_rpm_gauge,
create_temperature_gauge,
create_gear_indicator
)
# Create speedometer
speed_fig = create_speed_gauge(speed_kmh=142.5, max_speed=300)
# Create tachometer
rpm_fig = create_rpm_gauge(rpm=6500, max_rpm=9000)
# Create temperature gauge
temp_fig = create_temperature_gauge(temperature=85.5, max_temp=120)
# Create gear indicator
gear_fig = create_gear_indicator(gear=3)
from src.visualization.components import (
create_speed_chart,
create_position_chart,
create_lap_time_chart,
create_temperature_chart
)
# Speed chart
speed_fig = create_speed_chart(telemetry_data)
# Position chart
position_fig = create_position_chart(telemetry_data)
# Lap times
lap_fig = create_lap_time_chart(lap_data)
from src.visualization.components import (
create_main_layout,
create_telemetry_card,
create_stat_box,
create_two_column_layout
)
from dash import html
# Create stat boxes
stats = [
create_stat_box("Max Speed", "185.2", "km/h"),
create_stat_box("Best Lap", "1:23.456", ""),
]
# Create card
card = create_telemetry_card(
title="Session Stats",
content=html.Div(stats),
card_id="stats-card"
)
# examples/dashboard_example.py
from src.visualization import TelemetryDashboard
dashboard = TelemetryDashboard(
host="127.0.0.1",
port=29999,
update_interval=100
)
dashboard.run(debug=True, port=8050)
# examples/visualization_example.py
from src.connection import InSimClient
from src.telemetry import TelemetryCollector
from src.visualization import (
create_speed_vs_distance_plot,
create_track_map,
create_heatmap_plot
)
# Connect and collect data
client = InSimClient(host="127.0.0.1", port=29999)
client.connect()
collector = TelemetryCollector(client)
collector.start()
# ... collect data ...
collector.stop()
# Get telemetry
telemetry = collector.get_telemetry_history(plid=1)
# Create plots
fig1 = create_speed_vs_distance_plot(telemetry)
fig1.write_html("speed_plot.html")
fig2 = create_track_map(telemetry, show_speed_colors=True)
fig2.write_html("track_map.html")
fig3 = create_heatmap_plot(telemetry)
fig3.write_html("heatmap.html")
client.disconnect()
from src.visualization import LapComparator
comparator = LapComparator()
# Add laps
comparator.add_lap("Reference", reference_lap)
comparator.add_lap("Current", current_lap)
# Generate comparison
fig = comparator.create_comparison_plot()
fig.write_html("lap_comparison.html")
# Time delta analysis
delta_fig = comparator.create_time_delta_plot(reference_lap, current_lap)
delta_fig.write_html("time_delta.html")
# Statistics
stats = comparator.get_statistics()
print(f"Fastest: {stats['fastest_lap']} - {stats['lap_times'][stats['fastest_lap']]:.3f}s")
Most plot functions accept these common parameters:
fig.write_html() for interactive plots, fig.write_image() for static/insim 29999For detailed API documentation, see the docstrings in each module:
src/visualization/dashboard.py - Dashboard classsrc/visualization/plots.py - Analysis plot functionssrc/visualization/map_view.py - Map visualization functionssrc/visualization/comparator.py - Lap comparison toolssrc/visualization/components/ - Reusable UI componentsWhen adding new visualizations:
tests/unit/visualization/Part of the LFS-Ayats project. See LICENSE file for details.