[English Description Below] | [Türkçe Açıklama Aşağıdadır]
This project is an embedded system solution that performs real-time Edge Computing on Slamtec RPLIDAR C1 point cloud data using an STM32 microcontroller. Instead of processing raw data on the PC, the STM32 handles parsing, filtering, and repackaging, transmitting only relevant data via a high-speed UART interface to a PC dashboard.
This architecture reduces bandwidth usage and offloads the processing burden from the host computer.
The system consists of three main layers:
- Acquisition Layer: RPLIDAR C1 scans 360 degrees and streams data to STM32 via UART.
- Embedded Processing Layer: STM32 receives data using DMA (Direct Memory Access) into a circular buffer. A State Machine algorithm parses the packets, applies angle/distance filters, and encapsulates the data into a custom protocol.
- Visualization Layer: A Python-based GUI receives the optimized packets via USB-TTL, renders a PPI (Plan Position Indicator) Radar Scope, and logs data to CSV files.
graph LR
A[RPLIDAR C1] -->|UART 460800 Baud| B(STM32 DMA Buffer)
B -->|Parsing & Filtering| C{STM32 CPU}
C -->|Custom Protocol| D[USB-TTL Converter]
D -->|USB| E[PC / Python GUI]
- Hardware: STM32 Series (e.g., STM32F103/F407)
- Communication: Dual UART Channels + DMA (Ring Buffer Management)
- Baud Rate: 460800 bps (High Speed)
- Algorithm:
- State Machine: IDLE, WAITING_DESCRIPTOR, RECEIVING_SCAN
- Filtering: Hardware/Software floating-point windowing for Angle and Distance.
- Error Handling: Checksum and Sync Bit verification.
- Language: Python 3.x
- Libraries: PySerial (IO), OpenCV (Rendering), Pandas (Logging), NumPy (Math).
- Architecture: Multi-threaded design (Separate threads for Serial I/O and GUI rendering using thread-safe queues).
1. Output Protocol (STM32 -> PC)
To ensure data integrity and simplify parsing on the PC side, STM32 transmits a fixed-length 6-Byte packet:
| Byte Index | Content | Description |
|---|---|---|
| 0 | 0xAA | Header |
| 1 | Angle_L | Angle Low Byte |
| 2 | Angle_H | Angle High Byte (Val >> 1) / 64.0 = Degree |
| 3 | Dist_L | Distance Low Byte |
| 4 | Dist_H | Distance High Byte Val / 4.0 = mm |
| 5 | 0xBB | Footer |
Hardware Connections:
- Lidar TX -> STM32 RX (PA10)
- Lidar RX -> STM32 TX (PA9)
- STM32 TX (PA2) -> USB-TTL RX
- STM32 RX (PA3) -> USB-TTL TX
Python GUI Controls:
- R: Start Recording (Default 20s).
- T: Stop Recording & Save to CSV (Raw & Average Data).
- S / X: Start/Stop Lidar Motor.
- Q / ESC: Quit.
Bu proje, Slamtec RPLIDAR C1 sensöründen gelen yüksek frekanslı nokta bulutu verilerinin (Point Cloud) STM32 mikrodenetleyicisi üzerinde gerçek zamanlı olarak işlenmesi (Edge Computing), filtrelenmesi ve yüksek hızlı UART hattı üzerinden PC arayüzüne aktarılmasını sağlayan gömülü sistem çözümüdür.
Proje, ham veriyi PC tarafında işlemek yerine mikrodenetleyici tarafında süzerek bant genişliği optimizasyonu sağlar ve sadece anlamlı veriyi (belirlenen ROI - Region of Interest) iletir.
Sistem üç ana katmandan oluşmaktadır:
- Veri Toplama Katmanı (Acquisition): RPLIDAR C1, 360 derece lazer tarama yapar ve verileri UART üzerinden STM32'ye gönderir.
- Gömülü İşleme Katmanı (Processing): STM32, DMA (Direct Memory Access) kullanarak verileri CPU'yu yormadan belleğe alır. State Machine tabanlı bir algoritma ile paketleri ayıklar (parsing), açı/mesafe filtrelemesi yapar ve veriyi yeniden paketler.
- Görselleştirme Katmanı (Visualization): Python tabanlı arayüz, USB-TTL dönüştürücü üzerinden gelen optimize edilmiş paketleri çözer, Radar ekranı (PPI Scope) oluşturur ve CSV formatında kayıt alır.
- Donanım: STM32 Serisi (Örn: STM32F103/F407)
- Haberleşme: Çift UART Kanalı + DMA
- Baud Rate: 460800 bps (Yüksek Hız)
- Algoritma:
- State Machine: IDLE, WAITING_DESCRIPTOR, RECEIVING_SCAN
- Filtreleme: Donanımsal veya yazılımsal işlemler ile açı ve mesafe pencereleme.
- Hata Yönetimi: Checksum ve Sync Bit kontrolü.
- Dil: Python 3.x
- Kütüphaneler: PySerial (IO), OpenCV (Render), Pandas (Data Logging), NumPy (Math).
- Mimari: Multi-threaded yapı. (Seri port okuma ve GUI çizimi ayrı thread'lerde çalışır, thread-safe queue yapısı kullanılır.)
Çıkış Protokolü (STM32 -> PC)
STM32, Lidar verisini işledikten sonra veri bütünlüğünü sağlamak ve parsing işlemini kolaylaştırmak için 6 Byte'lık sabit uzunluklu özel bir paket yapısı kullanır:
| Byte Index | İçerik | Açıklama |
|---|---|---|
| 0 | 0xAA | Header (Başlangıç) |
| 1 | Angle_L | Açı Değeri (Düşük Byte) |
| 2 | Angle_H | Açı Değeri (Yüksek Byte) (Val >> 1) / 64.0 = Derece |
| 3 | Dist_L | Mesafe Değeri (Düşük Byte) |
| 4 | Dist_H | Mesafe Değeri (Yüksek Byte) Val / 4.0 = mm |
| 5 | 0xBB | Footer (Bitiş) |
1. Donanım Bağlantısı
- Lidar TX -> STM32 RX (PA10)
- Lidar RX -> STM32 TX (PA9)
- STM32 TX (PA2) -> USB-TTL Dönüştürücü RX
- STM32 RX (PA3) -> USB-TTL Dönüştürücü TX
- GND -> USB-TTL GND (Topraklar birleştirilmelidir)
2. Python Arayüzü Kullanımı
Gerekli kütüphaneleri yükleyin:
pip install pyserial opencv-python pandas numpy
Scripti çalıştırın:
python telemetry_lidar_stm32.py
Klavye Kısayolları (GUI):
- R: Veri kaydını başlatır (Recording).
- T: Kaydı bitirir ve .csv dosyalarını oluşturur (Raw Data & Average Data).
- S / X: Lidar motorunu başlatır/durdurur (Seri komut gönderir).
- Q / ESC: Çıkış.