|

Załącznik

Załącznik A: Zaawansowane Opcje Deployment Tool

Ten dokument jest przeznaczony dla "Power Users" – inżynierów i hobbystów budujących niestandardowe rozwiązania, drony lub systemy oparte na precyzyjnym pozycjonowaniu RTK.

$$!CAUTION$$

Jeśli budujesz standardowe auto RCSIM (Tiers 1-5), nie musisz zmieniać tych ustawień. Błędna konfiguracja poniższych pól może odciąć Cię od drona lub spowodować niestabilność systemu.

1. NTRIP (Networked Transport of RTK via Internet Protocol)

Jeśli Twoje auto posiada moduł GPS obsługujący technologię RTK (np. Waveshare LC29H), możesz osiągnąć dokładność pozycjonowania do 1 centymetra.

  • NTRIP Caster / Port / User / Pass: Dane do serwisu poprawek (np. ASG-EUPOS). Deployment Tool prześle te dane do modułu GPS, aby mógł on skorygować błąd satelitarny na żywo.

  • Mountpoint: Wybór konkretnej stacji bazowej wysyłającej poprawki.

2. MAVLink Settings (Protokół Komunikacyjny)

RCSIM ma strategię komunikacji MAVLink RF oraz konfigurację pól RF/MAVLink w RCConfig, co pozwala integrować link radiowy z ekosystemem MAVLink. Nie oznacza to automatycznej zgodności z każdym kontrolerem lotu bez osobnej konfiguracji i testów.

  • MAVLink SysID: unikalny identyfikator pojazdu w sieci MAVLink/RF. W modelu konfiguracji GCS pole rf_link_sysid ma domyślnie wartość 10; jeżeli używasz wielu pojazdów, nadaj każdemu inny identyfikator.

  • Component ID: Identyfikator konkretnego modułu wewnątrz auta (zazwyczaj zostawiamy 1).

3. Baudrate (Prędkość Portów)

Czujniki takie jak LiDAR czy GPS rozmawiają z Raspberry Pi przez porty szeregowe (UART).

  • Baudrate: Określa prędkość tej rozmowy. Domyślnie dla większości GPS-ów to 9600 lub 115200. Zmiana tej wartości bez zmiany ustawień fizycznego czujnika spowoduje "bełkot" danych.

4. SSH Key Management

Dla wygody i bezpieczeństwa, możesz logować się do auta bez wpisywania hasła.

  • Użyj klucza SSH: Deployment Tool może wgrać Twój klucz publiczny (id_rsa.pub) do Raspberry Pi. Dzięki temu połączenie będzie szybsze i bardziej odporne na ataki typu "brute force".

5. Edycja config.txt i cmdline.txt

Z poziomu Deployment Tool możesz bezpośrednio edytować pliki systemowe Raspberry Pi.

  • Jest to niezbędne np. do włączania dodatkowych magistral (UART3, UART4) potrzebnych do komunikacji z radiem ELRS (Tier 4).

🛠️ Załącznik B: Developer Guide (Integracja i API)

Ten dokument jest przeznaczony dla programistów i hakerów, którzy chcą rozszerzyć możliwości RCSIM, napisać własne mostki (np. do ROS2, Grafany) lub zautomatyzować analizę danych.

$$!NOTE$$

Jeśli szukasz informacji o tym, jak napisać własny sterownik dla nowego czujnika I2C i zintegrować go ze Steam Workshop, sprawdź: Załącznik B: Community Drivers & Workshop.

📡 1. Porty Sieciowe (Network Map)

RCSIM korzysta z następujących portów UDP/TCP:

Port Protokół Kierunek Opis
12346 UDP GCS -> Auto Główny kanał sterowania (Control Packets).
12347 UDP Auto -> GCS Główny kanał telemetrii (JSON Status).
8000 UDP GCS -> Local Telemetria fizyki w standardzie Forza Horizon (SimHub).
8080 TCP Auto <-> GCS Sygnalizacja WebRTC (Signaling / SDP).
8889 UDP/TCP Auto -> GCS Strumień wideo WebRTC (WHEP).
22 TCP PC -> Auto Zarządzanie przez SSH i transfer plików.

📦 2. Format Pakietu Sterującego (Raw Control)

Jeśli chcesz napisać własny kontroler, musisz wysyłać na port 12346 pakiety o stałej długości 43 bajtów w formacie binarnym:

Offset Typ Rozmiar Zawartość
0 char[2] 2B Nagłówek statyczny: 0x43, 0x54 (b"CT").
2 uint16[16] 32B 16 kanałów PWM (wartości 1000-2000).
34 double 8B Timestamp (Unix Time) dla synchronizacji.
42 uint8 1B Suma kontrolna (XOR wszystkich poprzednich bajtów).

📊 3. Telemetria i Dane AI (JSON)

Auto wysyła na port 12347 pakiety w formacie JSON. Przykładowa struktura:

{

"imu": {"ax": 0.01, "ay": -0.05, "az": 9.81},

"orientation": {"pitch": 1.2, "roll": 0.5, "yaw": 185.0},

"battery": {"voltage": 12.4, "current": 1.5},

"ai_status": {"mode": "MANUAL", "inference_ms": 12.0},

"channels": [1500, 1500, 1000, ...]

}

Tip: Najprostszym sposobem na mostek do ROS2 jest skrypt w Pythonie nasłuchujący na tym porcie i publikujący dane do odpowiednich Topiców.

📂 4. Struktura Plików na Raspberry Pi

Domyślna ścieżka instalacji to ~/rcsim/. Kluczowe lokalizacje:

  • ~/rcsim/config/rc_config.json: Główny plik konfiguracyjny auta.

  • ~/rcsim/models/: Katalog na skompilowane modele AI (.hef, .onnx).

  • ~/rcsim/data/: Surowe dane z sesji logowania (zdjęcia + JSONy).

  • ~/rcsim/logs/: Logi systemowe z procesów w tle.

🔧 5. Automatyzacja (Headless Mode)

Możesz uruchomić GCS w trybie bez interfejsu graficznego (np. na serwerze do zbierania logów), wywołując: python main.py --headless W tym trybie aplikacja będzie jedynie logować telemetrię do bazy danych lub plików CSV, bez renderowania okien.

Załącznik B: Developer Guide & Community Drivers 🛠️

Witaj w przewodniku dla deweloperów i zaawansowanych użytkowników RCSIM. Ten dokument wyjaśnia, jak rozszerzyć system o wsparcie dla własnego sprzętu (czujników) oraz jak zintegrować własne skrypty z architekturą pojazdu.

1. Architektura "Plug & Play" (Adapter Pattern)

System RCSIM na Raspberry Pi wykorzystuje wzorzec Registry Pattern. Oznacza to, że nie musisz modyfikować głównego kodu serwisu, aby dodać nowy czujnik. Wystarczy, że umieścisz swój skrypt w folderze workshop/, a system automatycznie:

  • Wykryje nowy plik .py.

  • Załaduje klasę sterownika.

  • Przeprowadzi autodetekcję na magistrali I2C/UART.

  • Zacznie przesyłać dane do GCS (stacji naziemnej).

2. Szablon Sterownika (Driver Template)

Każdy sterownik IMU musi dziedziczyć po klasie bazowej IMUBase i rejestrować się za pomocą dekoratora @SensorRegistry.register.

Przykład: workshop/custom_imu_driver.py

from modules.drivers.base_sensor import IMUBase

from modules.drivers.sensor_registry import SensorRegistry

import logging

logger = logging.getLogger(name)

@SensorRegistry.register

class MyCustomIMU(IMUBase):

Unikalna nazwa widoczna w GCS

DRIVER_NAME = "custom_sensor_v1"

Adresy I2C, pod którymi sensor może się znajdować

I2C_ADDRESSES = [0x68, 0x69]

Priorytet (im niższy, tym szybciej system spróbuje tego drivera)

PRIORITY = 50

def init(self, i2c_wrapper):

self.i2c = i2c_wrapper

Tutaj dodaj inicjalizację sprzętu (rejestry, itp.)

logger.info("Initializing MyCustomIMU")

def read_data(self):

"""

Zwraca słownik z danymi w standardzie RCSIM.

GCS automatycznie mapuje te klucze na wskaźniki w kokpicie.

"""

return {

"ax": 0.0, "ay": 0.0, "az": 9.81, # Akcelerometr (m/s^2)

"gx": 0.0, "gy": 0.0, "gz": 0.0, # Żyroskop (rad/s)

"mx": 0.0, "my": 0.0, "mz": 0.0, # Magnetometr (uT)

"temp": 25.0 # Temperatura (Celsius)

}

def calibrate(self):

Opcjonalna logika kalibracji

return True

3. Standard Danych (JSON Telemetry)

Twoje dane z sensora są pakowane w pakiety telemetrii UDP/WebRTC. Standardowy format, którego oczekuje GCS, to:

Klucz Opis Jednostka
ax, ay, az Przyspieszenie liniowe m/s²
gx, gy, gz Prędkość kątowa rad/s
mx, my, mz Pole magnetyczne µT (mikrotesle)
temp Temperatura układu °C

Jeśli Twój sensor dostarcza inne dane (np. dystans z LiDARa), użyj formatu: {"lidar": [dystans_w_metrach, kat_w_stopniach]}.

4. Prompt Template dla AI (LLM) 🤖

Masz nowy czujnik, ale nie chcesz pisać kodu od zera? Skopiuj poniższy prompt do ChatGPT, Claude lub Gemini, dołączając dokumentację (PDF/Link) swojego sensora:

PROMPT: "Jesteś ekspertem systemów embedded i Python. Napisz sterownik dla sensora [NAZWA SENSORA] zgodny ze standardem RCSIM.

Wymagania techniczne:

  • Klasa musi dziedziczyć po IMUBase.

  • Musi posiadać dekorator @SensorRegistry.register.

  • Metoda read_data() musi zwracać słownik z kluczami: ax, ay, az, gx, gy, gz, mx, my, mz, temp.

  • Użyj i2c_wrapper.read_byte_data(addr, reg) do odczytu rejestrów.

  • Adres I2C to [ADRES, np. 0x76].

Oto fragment dokumentacji technicznej sensora: [WKLEJ TEKST LUB OPIS REJESTRÓW]"

5. Integracja ze Steam Workshop

  • Stwórz folder ze swoim sterownikiem.

  • Dodaj plik preview.png (miniatura w Workshop).

  • Dodaj krótki opis README.txt.

  • Użyj narzędzia RCSIM Workshop Uploader (dostępne w GCS -> Tools), aby opublikować swój mod.

Inni użytkownicy będą mogli subskrybować Twój sterownik jednym kliknięciem. GCS automatycznie prześle go do auta przy następnym połączeniu.

[!TIP] W folderze modules/drivers/workshop/ znajdziesz plik template_imu.py. To gotowy, działający przykład "Starter Kit", który możesz skopiować i zmodyfikować, aby stworzyć własny sterownik.

6. Custom OSD & HUD Workshop (GCS PC) 📺

RCSIM deklasuje sztywne systemy GCS, oddając w Twoje ręce "pędzel" w postaci biblioteki QPainter. Możesz stworzyć interfejsy wyglądające jak z bolidów F1, gier Cyberpunk czy myśliwców F-16.

Jak to działa?

Wystarczy, że stworzysz plik .py w folderze workshop/widgets/ i odziedziczysz po klasie OSDWidget. System automatycznie zaciągnie Twój wskaźnik do Edytora OSD przy następnym uruchomieniu.

Szablon Widgetu OSD

Oto baza, od której możesz zacząć. Użyj pełnej potęgi QPainter, aby rysować kształty, gradienty i animacje na podstawie telemetrii.

Własne wskaźniki należy umieszczać w folderze RCSIM_PC/pc_app/gui/osd/workshop/widgets/.

from gui.osd.widgets.base_widget import OSDWidget

from PySide6.QtGui import QPainter, QColor, QFont

from PySide6.QtCore import QRectF

class MyCustomGauge(OSDWidget):

def init(self):

super().init()

self.name = "Moja Tarcza" # Nazwa widoczna w edytorze

def draw(self, painter: QPainter, data: dict):

Pobierz dane z telemetrii

speed = data.get("position", {}).get("speed", 0.0)

Logika rysowania (Qt Painter)

painter.setPen(QColor(0, 255, 0))

painter.setFont(QFont("Arial", 20))

painter.drawText(QRectF(0, 0, 200, 50), 0, f"SPEED: {speed:.1f} m/s")

Prompt Template dla OSD AI 🤖

Chcesz stworzyć futurystyczny wskaźnik? Użyj tego promptu:

PROMPT: "Jesteś ekspertem GUI w PySide6/Qt. Napisz klasę widgetu OSD dla systemu RCSIM.

Wymagania:

  • Dziedziczenie po OSDWidget.

  • Implementacja metody draw(self, painter, data).

  • Widget ma wizualizować [OPIS WSKAŹNIKA, np. przeciążenia G w formie radaru].

  • Użyj kolorów neonowych (Cyberpunk style).

  • Dane wejściowe znajdują się w słowniku data (np. data['imu']['ax']).

Napisz czysty kod Python gotowy do wklejenia do folderu workshop."

[!IMPORTANT] Otwierając kod Raspberry Pi jako Open-Source, dajemy Ci pełną kontrolę nad Twoim autem. Pamiętaj jednak, że błędny kod sterownika może spowodować niestabilność systemu lub crash pojazdu. Zawsze testuj nowe sterowniki na podniesionym aucie (koła w powietrzu).

🧠 RCSIM AI Activation Guide

Oprogramowanie RCSIM w wersji produkcyjnej (Steam) nie zawiera pre-kompilowanych sterowników Hailo Dataflow Compiler (DFC) ani modeli zastrzeżonych, aby zachować zgodność z licencjami komercyjnymi.

Jeśli jesteś deweloperem lub zaawansowanym użytkownikiem i chcesz aktywować funkcje akceleracji AI na swoim sprzęcie, postępuj zgodnie z poniższą instrukcją.

1. Pobieranie Hailo Dataflow Compiler (DFC)

Ze względu na licencję EULA firmy Hailo, nie możemy redystrybuować narzędzi kompilatora.

  • Zarejestruj się bezpłatnie w Hailo Developer Zone.

  • Pobierz pakiet hailo_dataflow_compiler (plik .whl) dla swojej wersji Pythona (zalecany Python 3.10/3.11).

  • Skopiuj pobrany plik .whl do katalogu: RCSIM_PC/pc_app/deps/hailo/

2. Przygotowanie Modelu Jazdy (.hef)

RCSIM korzysta z modeli skompilowanych dla procesora Hailo-8.

  • Jeśli posiadasz własny model wytrenowany w formacie ONNX/Keras, użyj wbudowanego narzędzia AI Trainer w RCSIM, aby skompilować go do formatu .hef.

  • Wynikowy plik umieść w:

  • PC: RCSIM_PC/pc_app/models/rc_pilot.hef

  • RPi: RCSIMDEPLOY/rpi_project_source/models/rc_pilot.hef

3. Aktywacja w Interfejsie

Po umieszczeniu plików w odpowiednich folderach:

  • Zrestartuj aplikację RCSIM GCS.

  • Przejdź do zakładki AI.

  • Status powinien zmienić się z MOCK na HAILO.