Advertisement
raffaelegriecoit

FRANCO

Nov 20th, 2024
189
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 5.04 KB | None | 0 0
  1. % Specifica delle porte seriali per la comunicazione
  2. controlPort = serialport("COM5", 115200); % Porta COM per configurazione
  3. dataPort = serialport("COM6", 921600);   % Porta COM per dati in arrivo
  4.  
  5. % Percorso del file di configurazione
  6. configFilePath = "AOP_6m_default.cfg";
  7.  
  8. % Funzione per inviare il file di configurazione
  9. applyRadarConfiguration(controlPort, configFilePath);
  10.  
  11. disp("Radar configurato e pronto a ricevere dati.");
  12.  
  13. % Acquisizione dati in tempo reale
  14. disp("Avvio acquisizione dati...");
  15. figure;
  16. hold on;
  17. grid on;
  18. xlabel('X [m]');
  19. ylabel('Y [m]');
  20. zlabel('Z [m]');
  21. title('Visualizzazione dati radar in tempo reale');
  22. while true
  23.     if dataPort.NumBytesAvailable > 0
  24.         % Leggi dati dal radar
  25.         rawData = read(dataPort, dataPort.NumBytesAvailable, 'uint8');
  26.        
  27.         % Parsing dati
  28.         parsedData = parseRadarData(rawData);
  29.        
  30.         % Visualizzazione dati
  31.         visualizeRadarData(parsedData);
  32.     end
  33.     pause(0.05); % Per evitare sovraccarichi di CPU
  34. end
  35.  
  36. %% Funzione per inviare il file di configurazione al radar
  37. function applyRadarConfiguration(controlPort, configFilePath)
  38.     % Leggi il file di configurazione
  39.     fileID = fopen(configFilePath, 'r');
  40.     if fileID == -1
  41.         error("Impossibile aprire il file di configurazione: %s", configFilePath);
  42.     end
  43.    
  44.     % Leggi tutti i comandi dal file
  45.     configCommands = textscan(fileID, '%s', 'Delimiter', '\n');
  46.     fclose(fileID);
  47.    
  48.     % Invia ogni comando al radar
  49.     disp("Invio comandi di configurazione...");
  50.     for i = 1:length(configCommands{1})
  51.         command = strtrim(configCommands{1}{i}); % Rimuovi spazi vuoti
  52.         if ~isempty(command) && command(1) ~= '%' % Ignora righe vuote o commenti
  53.             writeline(controlPort, command);
  54.             pause(0.1); % Attendi per consentire l'elaborazione
  55.         end
  56.     end
  57.     disp("Configurazione completata.");
  58. end
  59.  
  60. %% Funzione per il parsing dei dati
  61. function parsedData = parseRadarData(rawData)
  62.     % Definisci la struttura dei dati parsati
  63.     parsedData = struct('x', [], 'y', [], 'z', [], 'velocity', []);
  64.    
  65.     % Definisci la parola magica per sincronizzare i pacchetti
  66.     magicWord = [2 1 4 3 6 5 8 7];
  67.     magicWordBytes = length(magicWord);
  68.    
  69.     % Cerca la parola magica nei dati grezzi
  70.     startIdx = strfind(rawData', magicWord);
  71.     if isempty(startIdx)
  72.         warning('Parola magica non trovata nei dati ricevuti.');
  73.         return;
  74.     end
  75.    
  76.     % Estrai l'header del frame
  77.     frameHeaderLength = 40; % Lunghezza dell'header del frame in byte
  78.     frameHeader = rawData(startIdx + magicWordBytes : startIdx + magicWordBytes + frameHeaderLength - 1);
  79.    
  80.     % Estrai il numero di TLV nel frame
  81.     numTLVs = typecast(uint8(frameHeader(35:38)), 'uint32');
  82.    
  83.     % Imposta il puntatore all'inizio dei TLV
  84.     pointer = startIdx + magicWordBytes + frameHeaderLength;
  85.    
  86.     % Processa ciascun TLV
  87.     for tlvIdx = 1:numTLVs
  88.         % Leggi l'header del TLV
  89.         tlvType = typecast(uint8(rawData(pointer:pointer+3)), 'uint32');
  90.         tlvLength = typecast(uint8(rawData(pointer+4:pointer+7)), 'uint32');
  91.         pointer = pointer + 8; % Salta l'header del TLV
  92.        
  93.         % Verifica che ci siano abbastanza dati rimanenti
  94.         if pointer + tlvLength > length(rawData)
  95.             warning('Lunghezza del TLV supera i dati disponibili.');
  96.             return;
  97.         end
  98.        
  99.         % Processa il TLV in base al tipo
  100.         switch tlvType
  101.             case 1 % Punti rilevati
  102.                 % Numero di punti rilevati
  103.                 numDetectedPoints = (tlvLength - 8) / 16; % 16 byte per punto
  104.                 if numDetectedPoints > 0
  105.                     % Estrai i dati dei punti
  106.                     pointData = rawData(pointer:pointer + numDetectedPoints * 16 - 1);
  107.                     pointData = typecast(uint8(pointData), 'single');
  108.                     pointData = reshape(pointData, [4, numDetectedPoints]);
  109.                    
  110.                     % Assegna i dati parsati alla struttura
  111.                     parsedData.x = pointData(1, :);
  112.                     parsedData.y = pointData(2, :);
  113.                     parsedData.z = pointData(3, :);
  114.                     parsedData.velocity = pointData(4, :);
  115.                 end
  116.             % Aggiungi altri casi per altri tipi di TLV se necessario
  117.             otherwise
  118.                 % TLV non supportato
  119.                 warning('Tipo di TLV non supportato: %d', tlvType);
  120.         end
  121.        
  122.         % Aggiorna il puntatore alla fine del TLV corrente
  123.         pointer = pointer + tlvLength - 8; % Sottrai 8 byte dell'header del TLV
  124.     end
  125. end
  126.  
  127. %% Funzione per la visualizzazione dei dati
  128. function visualizeRadarData(parsedData)
  129.     if isempty(parsedData.x)
  130.         return; % Nessun dato da visualizzare
  131.     end
  132.    
  133.     % Scatter 3D per visualizzare i punti
  134.     scatter3(parsedData.x, parsedData.y, parsedData.z, 50, parsedData.velocity, 'filled');
  135.     colormap('jet');
  136.     colorbar;
  137.     drawnow; % Aggiorna il grafico in tempo reale
  138. end
  139.  
Advertisement
Comments
  • # text 2.92 KB | 0 0
    1. function parsedData = parseRadarData(rawData)
    2. % Definisci la struttura dei dati parsati
    3. parsedData = struct('x', [], 'y', [], 'z', [], 'velocity', []);
    4.  
    5. % Definisci la parola magica per sincronizzare i pacchetti
    6. magicWord = [2 1 4 3 6 5 8 7];
    7. magicWordBytes = length(magicWord);
    8.  
    9. % Cerca la parola magica nei dati grezzi
    10. startIdx = [];
    11. for i = 1:(length(rawData) - magicWordBytes + 1)
    12. if all(rawData(i:i+magicWordBytes-1) == magicWord)
    13. startIdx = i;
    14. break;
    15. end
    16. end
    17.  
    18. % Se la parola magica non viene trovata, esci dalla funzione
    19. if isempty(startIdx)
    20. warning('Parola magica non trovata nei dati ricevuti.');
    21. return;
    22. end
    23.  
    24. % Estrai l'header del frame
    25. frameHeaderLength = 40; % Lunghezza dell'header del frame in byte
    26. frameHeader = rawData(startIdx + magicWordBytes : startIdx + magicWordBytes + frameHeaderLength - 1);
    27.  
    28. % Estrai il numero di TLV nel frame
    29. numTLVs = typecast(uint8(frameHeader(35:38)), 'uint32');
    30.  
    31. % Imposta il puntatore all'inizio dei TLV
    32. pointer = startIdx + magicWordBytes + frameHeaderLength;
    33.  
    34. % Processa ciascun TLV
    35. for tlvIdx = 1:numTLVs
    36. % Leggi l'header del TLV
    37. tlvType = typecast(uint8(rawData(pointer:pointer+3)), 'uint32');
    38. tlvLength = typecast(uint8(rawData(pointer+4:pointer+7)), 'uint32');
    39. pointer = pointer + 8; % Salta l'header del TLV
    40.  
    41. % Verifica che ci siano abbastanza dati rimanenti
    42. if pointer + tlvLength > length(rawData)
    43. warning('Lunghezza del TLV supera i dati disponibili.');
    44. return;
    45. end
    46.  
    47. % Processa il TLV in base al tipo
    48. switch tlvType
    49. case 1 % Punti rilevati
    50. % Numero di punti rilevati
    51. numDetectedPoints = (tlvLength - 8) / 16; % 16 byte per punto
    52. if numDetectedPoints > 0
    53. % Estrai i dati dei punti
    54. pointData = rawData(pointer:pointer + numDetectedPoints * 16 - 1);
    55. pointData = typecast(uint8(pointData), 'single');
    56. pointData = reshape(pointData, [4, numDetectedPoints]);
    57.  
    58. % Assegna i dati parsati alla struttura
    59. parsedData.x = pointData(1, :);
    60. parsedData.y = pointData(2, :);
    61. parsedData.z = pointData(3, :);
    62. parsedData.velocity = pointData(4, :);
    63. end
    64. % Aggiungi altri casi per altri tipi di TLV se necessario
    65. otherwise
    66. % TLV non supportato
    67. warning('Tipo di TLV non supportato: %d', tlvType);
    68. end
    69.  
    70. % Aggiorna il puntatore alla fine del TLV corrente
    71. pointer = pointer + tlvLength - 8; % Sottrai 8 byte dell'header del TLV
    72. end
    73. end
    74.  
    75.  
  • # text 5.42 KB | 0 0
    1. 1. Verifica dei dati grezzi ricevuti
    2. Aggiungi un debug per stampare una parte dei dati grezzi ricevuti. Modifica il codice nella parte principale del ciclo:
    3.  
    4. matlab
    5. Copia codice
    6. if dataPort.NumBytesAvailable > 0
    7. % Leggi i dati dal radar
    8. rawData = read(dataPort, dataPort.NumBytesAvailable, 'uint8');
    9.  
    10. % Debug: stampa i primi byte dei dati grezzi
    11. disp("Dati grezzi ricevuti (primi 20 byte):");
    12. disp(rawData(1:min(20, end))); % Mostra solo i primi 20 byte
    13.  
    14. % Parsing dei dati
    15. parsedData = parseRadarData(rawData);
    16.  
    17. % Visualizzazione dati
    18. visualizeRadarData(parsedData);
    19. end
    20. 2. Conferma della parola magica
    21. La parola magica predefinita è [2 1 4 3 6 5 8 7], ma potrebbe differire. Consulta la documentazione del radar (ad esempio, per IWR6843AOP) per verificare il valore corretto. Se necessario, aggiorna la definizione della parola magica:
    22.  
    23. matlab
    24. Copia codice
    25. magicWord = [2 1 4 3 6 5 8 7]; % Modifica questo valore se differente
    26. 3. Bufferizzazione dei dati
    27. I dati ricevuti dalla porta seriale potrebbero arrivare in pacchetti spezzati, il che significa che la parola magica potrebbe non essere presente all'inizio di ogni pacchetto. Usa un buffer per accumulare i dati:
    28.  
    29. Implementazione del buffer
    30. Modifica il ciclo principale per accumulare i dati grezzi in un buffer:
    31.  
    32. matlab
    33. Copia codice
    34. % Buffer per accumulare dati grezzi
    35. buffer = uint8([]);
    36.  
    37. while true
    38. if dataPort.NumBytesAvailable > 0
    39. % Leggi i nuovi dati e aggiungili al buffer
    40. newRawData = read(dataPort, dataPort.NumBytesAvailable, 'uint8');
    41. buffer = [buffer; newRawData];
    42.  
    43. % Mantieni solo gli ultimi 8192 byte (ad esempio, per evitare overflow)
    44. if length(buffer) > 8192
    45. buffer = buffer(end-8191:end);
    46. end
    47.  
    48. % Debug: stampa la lunghezza del buffer
    49. disp("Lunghezza buffer:");
    50. disp(length(buffer));
    51.  
    52. % Parsing dei dati
    53. parsedData = parseRadarData(buffer);
    54.  
    55. % Visualizzazione dati
    56. visualizeRadarData(parsedData);
    57. end
    58. pause(0.05); % Per evitare sovraccarichi di CPU
    59. end
    60. 4. Sincronizzazione della parola magica
    61. Aggiorna la funzione parseRadarData per gestire il buffer correttamente:
    62.  
    63. matlab
    64. Copia codice
    65. function parsedData = parseRadarData(rawData)
    66. % Definisci la struttura dei dati parsati
    67. parsedData = struct('x', [], 'y', [], 'z', [], 'velocity', []);
    68.  
    69. % Definisci la parola magica per sincronizzare i pacchetti
    70. magicWord = [2 1 4 3 6 5 8 7];
    71. magicWordBytes = length(magicWord);
    72.  
    73. % Cerca la parola magica nei dati grezzi
    74. startIdx = [];
    75. for i = 1:(length(rawData) - magicWordBytes + 1)
    76. if all(rawData(i:i+magicWordBytes-1) == magicWord)
    77. startIdx = i;
    78. break;
    79. end
    80. end
    81.  
    82. % Se la parola magica non viene trovata, esci dalla funzione
    83. if isempty(startIdx)
    84. disp("Parola magica non trovata.");
    85. return;
    86. end
    87.  
    88. % Estrai l'header del frame
    89. frameHeaderLength = 40; % Lunghezza dell'header del frame in byte
    90. if startIdx + magicWordBytes + frameHeaderLength > length(rawData)
    91. warning('Dati insufficienti per l\'header del frame.');
    92. return;
    93. end
    94. frameHeader = rawData(startIdx + magicWordBytes : startIdx + magicWordBytes + frameHeaderLength - 1);
    95.  
    96. % Estrai il numero di TLV nel frame
    97. numTLVs = typecast(uint8(frameHeader(35:38)), 'uint32');
    98.  
    99. % Imposta il puntatore all'inizio dei TLV
    100. pointer = startIdx + magicWordBytes + frameHeaderLength;
    101.  
    102. % Processa ciascun TLV
    103. for tlvIdx = 1:numTLVs
    104. % Verifica che ci siano abbastanza dati per il TLV
    105. if pointer + 8 > length(rawData)
    106. warning('Dati insufficienti per l\'header del TLV.');
    107. return;
    108. end
    109.  
    110. % Leggi l'header del TLV
    111. tlvType = typecast(uint8(rawData(pointer:pointer+3)), 'uint32');
    112. tlvLength = typecast(uint8(rawData(pointer+4:pointer+7)), 'uint32');
    113. pointer = pointer + 8; % Salta l'header del TLV
    114.  
    115. if pointer + tlvLength > length(rawData)
    116. warning('Dati insufficienti per il TLV.');
    117. return;
    118. end
    119.  
    120. % Processa il TLV in base al tipo
    121. switch tlvType
    122. case 1 % Punti rilevati
    123. % Numero di punti rilevati
    124. numDetectedPoints = (tlvLength - 8) / 16; % 16 byte per punto
    125. if numDetectedPoints > 0
    126. % Estrai i dati dei punti
    127. pointData = rawData(pointer:pointer + numDetectedPoints * 16 - 1);
    128. pointData = typecast(uint8(pointData), 'single');
    129. pointData = reshape(pointData, [4, numDetectedPoints]);
    130.  
    131. % Assegna i dati parsati alla struttura
    132. parsedData.x = pointData(1, :);
    133. parsedData.y = pointData(2, :);
    134. parsedData.z = pointData(3, :);
    135. parsedData.velocity = pointData(4, :);
    136. end
    137. % Aggiungi altri casi per altri tipi di TLV se necessario
    138. otherwise
    139. % TLV non supportato
    140. warning('Tipo di TLV non supportato: %d', tlvType);
    141. end
    142.  
    143. % Aggiorna il puntatore alla fine del TLV corrente
    144. pointer = pointer + tlvLength - 8; % Sottrai 8 byte dell'header del TLV
    145. end
    146. end
Add Comment
Please, Sign In to add comment
Advertisement