İçeriğe geç
TREN
Atlıhan Harita

Lixel OpenAPI Kullanım Kılavuzu

Gerçek Zamanlı Veri

Bölüm 05 / 09Kılavuz sürümü v1.1.0Türkçe

Tarama sırasında cihaz, gerçek zamanlı nokta bulutunu ve pozu kendiliğinden raporlar. Ayrıca RTSP üzerinden kamera video akışı gönderir. Bu sayfada bunların nasıl alınacağı ve çözüleceği açıklanır.

Gerçek zamanlı nokta bulutu

Gerçek zamanlı nokta bulutu, lixel/application/report/lio_pcl konusunda MqttCompressMsg olarak raporlanır. Aktarım boyutunu azaltmak için nokta bulutu verisi sıkıştırılır.

message LioPclReport {
    message Point {
        sint64 x = 1;    // val = raw value * header.scaler
        sint64 y = 2;    // val = raw value * header.scaler
        sint64 z = 3;    // val = raw value * header.scaler
        uint32 rgbi = 4; // R + G + B + Intensity
    }
    Header header = 1;
    repeated Point points = 2; // point cloud data
}

message MqttCompressMsg {
    enum CompressionType {
        CompressionLz4 = 0;
        CompressionZstd = 1;
    }
    Header header = 1;
    CompressionType compression = 2; // compression type
    uint32 compressed_size = 3;      // size before compression (serialized LioPclReport size)
    bytes compressed_data = 4;       // compressed data (compressed serialized LioPclReport)
}

Çözme Adımları

MqttCompressMsg mesajı alındıktan sonra iki adımda açın ve çözün:

  1. MqttCompressMsg mesajını seri durumdan çıkarın ve compression (Lz4 / Zstd) ile compressed_data alanlarını alın.
  2. compressed_data verisini sıkıştırma türüne göre açın. CompressionLz4, LZ4 blok biçimidir; LZ4 frame biçimi değildir. Açma işlemi için açılmış veri uzunluğu, yani compressed_size (sıkıştırma öncesi boyut) gerekir. Python'da: lz4.block.decompress(data, uncompressed_size=compressed_size). lz4.frame.decompress kullanılırsa işlem ERROR_frameType_unknown hatasıyla başarısız olur.
  3. Sonucu LioPclReport olarak seri durumdan çıkarın ve nokta dizisini alın.

Koordinatların yeniden oluşturulması: Cihaz, gerçek koordinatı header.scaler ile çarpar ve sıfıra doğru keser (yuvarlamaz). Ardından değeri sint64 olarak gönderir; yeniden oluşturulan değerdeki hata 1/scaler değerinden küçüktür. Yeniden oluşturmak için iletilen tam sayıyı header.scaler değerine bölün, yani x_real = int(x) / int(header.scaler). Aynısını y ve z için de uygulayın. Cihazın scaler değerini 1000 olarak gönderdiği ölçülmüştür; bu durumda iletilen 2921 tam sayısı 2.921 değerine karşılık gelir. Protobuf JSON eşlemesine göre sint64 değeri sözlükte (dict) dize olur; bu nedenle aritmetik işlemden önce tam sayıya çevirin. Yukarıdaki proto yorumundaki raw value, iletilen tam sayıyı değil gerçek koordinatı ifade eder; yani iletilen tam sayı = gerçek koordinat × header.scaler. Cihaz tarafındaki kod scaler değerini 1000 olarak sabitler; bölmeden önce scaler değerinin 0 olmadığını kontrol edin.

rgbi, 32 bitlik işaretsiz bir tam sayıdır. Yüksek bayttan düşük bayta doğru sırasıyla R, G, B, Intensity değerlerini içerir ve her biri 8 bittir (bu sıra, cihaz tarafındaki paketleme kodu ve proto yorumuna dayanır; gerçek renklerle nokta nokta doğrulanmamıştır).

Not: Açma işlemi için ek bağımlılıklar gerekir. Proje örnek betiklerini kullanırken nokta bulutunu çözmek için pip install lz4 zstandard komutuyla bunları kurun. Kurulmazsa betik bir ipucu yazdırır ve bu adımı atlar. python/example/usage/lio_pcl.py örnek betiği 1.0.1 sürümünden itibaren LZ4 blok açma yöntemini kullanır. 1.0.0 betiği ise frame olarak açıyordu; gerçek bir cihazdan alınan nokta bulutu karelerinin hiçbirini çözemedi ve hiçbir hata da yazdırmadı.

Gerçek zamanlı poz

Gerçek zamanlı poz, lixel/application/report/lio_pose konusunda LioPoseReport olarak raporlanır:

message LioPoseReport {
    Header header = 1;
    PoseStamped pose = 2;
    float distance = 3;      // distance (meters)
    float pose_accuracy = 4; // not used yet
}

PoseStamped yapısı bir zaman damgasını ve pozu içerir. Poz, bir konumdan (Point) ve bir yönelimden (Quaternion) oluşur:

message PoseStamped {
    sint64 stamp = 1;
    Pose pose = 2;
}

message Pose {
    Point position = 1;        // x / y / z
    Quaternion orientation = 2; // x / y / z / w
}

RTSP Video Akışı

Cihazda yerleşik bir RTSP sunucusu bulunur. Tarama başarıyla başladıktan sonra cihaz, kamera video akışını gerçek zamanlı olarak gönderir; aynı anda en fazla bir akış gönderilir. URL biçimi:

rtsp://<lixel_device_ipaddr>:8554/live/chn_<camera_name>

Örnekler:

  • rtsp://192.168.55.1:8554/live/chn_left
  • rtsp://192.168.55.1:8554/live/chn_right
ParametreAçıklama
lixel_device_ipaddrCihaz IP adresi: Kablolu bağlantıda 192.168.55.1 olarak sabittir; kablosuz bağlantıda Bluetooth üzerinden alınır; Hızlı Bağlantı modunda 192.168.56.1 olarak sabittir
camera_nameKamera adı, cihaz bilgisi isteğiyle (DeviceInfoResponse.device_info.camera_info.camera_list) alınır. Liste boş dizeler içerebilir (ör. ["left", "", "right"]). Cihaz, ilgili yuvada kamera yoksa veya önizleme etkin değilse boş dize koyar; bu nedenle URL oluştururken bu girdileri atlayın

Bu bölüm XGRIDS'in resmî kullanım kılavuzundan Türkçeye çevrildi; ekran görüntüleri ve arayüz adları özgün haliyle İngilizcedir. İngilizce aslı (yeni sekmede açılır) · Güncelleme:

XGRIDS Türkiye

Kurulumda ve Sahada Yanınızdayız

Atlıhan Harita; cihaz kurulumu, firmware güncellemesi, yazılım kullanımı ve saha uygulamalarında eğitim ve teknik destek verir. Sorunuzu iletin, uzmanımız size dönsün.

+90 216 546 0804