2026-07-04 18:22:23 -06:00
|
|
|
extends Node3D
|
|
|
|
|
class_name VehicleNode
|
|
|
|
|
|
|
|
|
|
var UUID = preload('res://addons/uuid/uuid.gd')
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
4 | 1 byte | bool | peer provides datetime
|
|
|
|
|
5 | 1 byte | bool | peer provides gps
|
|
|
|
|
6 | 1 byte | bool | peer provides accelerometer
|
|
|
|
|
7 | 1 byte | bool | peer provides gyroscope
|
|
|
|
|
8 | 1 byte | bool | peer provides magnetometer
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
var host_id: String = ''
|
|
|
|
|
@export var host: bool = true
|
2026-07-04 23:49:20 -06:00
|
|
|
var sensor_nodes = {}
|
2026-07-04 18:22:23 -06:00
|
|
|
var sensor_classes = {
|
2026-07-04 23:49:20 -06:00
|
|
|
"VEHICLE": [],
|
2026-07-06 13:57:09 -06:00
|
|
|
"LIDAR_2D": [],
|
2026-07-04 18:22:23 -06:00
|
|
|
}
|
|
|
|
|
|
2026-07-04 23:49:20 -06:00
|
|
|
var timer: float = 0.
|
|
|
|
|
static var timer_1: float = 1.
|
2026-07-04 18:22:23 -06:00
|
|
|
|
2026-07-04 23:49:20 -06:00
|
|
|
var altitude_m: float:
|
|
|
|
|
get:
|
|
|
|
|
return _get_altitude_m()
|
2026-07-04 18:22:23 -06:00
|
|
|
|
2026-07-04 23:49:20 -06:00
|
|
|
var speed_kmh: float:
|
|
|
|
|
get:
|
|
|
|
|
return _get_speed_kmh()
|
|
|
|
|
|
|
|
|
|
var roll_rad: float:
|
|
|
|
|
get:
|
|
|
|
|
return _get_roll_rad()
|
|
|
|
|
|
|
|
|
|
var pitch_rad: float:
|
|
|
|
|
get:
|
|
|
|
|
return _get_pitch_rad()
|
|
|
|
|
|
2026-07-06 13:57:09 -06:00
|
|
|
var lateral_accel: Vector2:
|
|
|
|
|
get:
|
|
|
|
|
return _get_lateral_accel()
|
|
|
|
|
|
2026-07-04 23:49:20 -06:00
|
|
|
var heading_rad: float:
|
|
|
|
|
get:
|
|
|
|
|
return _get_heading_rad()
|
2026-07-04 18:22:23 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
|
func _ready() -> void:
|
|
|
|
|
if host:
|
|
|
|
|
_load_id()
|
|
|
|
|
print('VehicleNode ready')
|
|
|
|
|
#var axis_scene = axis_scene_template.instantiate()
|
|
|
|
|
#axis_scene.axis_length = 2.
|
|
|
|
|
#if not has_node('Axis'):
|
|
|
|
|
# add_child(axis_scene)
|
|
|
|
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
|
|
|
func _process(delta: float) -> void:
|
2026-07-04 23:49:20 -06:00
|
|
|
pass
|
2026-07-04 18:22:23 -06:00
|
|
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
func _load_id():
|
|
|
|
|
var file_path = "user://host_id.idf"
|
|
|
|
|
if not FileAccess.file_exists(file_path):
|
|
|
|
|
host_id = _generate_id()
|
|
|
|
|
var id_file = FileAccess.open(file_path, FileAccess.WRITE)
|
|
|
|
|
id_file.store_line(host_id)
|
|
|
|
|
id_file.close()
|
|
|
|
|
var id_file = FileAccess.open(file_path, FileAccess.READ)
|
|
|
|
|
host_id = id_file.get_line()
|
|
|
|
|
|
|
|
|
|
func _generate_id():
|
|
|
|
|
return UUID.new().as_string()
|
2026-07-04 23:49:20 -06:00
|
|
|
|
|
|
|
|
func _get_altitude_m():
|
|
|
|
|
var alt_sum: float = 0
|
|
|
|
|
var alt_count: int = 0
|
|
|
|
|
for sensor_ip in sensor_classes["VEHICLE"]:
|
|
|
|
|
var sensor_alt = sensor_nodes[sensor_ip].altitude_m
|
|
|
|
|
if sensor_alt == null:
|
|
|
|
|
continue
|
|
|
|
|
alt_sum += sensor_alt
|
|
|
|
|
alt_count += 1
|
|
|
|
|
if alt_count == 0:
|
|
|
|
|
return 0
|
|
|
|
|
return alt_sum / alt_count
|
2026-07-04 18:22:23 -06:00
|
|
|
|
2026-07-04 23:49:20 -06:00
|
|
|
func _get_speed_kmh():
|
|
|
|
|
var speed_sum: float = 0
|
|
|
|
|
var speed_count: int = 0
|
|
|
|
|
for sensor_ip in sensor_classes["VEHICLE"]:
|
|
|
|
|
var sensor_speed = sensor_nodes[sensor_ip].speed_kmh
|
|
|
|
|
if sensor_speed == null:
|
|
|
|
|
continue
|
|
|
|
|
speed_sum += sensor_speed
|
|
|
|
|
speed_count += 1
|
|
|
|
|
if speed_count == 0:
|
|
|
|
|
return 0
|
|
|
|
|
return speed_sum / speed_count
|
|
|
|
|
|
|
|
|
|
func _get_roll_rad():
|
|
|
|
|
var roll_sum: float = 0
|
|
|
|
|
var roll_count: int = 0
|
|
|
|
|
for sensor_ip in sensor_classes["VEHICLE"]:
|
|
|
|
|
var sensor_roll = sensor_nodes[sensor_ip].roll_rad
|
|
|
|
|
if sensor_roll == null:
|
|
|
|
|
continue
|
|
|
|
|
roll_sum += sensor_roll
|
|
|
|
|
roll_count += 1
|
|
|
|
|
if roll_count == 0:
|
|
|
|
|
return 0
|
|
|
|
|
return roll_sum / roll_count
|
|
|
|
|
|
|
|
|
|
func _get_pitch_rad():
|
|
|
|
|
var pitch_sum: float = 0
|
|
|
|
|
var pitch_count: int = 0
|
|
|
|
|
for sensor_ip in sensor_classes["VEHICLE"]:
|
|
|
|
|
var sensor_pitch= sensor_nodes[sensor_ip].pitch_rad
|
|
|
|
|
if sensor_pitch == null:
|
|
|
|
|
continue
|
|
|
|
|
pitch_sum += sensor_pitch
|
|
|
|
|
pitch_count += 1
|
|
|
|
|
if pitch_count == 0:
|
|
|
|
|
return 0
|
|
|
|
|
return pitch_sum / pitch_count
|
2026-07-04 18:22:23 -06:00
|
|
|
|
2026-07-06 13:57:09 -06:00
|
|
|
func _get_lateral_accel():
|
|
|
|
|
var gs_sum: Vector2 = Vector2.ZERO
|
|
|
|
|
var gs_count: int = 0
|
|
|
|
|
for sensor_ip in sensor_classes["VEHICLE"]:
|
|
|
|
|
var sensor_gs = sensor_nodes[sensor_ip].lateral_accel
|
|
|
|
|
if sensor_gs == null:
|
|
|
|
|
continue
|
|
|
|
|
gs_sum += sensor_gs
|
|
|
|
|
gs_count += 1
|
|
|
|
|
if gs_count == 0:
|
|
|
|
|
return Vector2.ZERO
|
|
|
|
|
return gs_sum / gs_count
|
|
|
|
|
|
2026-07-04 23:49:20 -06:00
|
|
|
func _get_heading_rad():
|
|
|
|
|
var heading_sum: float = 0
|
|
|
|
|
var heading_count: int = 0
|
|
|
|
|
for sensor_ip in sensor_classes["VEHICLE"]:
|
|
|
|
|
var sensor_heading = sensor_nodes[sensor_ip].heading_rad
|
|
|
|
|
if sensor_heading == null:
|
|
|
|
|
continue
|
|
|
|
|
heading_sum += sensor_heading
|
|
|
|
|
heading_count += 1
|
|
|
|
|
if heading_count == 0:
|
|
|
|
|
return 0
|
|
|
|
|
return heading_sum / heading_count
|
|
|
|
|
|
|
|
|
|
func add_sensor_node(sensor_node: BaseSensorNode):
|
|
|
|
|
sensor_nodes[sensor_node.ip_address] = sensor_node
|
|
|
|
|
if sensor_node.sensor_class not in sensor_classes:
|
2026-07-04 18:22:23 -06:00
|
|
|
return
|
2026-07-04 23:49:20 -06:00
|
|
|
sensor_classes[sensor_node.sensor_class].append(sensor_node.ip_address)
|