Compare commits
3 Commits
11f47e89c4
...
9c36b7d1db
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c36b7d1db | ||
|
|
ff1ecfc5c4 | ||
|
|
7919bb1ae5 |
0
imu_module/README.md
Normal file
0
imu_module/README.md
Normal file
0
imu_module/imu.csv
Normal file
0
imu_module/imu.csv
Normal file
|
|
68
imu_module/imu_reader.py
Normal file
68
imu_module/imu_reader.py
Normal file
|
|
@ -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("Готово!")
|
||||||
0
lidar_module/README.md
Normal file
0
lidar_module/README.md
Normal file
0
lidar_module/lidar.csv
Normal file
0
lidar_module/lidar.csv
Normal file
|
|
87
lidar_module/lidar_reader.py
Normal file
87
lidar_module/lidar_reader.py
Normal file
|
|
@ -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('<H', data, 2)[0] / 64.0
|
||||||
|
|
||||||
|
points = []
|
||||||
|
for i in range(4):
|
||||||
|
offset = 4 + i * 4
|
||||||
|
distance_raw = struct.unpack_from('<H', data, offset)[0]
|
||||||
|
quality = struct.unpack_from('<H', data, offset + 2)[0] >> 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)
|
||||||
0
processing/README.md
Normal file
0
processing/README.md
Normal file
0
processing/calculations.cpp
Normal file
0
processing/calculations.cpp
Normal file
0
processing/visualization.py
Normal file
0
processing/visualization.py
Normal file
22
run.sh
Normal file
22
run.sh
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash
|
||||||
|
echo "Запуск системы..."
|
||||||
|
|
||||||
|
# Запуск модуля акселерометра
|
||||||
|
echo "Запуск IMU модуля..."
|
||||||
|
python3 imu_module/imu_reader.py &
|
||||||
|
|
||||||
|
# Запуск модуля лидара
|
||||||
|
echo "Запуск лидар модуля..."
|
||||||
|
python3 lidar_module/lidar_reader.py &
|
||||||
|
|
||||||
|
# Ждём пока данные запишутся
|
||||||
|
wait
|
||||||
|
|
||||||
|
# Компиляция и запуск расчётов
|
||||||
|
echo "Запуск расчётов..."
|
||||||
|
g++ processing/calculations.cpp -o processing/calculations
|
||||||
|
./processing/calculations
|
||||||
|
|
||||||
|
# Запуск визуализации
|
||||||
|
echo "Запуск визуализации..."
|
||||||
|
python3 processing/visualization.py
|
||||||
Loading…
Reference in New Issue
Block a user