From 592e0bb99bc37da671fbffb2fc87bdd0b6ca361a Mon Sep 17 00:00:00 2001 From: varnashova88 Date: Sun, 19 Apr 2026 17:11:59 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20processing/visualization.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- processing/visualization.py | 104 ++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/processing/visualization.py b/processing/visualization.py index e69de29..3f24961 100644 --- a/processing/visualization.py +++ b/processing/visualization.py @@ -0,0 +1,104 @@ +import open3d as o3d +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import os +from datetime import datetime + +# СОЗДАНИЕ УНИКАЛЬНОЙ ПАПКИ + +timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") +output_dir = f"results/run_{timestamp}" +frames_dir = os.path.join(output_dir, "frames") + +os.makedirs(frames_dir, exist_ok=True) + +# ЗАГРУЗКА ДАННЫХ + +traj = pd.read_csv("trajectory.csv") +lidar = pd.read_csv("lidar_points.csv") + +trajectory = traj[['x', 'y', 'z']].values +angles = traj[['roll', 'pitch', 'yaw']].values +lidar_points = lidar[['x', 'y', 'z']].values + +# СОХРАНЕНИЕ 2D ГРАФИКОВ + +plt.figure() +plt.plot(trajectory[:,0], trajectory[:,1]) +plt.title("Trajectory (X-Y)") +plt.xlabel("X") +plt.ylabel("Y") +plt.grid() +plt.savefig(os.path.join(output_dir, "trajectory_plot.png")) +plt.close() + +# OPEN3D + +pcd = o3d.geometry.PointCloud() +pcd.points = o3d.utility.Vector3dVector(lidar_points) + +lines = [[i, i+1] for i in range(len(trajectory)-1)] +line_set = o3d.geometry.LineSet() +line_set.points = o3d.utility.Vector3dVector(trajectory) +line_set.lines = o3d.utility.Vector2iVector(lines) + +vis = o3d.visualization.Visualizer() +vis.create_window(visible=False) # важно для сохранения кадров + +vis.add_geometry(pcd) +vis.add_geometry(line_set) + +# ПОВОРОТ + +def get_rotation_matrix(roll, pitch, yaw): + Rx = np.array([ + [1, 0, 0], + [0, np.cos(roll), -np.sin(roll)], + [0, np.sin(roll), np.cos(roll)] + ]) + Ry = np.array([ + [np.cos(pitch), 0, np.sin(pitch)], + [0, 1, 0], + [-np.sin(pitch), 0, np.cos(pitch)] + ]) + Rz = np.array([ + [np.cos(yaw), -np.sin(yaw), 0], + [np.sin(yaw), np.cos(yaw), 0], + [0, 0, 1] + ]) + return Rz @ Ry @ Rx + +# СОХРАНЕНИЕ КАДРОВ + +for i in range(len(trajectory)): + + frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=0.2) + + pos = trajectory[i] + roll, pitch, yaw = angles[i] + + R = get_rotation_matrix(roll, pitch, yaw) + + frame.rotate(R, center=(0,0,0)) + frame.translate(pos) + + vis.clear_geometries() + vis.add_geometry(pcd) + vis.add_geometry(line_set) + vis.add_geometry(frame) + + vis.poll_events() + vis.update_renderer() + + # сохраняем изображение + img_path = os.path.join(frames_dir, f"frame_{i:04d}.png") + vis.capture_screen_image(img_path) + +# СОХРАНЕНИЕ ФИНАЛЬНОГО ВИДА + +vis.capture_screen_image(os.path.join(output_dir, "3d_view.png")) + +vis.destroy_window() + +print(f"Результаты сохранены в: {output_dir}")