From 7919bb1ae52ecfde0c4a51d53c828a8cf8235cf8 Mon Sep 17 00:00:00 2001 From: Hayrapetyan Grant Sergeevich Date: Sun, 19 Apr 2026 13:39:13 +0300 Subject: [PATCH] first commit --- .DS_Store | Bin 0 -> 10244 bytes README.md | 0 imu_module/README.md | 0 imu_module/imu.csv | 0 imu_module/imu_reader.py | 68 +++++++++++++++++++++++++++ lidar_module/README.md | 0 lidar_module/lidar.csv | 0 lidar_module/lidar_reader.py | 87 +++++++++++++++++++++++++++++++++++ processing/README.md | 0 processing/calculations.cpp | 0 processing/visualization.py | 0 run.sh | 0 12 files changed, 155 insertions(+) create mode 100644 .DS_Store create mode 100644 README.md create mode 100644 imu_module/README.md create mode 100644 imu_module/imu.csv create mode 100644 imu_module/imu_reader.py create mode 100644 lidar_module/README.md create mode 100644 lidar_module/lidar.csv create mode 100644 lidar_module/lidar_reader.py create mode 100644 processing/README.md create mode 100644 processing/calculations.cpp create mode 100644 processing/visualization.py create mode 100644 run.sh diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d6ed273897ccbed7b7e7ed4f7f97ff6fe522c51f GIT binary patch literal 10244 zcmeHN&2JM&6n_)avQ9$TKtd@3X;ljei3mbKCGH zFmMs^YJrHe5bcjKeIgUF*9kHOXrBImzQRYDO%0x#fM6Ql@j#LLyP-t4ifMKAQ0TH{8 zL5Pui1InH8`(niXO2jKTjxHtLYUXcQ}xV|Wb~ttk6K5q zack49@ur)3StBia$s=*K%6U|2%UDetyQ8yE?x+UzKZ0j0iY3;k_Y=78x`*gXn@rh%f9JeP=oSdARoSvRO_37!)&YU@0wog_( z|4B6wyI$ZCPl{24u7y5lZupF@W%RpD2xa?3m);5uzB%YxeHx?A)Io=w>s~@BdsI!r zU}T;DD=JIQT2-J^Lnflt#^a;>bz9aAA0NA`JeV) z{`Tt5VBO$f>&CUt^=+|@zWdyE6Bcn+#c^@Q2~56)n1u5n`6q{lBI;i1aOi<{L*mo} z&u1KacpZD-P49A=F^JJ!IQW>iPVp}U2GtMWfUwu)Fnw)?#98{D%{a>NI!fOg-sL1Y zSb@9v4lco0h?nroV(_7hke|C;1TRf73>XFs1BQXa$G{P_B}e4{?+*U`|L|?x?8q=+ z82HZ^AfqL>B=Q0697*@gBG>L<{T8bzLa(JznqVVTM88bO;qFCYlL bmO_-U{Qo}&bo`@|32TNotTFNbzzq0%nfrnQ literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/imu_module/README.md b/imu_module/README.md new file mode 100644 index 0000000..e69de29 diff --git a/imu_module/imu.csv b/imu_module/imu.csv new file mode 100644 index 0000000..e69de29 diff --git a/imu_module/imu_reader.py b/imu_module/imu_reader.py new file mode 100644 index 0000000..f3ee1d1 --- /dev/null +++ b/imu_module/imu_reader.py @@ -0,0 +1,68 @@ +import smbus2 #библиотека Python для работы с I2C шиной +import time +import csv +import struct + +# Константы +MPU_ADDRESS = 0x68 +I2C_BUS = 1 + +# Регистры MPU-9250 +PWR_MGMT_1 = 0x6B # управление питанием +ACCEL_XOUT_H = 0x3B # начало данных акселерометра +GYRO_XOUT_H = 0x43 # начало данных гироскопа + +# Масштабные коэффициенты (диапазон ±2g и ±250°/с) +ACCEL_SCALE = 16384.0 # LSB/g +GYRO_SCALE = 131.0 # LSB/(°/с) + +def init_mpu(bus): + """Разбудить датчик""" + bus.write_byte_data(MPU_ADDRESS, PWR_MGMT_1, 0x00) + time.sleep(0.1) + +def read_raw(bus, reg): + """Читать 16-битное значение из двух регистров""" + high = bus.read_byte_data(MPU_ADDRESS, reg) + low = bus.read_byte_data(MPU_ADDRESS, reg + 1) + value = (high << 8) | low + # Перевод в знаковое число + if value > 32767: + value -= 65536 + return value + +def read_imu(bus): + """Читать и вернуть данные акселерометра и гироскопа""" + ax = read_raw(bus, ACCEL_XOUT_H) / ACCEL_SCALE + ay = read_raw(bus, ACCEL_XOUT_H + 2) / ACCEL_SCALE + az = read_raw(bus, ACCEL_XOUT_H + 4) / ACCEL_SCALE + + gx = read_raw(bus, GYRO_XOUT_H) / GYRO_SCALE + gy = read_raw(bus, GYRO_XOUT_H + 2) / GYRO_SCALE + gz = read_raw(bus, GYRO_XOUT_H + 4) / GYRO_SCALE + + return ax, ay, az, gx, gy, gz + +def save_to_csv(filename, duration_seconds): + """Записать данные в CSV файл""" + bus = smbus2.SMBus(I2C_BUS) + init_mpu(bus) + + with open(filename, 'w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['timestamp', 'ax', 'ay', 'az', 'gx', 'gy', 'gz']) + + t = 0.0 + while t < duration_seconds: + ax, ay, az, gx, gy, gz = read_imu(bus) + writer.writerow([round(t, 3), + round(ax, 4), round(ay, 4), round(az, 4), + round(gx, 4), round(gy, 4), round(gz, 4)]) + t += 0.01 + time.sleep(0.01) + + bus.close() + +# Запуск — записываем 5 секунд +save_to_csv('imu.csv', 5) +print("Готово!") \ No newline at end of file diff --git a/lidar_module/README.md b/lidar_module/README.md new file mode 100644 index 0000000..e69de29 diff --git a/lidar_module/lidar.csv b/lidar_module/lidar.csv new file mode 100644 index 0000000..e69de29 diff --git a/lidar_module/lidar_reader.py b/lidar_module/lidar_reader.py new file mode 100644 index 0000000..e7c4f81 --- /dev/null +++ b/lidar_module/lidar_reader.py @@ -0,0 +1,87 @@ +import serial +import csv +import time +import struct + +# Константы +SERIAL_PORT = '/dev/ttyS0' # UART порт на MangoPi +BAUD_RATE = 230400 # скорость передачи LDS02RR +DURATION = 5 # секунд записи + +# Заголовок пакета LDS02RR +HEADER = 0xFA +PACKET_SIZE = 22 # размер пакета в байтах + +def parse_packet(data): + """Парсить один пакет данных лидара""" + if len(data) < PACKET_SIZE: + return None + + if data[0] != HEADER: + return None + + # Индекс угла (0xA0 = 0°, 0xF9 = 359°) + index = data[1] - 0xA0 + if index < 0 or index > 89: + return None + + # Скорость вращения + speed = struct.unpack_from('> 8 + + distance = distance_raw / 4.0 # в мм + angle = index * 4 + i # угол в градусах + + points.append((angle, distance, quality)) + + return points + +def save_to_csv(filename, duration_seconds): + """Читать данные лидара и записывать в CSV""" + try: + ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1) + print(f"Подключено к {SERIAL_PORT}") + except Exception as e: + print(f"Ошибка подключения: {e}") + return + + with open(filename, 'w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['timestamp', 'angle', 'distance_mm', 'quality']) + + start_time = time.time() + buffer = bytearray() + + while time.time() - start_time < duration_seconds: + data = ser.read(PACKET_SIZE) + if not data: + continue + + buffer.extend(data) + + # Ищем заголовок пакета + while len(buffer) >= PACKET_SIZE: + if buffer[0] == HEADER: + packet = bytes(buffer[:PACKET_SIZE]) + points = parse_packet(packet) + + if points: + t = round(time.time() - start_time, 3) + for angle, distance, quality in points: + writer.writerow([t, angle, + round(distance, 1), + quality]) + buffer = buffer[PACKET_SIZE:] + else: + buffer.pop(0) + + ser.close() + print("Готово!") + +# Запуск +save_to_csv('lidar.csv', DURATION) \ No newline at end of file diff --git a/processing/README.md b/processing/README.md new file mode 100644 index 0000000..e69de29 diff --git a/processing/calculations.cpp b/processing/calculations.cpp new file mode 100644 index 0000000..e69de29 diff --git a/processing/visualization.py b/processing/visualization.py new file mode 100644 index 0000000..e69de29 diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..e69de29