Adding lidar sensor handling

This commit is contained in:
2026-07-08 20:58:21 -06:00
parent 8fc5088c01
commit 04f3e2ba07
19 changed files with 145 additions and 31 deletions
+21 -4
View File
@@ -56,6 +56,8 @@ func _process(delta: float) -> void:
DataSignals.accelerometer_data_received.emit(signal_data[1], signal_data[2], signal_data[3], signal_data[4], signal_data[5]) DataSignals.accelerometer_data_received.emit(signal_data[1], signal_data[2], signal_data[3], signal_data[4], signal_data[5])
elif signal_data[0] == "magnetometer_data_received": elif signal_data[0] == "magnetometer_data_received":
DataSignals.magnetometer_data_received.emit(signal_data[1], signal_data[2], signal_data[3]) DataSignals.magnetometer_data_received.emit(signal_data[1], signal_data[2], signal_data[3])
elif signal_data[0] == "lidar_2d_data_received":
DataSignals.lidar_2d_data_received.emit(signal_data[1], signal_data[2], signal_data[3], signal_data[4])
func _exit_tree() -> void: func _exit_tree() -> void:
if use_thread: if use_thread:
@@ -167,6 +169,8 @@ func _handle_six_fps_message(peer: PacketPeerUDP, packet: PackedByteArray):
elif message_class == 0x2a and message_id == 0x39: elif message_class == 0x2a and message_id == 0x39:
#print('Mag packet received') #print('Mag packet received')
_handle_magnetic_packet(peer_ip, packet) _handle_magnetic_packet(peer_ip, packet)
elif message_class == 0x2a and message_id == 0x6f:
_handle_lidar_2d_packet(peer_ip, packet)
elif message_class == 0x2a and message_id == 0xa7: elif message_class == 0x2a and message_id == 0xa7:
_handle_public_key_packet(peer_ip, packet) _handle_public_key_packet(peer_ip, packet)
elif message_class == 0x2a and message_id == 0x5e: # not in use elif message_class == 0x2a and message_id == 0x5e: # not in use
@@ -186,9 +190,6 @@ func _handle_new_peer_request(peer_ip: String, packet: PackedByteArray):
10 | 1 byte | bool | peer provides quaternion orientation 10 | 1 byte | bool | peer provides quaternion orientation
""" """
mutex.lock() mutex.lock()
print(packet)
print(packet.get(4))
print(0xf1)
if packet.get(4) == 0xf1: if packet.get(4) == 0xf1:
awaiting_sensors[peer_ip] = "VEHICLE" awaiting_sensors[peer_ip] = "VEHICLE"
elif packet.get(4) == 0x23: elif packet.get(4) == 0x23:
@@ -238,6 +239,7 @@ func _handle_position_packet(peer_ip: String, packet: PackedByteArray):
var vdop: float = packet.decode_u32(49) / 1000.0 var vdop: float = packet.decode_u32(49) / 1000.0
mutex.lock() mutex.lock()
signal_queue.append(["gps_data_received", peer_ip, timestamp_list, [lat, lon, alt_m, goid_m], speed_kmh, [pdop, hdop, vdop]]) signal_queue.append(["gps_data_received", peer_ip, timestamp_list, [lat, lon, alt_m, goid_m], speed_kmh, [pdop, hdop, vdop]])
signal_queue.append(["raw_data_received", peer_ip, "GPS", timestamp_list, {"lat": lat, "lon": lon, "alt_m": alt_m, "speed_kmh": speed_kmh, "pdop": pdop, "hdop": hdop, "vdop": vdop}])
mutex.unlock() mutex.unlock()
func _handle_gps_sats_packet(peer_ip: String, packet: PackedByteArray): func _handle_gps_sats_packet(peer_ip: String, packet: PackedByteArray):
@@ -311,7 +313,22 @@ func _handle_magnetic_packet(peer_ip: String, packet: PackedByteArray):
mutex.lock() mutex.lock()
signal_queue.append(["magnetometer_data_received", peer_ip, timestamp_list, Vector3(x, y, z)]) signal_queue.append(["magnetometer_data_received", peer_ip, timestamp_list, Vector3(x, y, z)])
mutex.unlock() mutex.unlock()
func _handle_lidar_2d_packet(peer_ip: String, packet: PackedByteArray):
var timestamp_list = _parse_timestamp_slice(packet.slice(4, 11))
mutex.lock()
signal_queue.append(["on_time_data_received", timestamp_list])
mutex.unlock()
var point_count = packet.decode_u8(11)
var point_data = []
for idx in range(point_count):
var offset = idx * 7
var angle: float = float(packet.decode_u32(12 + offset)) / 10000
var distance: float = float(packet.decode_u16(12 + offset + 4)) / 1000
var intensity: int = packet.decode_u8(12 + offset + 6)
point_data.append([angle, distance, intensity])
signal_queue.append(["lidar_2d_data_received", peer_ip, timestamp_list, point_count, point_data])
func _handle_public_key_packet(peer_ip: String, packet: PackedByteArray): func _handle_public_key_packet(peer_ip: String, packet: PackedByteArray):
var timestamp_list = _parse_timestamp_slice(packet.slice(4, 11)) var timestamp_list = _parse_timestamp_slice(packet.slice(4, 11))
mutex.lock() mutex.lock()
+2
View File
@@ -36,6 +36,7 @@ file_logging/enable_file_logging=true
window/size/viewport_width=800 window/size/viewport_width=800
window/size/viewport_height=800 window/size/viewport_height=800
window/size/mode=4
[physics] [physics]
@@ -44,3 +45,4 @@ window/size/viewport_height=800
[rendering] [rendering]
rendering_device/driver.windows="d3d12" rendering_device/driver.windows="d3d12"
renderer/rendering_method="mobile"
+17 -1
View File
@@ -1,9 +1,14 @@
extends BaseSensorNode extends BaseSensorNode
class_name Lidar2DSensorNode class_name Lidar2DSensorNode
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready() -> void: func _ready() -> void:
pass # Replace with function body. super._ready()
DataSignals.lidar_2d_data_received.connect(_on_lidar_data_received)
DataSignals.gps_data_received.connect(_on_gps_data_received)
DataSignals.accelerometer_data_received.connect(_on_accel_data_received)
DataSignals.gyroscope_data_received.connect(_on_gyro_data_received)
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
@@ -12,3 +17,14 @@ func _process(delta: float) -> void:
func _get_sensor_class(): func _get_sensor_class():
return "LIDAR_2D" return "LIDAR_2D"
func _on_lidar_data_received(sensor_ip: String, timestamp_list: Array, lidar_point_count: int, lidar_data: Array):pass
func _on_gps_data_received(source_ip: String, timestamp_list: Array, new_coordinates: Array, speed_kmh: float, dop: Array):
pass
func _on_accel_data_received(source_ip: String, timestamp_list: Array, accel: Vector3, linear_accel: Vector3, g_accel: Vector3):
pass
func _on_gyro_data_received(source_ip: String, timestamp_list: Array, gyro_data: Array):
pass
+18
View File
@@ -48,6 +48,7 @@ var heading_rad: float
func _ready() -> void: func _ready() -> void:
super._ready()
DataSignals.gps_data_received.connect(_on_gps_data_received) DataSignals.gps_data_received.connect(_on_gps_data_received)
#DataSignals.sat_data_received.connect(_on_sat_data_received) #DataSignals.sat_data_received.connect(_on_sat_data_received)
DataSignals.accelerometer_data_received.connect(_on_accel_data_received) DataSignals.accelerometer_data_received.connect(_on_accel_data_received)
@@ -63,6 +64,12 @@ func _on_gps_data_received(source_ip: String, timestamp_list: Array, new_coordin
if source_ip != ip_address: if source_ip != ip_address:
return return
var timestamp: float = 3600.*timestamp_list[0] + 60.*timestamp_list[1] + timestamp_list[2] + timestamp_list[3] var timestamp: float = 3600.*timestamp_list[0] + 60.*timestamp_list[1] + timestamp_list[2] + timestamp_list[3]
if gps_timestamps.size() > 0 and (timestamp - gps_timestamps[-1]) < -1:
gps_timestamps.clear()
coordinates.clear()
gps_positions.clear()
altitudes.clear()
speed_data.clear()
if gps_timestamps.size() == max_data_length and not TimeHelpers.is_timestamp_newer_24h(gps_timestamps[-1], timestamp): if gps_timestamps.size() == max_data_length and not TimeHelpers.is_timestamp_newer_24h(gps_timestamps[-1], timestamp):
return return
var insert_idx = Bisect.reverse_bisect(gps_timestamps, timestamp) var insert_idx = Bisect.reverse_bisect(gps_timestamps, timestamp)
@@ -93,6 +100,13 @@ func _on_accel_data_received(source_ip: String, timestamp_list: Array, accel: Ve
if source_ip != ip_address: if source_ip != ip_address:
return return
var timestamp: float = 3600.*timestamp_list[0] + 60.*timestamp_list[1] + timestamp_list[2] + timestamp_list[3] var timestamp: float = 3600.*timestamp_list[0] + 60.*timestamp_list[1] + timestamp_list[2] + timestamp_list[3]
if accel_timestamps.size() > 0 and (timestamp - accel_timestamps[-1]) < -1:
accel_timestamps.clear()
linear_vecs.clear()
g_vecs.clear()
pitch_data.clear()
roll_data.clear()
lateral_g_data.clear()
if accel_timestamps.size() == max_data_length and not TimeHelpers.is_timestamp_newer_24h(accel_timestamps[-1], timestamp): if accel_timestamps.size() == max_data_length and not TimeHelpers.is_timestamp_newer_24h(accel_timestamps[-1], timestamp):
return return
var insert_idx = Bisect.reverse_bisect(accel_timestamps, timestamp) var insert_idx = Bisect.reverse_bisect(accel_timestamps, timestamp)
@@ -122,6 +136,10 @@ func _on_mag_data_received(source_ip: String, timestamp_list: Array, mag_vec: Ve
if source_ip != ip_address: if source_ip != ip_address:
return return
var timestamp: float = 3600.*timestamp_list[0] + 60.*timestamp_list[1] + timestamp_list[2] + timestamp_list[3] var timestamp: float = 3600.*timestamp_list[0] + 60.*timestamp_list[1] + timestamp_list[2] + timestamp_list[3]
if mag_timestamps.size() > 0 and (timestamp - mag_timestamps[-1]) < -1:
mag_timestamps.clear()
mag_vecs.clear()
heading_data.clear()
if mag_timestamps.size() == max_data_length and not TimeHelpers.is_timestamp_newer_24h(mag_timestamps[-1], timestamp): if mag_timestamps.size() == max_data_length and not TimeHelpers.is_timestamp_newer_24h(mag_timestamps[-1], timestamp):
return return
var insert_idx = Bisect.reverse_bisect(mag_timestamps, timestamp) var insert_idx = Bisect.reverse_bisect(mag_timestamps, timestamp)
+2
View File
@@ -1,9 +1,11 @@
extends Node extends Node
signal raw_data_received(source_ip: String, data_type: String, timestamp_list: Array, data_dict: Dictionary)
signal time_data_received(source_ip: String, timestamp_list: Array) signal time_data_received(source_ip: String, timestamp_list: Array)
signal gps_data_received(source_ip: String, timestamp_list: Array, coordinates: Array, speed_kmh: float, dop: Array) signal gps_data_received(source_ip: String, timestamp_list: Array, coordinates: Array, speed_kmh: float, dop: Array)
signal sat_data_received(source_ip: String, timestamp: float, sat_count: Array, sat_position: Array) signal sat_data_received(source_ip: String, timestamp: float, sat_count: Array, sat_position: Array)
signal accelerometer_data_received(source_ip: String, timestamp: float, accel: Vector3, linear_accel: Vector3, g_accel: Vector3) signal accelerometer_data_received(source_ip: String, timestamp: float, accel: Vector3, linear_accel: Vector3, g_accel: Vector3)
signal magnetometer_data_received(source_ip: String, timestamp: float, mag_vec: Vector3) signal magnetometer_data_received(source_ip: String, timestamp: float, mag_vec: Vector3)
signal gyroscope_data_received(source_ip: String, timestamp: float, data: Array) signal gyroscope_data_received(source_ip: String, timestamp: float, data: Array)
signal lidar_2d_data_received(sensor_ip: String, timestamp_list: Array, lidar_point_count: int, lidar_data: Array)
+2 -6
View File
@@ -1,6 +1,5 @@
[gd_scene format=3 uid="uid://c2yga5koqwo72"] [gd_scene format=3 uid="uid://c2yga5koqwo72"]
[ext_resource type="PackedScene" uid="uid://bbdbyjievjpsq" path="res://widgets/compass/compass_widget_scene.tscn" id="1_fyqef"]
[ext_resource type="Script" uid="uid://ba7ta7jjrjuhg" path="res://views/2d/view_2d.gd" id="1_n6fjn"] [ext_resource type="Script" uid="uid://ba7ta7jjrjuhg" path="res://views/2d/view_2d.gd" id="1_n6fjn"]
[ext_resource type="PackedScene" uid="uid://b71kuj4yole3j" path="res://widgets/satellites/satellite_widget.tscn" id="2_3b2b5"] [ext_resource type="PackedScene" uid="uid://b71kuj4yole3j" path="res://widgets/satellites/satellite_widget.tscn" id="2_3b2b5"]
[ext_resource type="PackedScene" uid="uid://m14p8xxs14rf" path="res://widgets/altitude/altitude_widget.tscn" id="3_g6l6n"] [ext_resource type="PackedScene" uid="uid://m14p8xxs14rf" path="res://widgets/altitude/altitude_widget.tscn" id="3_g6l6n"]
@@ -14,9 +13,6 @@ script = ExtResource("1_n6fjn")
[node name="HUD" type="CanvasLayer" parent="." unique_id=1826106128] [node name="HUD" type="CanvasLayer" parent="." unique_id=1826106128]
[node name="Compass" parent="HUD" unique_id=2062816665 instance=ExtResource("1_fyqef")]
position = Vector2(104, 486)
[node name="TotalSatCount" parent="HUD" unique_id=931018379 instance=ExtResource("2_3b2b5")] [node name="TotalSatCount" parent="HUD" unique_id=931018379 instance=ExtResource("2_3b2b5")]
visible = false visible = false
scale = Vector2(0.05, 0.05) scale = Vector2(0.05, 0.05)
@@ -64,10 +60,10 @@ scale = Vector2(0.05, 0.05)
sat_category = "QZSS" sat_category = "QZSS"
[node name="AltitudeWidget" parent="HUD" unique_id=1004159593 instance=ExtResource("3_g6l6n")] [node name="AltitudeWidget" parent="HUD" unique_id=1004159593 instance=ExtResource("3_g6l6n")]
position = Vector2(170, 481) position = Vector2(233, 479)
[node name="AccelerometerWidget" parent="HUD" unique_id=1057256615 instance=ExtResource("4_qui0h")] [node name="AccelerometerWidget" parent="HUD" unique_id=1057256615 instance=ExtResource("4_qui0h")]
position = Vector2(675, 400) position = Vector2(673, 302)
[node name="RollWidget" parent="HUD" unique_id=1446458625 instance=ExtResource("6_s8d37")] [node name="RollWidget" parent="HUD" unique_id=1446458625 instance=ExtResource("6_s8d37")]
position = Vector2(407, 267) position = Vector2(407, 267)
+39
View File
@@ -0,0 +1,39 @@
extends Node2D
var line: Line2D
var points_angle = []
var points_distance = []
var timer_static = 60
var timer = 0.
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
line = get_node('Line2D')
DataSignals.lidar_2d_data_received.connect(_on_lidar_data_received)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
timer += delta
if timer > timer_static:
timer = 0
points_angle.clear()
points_distance.clear()
for i in line.points:
print(i - Vector2(400, 400))
print()
_update_line()
func _on_lidar_data_received(sensor_ip: String, timestamp_list: Array, lidar_point_count: int, lidar_data: Array):
for point in lidar_data:
var insert_idx = Bisect.bisect(points_angle, point[0])
points_angle.insert(insert_idx, point[0])
points_distance.insert(insert_idx, point[1])
func _update_line():
line.clear_points()
for idx in range(points_angle.size()):
var x = 4*points_distance[idx] * cos(deg_to_rad(points_angle[idx])) + 400
var y = 4*points_distance[idx] * sin(deg_to_rad(points_angle[idx])) + 400
line.add_point(Vector2(x, y))
+1
View File
@@ -0,0 +1 @@
uid://cei6fgt3rsc2c
+13
View File
@@ -0,0 +1,13 @@
[gd_scene format=3 uid="uid://ch0lyqkkxaem"]
[ext_resource type="Script" uid="uid://cei6fgt3rsc2c" path="res://views/2d/test_lidar.gd" id="1_8h8gx"]
[node name="TestLidar" type="Node2D" unique_id=948964638]
script = ExtResource("1_8h8gx")
[node name="Camera2D" type="Camera2D" parent="." unique_id=60160156]
position = Vector2(400, 400)
[node name="Line2D" type="Line2D" parent="." unique_id=1424623383]
closed = true
width = 1.0
@@ -7,6 +7,16 @@
script = ExtResource("1_hqf45") script = ExtResource("1_hqf45")
metadata/_custom_type_script = "uid://cr4oydwvmm28y" metadata/_custom_type_script = "uid://cr4oydwvmm28y"
[node name="Label" type="Label" parent="." unique_id=749031600]
custom_minimum_size = Vector2(200, 0)
offset_left = -100.0
offset_top = 90.0
offset_right = 100.0
offset_bottom = 178.0
theme_override_font_sizes/font_size = 64
text = "10.0 g"
horizontal_alignment = 1
[node name="Panel" type="Panel" parent="." unique_id=1154284634] [node name="Panel" type="Panel" parent="." unique_id=1154284634]
visible = false visible = false
offset_left = -103.0 offset_left = -103.0
@@ -32,17 +42,13 @@ default_color = Color(0, 1, 0, 1)
begin_cap_mode = 2 begin_cap_mode = 2
end_cap_mode = 2 end_cap_mode = 2
[node name="Label" type="Label" parent="." unique_id=749031600]
offset_right = 40.0
offset_bottom = 23.0
[node name="MovableControl" type="Control" parent="." unique_id=345939378 node_paths=PackedStringArray("move_target")] [node name="MovableControl" type="Control" parent="." unique_id=345939378 node_paths=PackedStringArray("move_target")]
layout_mode = 3 layout_mode = 3
anchors_preset = 0 anchors_preset = 0
offset_left = -103.0 offset_left = -103.0
offset_top = -103.0 offset_top = -103.0
offset_right = 106.0 offset_right = 106.0
offset_bottom = 106.0 offset_bottom = 183.0
mouse_filter = 1 mouse_filter = 1
script = ExtResource("2_pog3i") script = ExtResource("2_pog3i")
move_target = NodePath("..") move_target = NodePath("..")
@@ -24,8 +24,9 @@ func _update_data():
return return
var lateral_gs = host_vehicle.lateral_accel var lateral_gs = host_vehicle.lateral_accel
var accel_g = lateral_gs.length() / Constants.g var accel_g = lateral_gs.length() / Constants.g
var x_vec = Vector2(lateral_gs.x, 0) var end_point = Vector2(lateral_gs.y, -lateral_gs.x)
accel_vector.points = [origin, lateral_gs * 4] var forward = Vector2(0, -lateral_gs.x)
x_vector.points = [origin, x_vec * 4] accel_vector.points = [origin, end_point * 4]
y_vector.points = [x_vec * 4, lateral_gs * 4] x_vector.points = [forward * 4, end_point * 4]
y_vector.points = [origin, forward * 4]
label.text = str(round(accel_g*10)/10) + ' g' label.text = str(round(accel_g*10)/10) + ' g'
+5 -5
View File
@@ -8,21 +8,21 @@ script = ExtResource("1_hmdxp")
metadata/_custom_type_script = "uid://b3rfje1auw6to" metadata/_custom_type_script = "uid://b3rfje1auw6to"
[node name="Panel" type="Panel" parent="." unique_id=1393400967] [node name="Panel" type="Panel" parent="." unique_id=1393400967]
offset_right = 460.0 offset_right = 300.0
offset_bottom = 120.0 offset_bottom = 120.0
[node name="Label" type="Label" parent="." unique_id=1070194714] [node name="Label" type="Label" parent="." unique_id=1070194714]
offset_right = 460.0 offset_right = 300.0
offset_bottom = 120.0 offset_bottom = 120.0
theme_override_font_sizes/font_size = 80 theme_override_font_sizes/font_size = 64
text = "Alt: 99999 ft" text = "99999 ft"
horizontal_alignment = 1 horizontal_alignment = 1
vertical_alignment = 1 vertical_alignment = 1
[node name="MovableControl" type="Control" parent="." unique_id=1186292353 node_paths=PackedStringArray("move_target")] [node name="MovableControl" type="Control" parent="." unique_id=1186292353 node_paths=PackedStringArray("move_target")]
layout_mode = 3 layout_mode = 3
anchors_preset = 0 anchors_preset = 0
offset_right = 460.0 offset_right = 300.0
offset_bottom = 120.0 offset_bottom = 120.0
mouse_filter = 1 mouse_filter = 1
script = ExtResource("2_34sps") script = ExtResource("2_34sps")
@@ -14,4 +14,4 @@ func _ready() -> void:
func _update_data(): func _update_data():
if label_node == null: if label_node == null:
return return
label_node.text = 'Alt: ' + str(int(round(host_vehicle.altitude_m * Constants.M2FT))) + ' ft' label_node.text = str(int(round(host_vehicle.altitude_m * Constants.M2FT))) + ' ft'
+3
View File
@@ -0,0 +1,3 @@
[gd_scene format=3 uid="uid://dhxuhkb8inhqa"]
[node name="Lidar2d" type="Node3D" unique_id=679038150]
+1 -1
View File
@@ -26,7 +26,7 @@ offset_left = -50.0
offset_top = -22.0 offset_top = -22.0
offset_right = 50.0 offset_right = 50.0
offset_bottom = 23.0 offset_bottom = 23.0
theme_override_font_sizes/font_size = 32 theme_override_font_sizes/font_size = 48
horizontal_alignment = 1 horizontal_alignment = 1
[node name="Line2D" type="Line2D" parent="." unique_id=1285997474] [node name="Line2D" type="Line2D" parent="." unique_id=1285997474]
+1 -1
View File
@@ -26,7 +26,7 @@ offset_left = -50.0
offset_top = -22.0 offset_top = -22.0
offset_right = 50.0 offset_right = 50.0
offset_bottom = 23.0 offset_bottom = 23.0
theme_override_font_sizes/font_size = 32 theme_override_font_sizes/font_size = 48
horizontal_alignment = 1 horizontal_alignment = 1
[node name="Line2D" type="Line2D" parent="." unique_id=1446923009] [node name="Line2D" type="Line2D" parent="." unique_id=1446923009]
@@ -16,4 +16,4 @@ func _update_data():
if sprite == null or label == null: if sprite == null or label == null:
return return
sprite.rotation = host_vehicle.pitch_rad sprite.rotation = host_vehicle.pitch_rad
label.text = str(round(rad_to_deg(host_vehicle.pitch_rad)*10)/10) + " \u00B0" label.text = str(int(rad_to_deg(host_vehicle.pitch_rad))) + " \u00B0"
+1 -1
View File
@@ -15,4 +15,4 @@ func _update_data():
if sprite == null or label == null: if sprite == null or label == null:
return return
sprite.rotation = host_vehicle.roll_rad sprite.rotation = host_vehicle.roll_rad
label.text = str(abs(round(rad_to_deg(host_vehicle.roll_rad)*10)/10)) + " \u00B0" label.text = str(abs(int(rad_to_deg(host_vehicle.roll_rad)))) + " \u00B0"
+1 -1
View File
@@ -14,7 +14,7 @@ offset_bottom = 40.0
[node name="SpeedLabel" type="Label" parent="VBoxContainer" unique_id=2101712075] [node name="SpeedLabel" type="Label" parent="VBoxContainer" unique_id=2101712075]
custom_minimum_size = Vector2(150, 0) custom_minimum_size = Vector2(150, 0)
layout_mode = 2 layout_mode = 2
theme_override_font_sizes/font_size = 80 theme_override_font_sizes/font_size = 64
text = "10" text = "10"
horizontal_alignment = 1 horizontal_alignment = 1