O radar de onda contínua modulada em frequência de ondas milimétricas (FMCW) funciona emitindo e detectando ondas eletromagnéticas de radiofrequência (RF). Devido às suas propriedades únicas, esta tecnologia oferece diversas vantagens para sistemas e aplicações interativas. Ele opera independentemente das condições de iluminação, ruído ambiental ou clima, oferecendo capacidades de detecção rápidas e precisas.
Além disso, pode penetrar em vários materiais, tornando-o ideal para integração em vários dispositivos e ambientes. O sensor pode ser construído como uma pequena unidade semicondutora de estado sólido em frequências de RF de ondas milimétricas - essencialmente, um chip de radar. Este chip é compacto, consome pouca energia, não possui peças móveis e pode ser produzido com boa relação custo-benefício em grandes quantidades.
O radar mmWave FMCW pode ser usado em muitos dispositivos, como:
Além disso, os radares mmWave FMCW podem ser usados em conjunto com modelos de aprendizagem profunda para resolver várias tarefas:
Observe que todas essas aplicações podem ser resolvidas sem câmeras, com um dispositivo de baixíssimo consumo de energia e NNs relativamente pequenos.
Nos próximos anos, muitos produtos eletrônicos de consumo provavelmente começarão a usar ativamente esse tipo de sensor com algoritmos de aprendizado profundo para resolver os problemas mencionados acima. Além disso, em 2021, o padrão Wi-Fi IEEE 802.11ау foi aprovado. Este padrão usa as mesmas frequências de rádio e princípios operacionais, permitindo que roteadores Wi-Fi acessem a mesma funcionalidade dos radares FMCW mmWave.
Este e os próximos dois artigos abordarão:
Este artigo explica como um sinal de radar mmWave FMCW é processado. O código utilizado para gerar a maioria dos números pode ser acessado no Google Colab ou no final do artigo.
O sinal do radar mmWave FMCW permite medir a distância a todos os objetos em seu campo de visão, sua velocidade e posição angular (azimute e elevação). O sinal do radar pode ser processado na forma de imagens de resolução muito pequena (geralmente ~32x32 - 256x64 pixels) com alcance/velocidade/ângulo ao longo dos eixos da imagem como na imagem abaixo - alcance-doppler (alcance-velocidade) alcance- imagens angulares.
O sensor consiste em várias (1 ou mais) antenas de transmissão omnidirecionais e várias (1 ou mais) antenas de recepção. As antenas de transmissão e recepção operam simultaneamente. O campo de visão do radar é geralmente de aproximadamente 120° e a distância máxima pode variar de alguns centímetros a dezenas de metros.
Normalmente precisamos emitir um sinal no instante t1 e receber sua reflexão no instante t2 para medir a distância. A distância pode então ser calculada como d=(t2-t1)*c , onde c é a velocidade da luz porque a onda de rádio viaja na velocidade da luz.
A antena de radar de onda mm FMCW é omnidirecional e precisa de uma maneira de medir os tempos t1 e t2 para todos os objetos no campo de visão do radar. Um sinal FMCW (onda contínua modulada em frequência) é usado para isso. O principal componente do radar é um sinal sonoro. Chirp é um sinal de rádio senoidal cuja frequência aumenta linearmente com o tempo, conforme mostrado na figura abaixo.
Um chirp é caracterizado pelas frequências inicial (f_start) e final (f_end), largura de banda ( B=f_end-f_start ) e tempo de chirp (Tc). O tempo de chirp varia de alguns microssegundos a alguns milissegundos. A frequência inicial é geralmente de aproximadamente 30, 60 ou 77 GHz, dependendo da aplicação do radar. A largura de banda do Chirp varia de ~0,5 GHz a vários GHz.
As antenas receptoras (Rx) e transmissoras (Tx) operam simultaneamente. O sintetizador gera continuamente um sinal sonoro que é enviado à antena transmissora Tx e ao mixer. Ao mesmo tempo, o sinal recebido pela antena Rx também é enviado ao mixer. O mixer produz a diferença entre o sinal enviado para Tx e o sinal recebido por Rx.
A frequência do sinal chirp muda com o tempo de acordo com uma lei linear conhecida (Slope), o que significa que se houver um único objeto na frente do radar, este objeto irá gerar um sinal x_out com um
Podemos medir a distância de todos os objetos no campo de visão do radar simplesmente analisando o sinal do mixer sem medir o tempo: d=(F_obj*c)/(2*S). Na literatura, o sinal x_out é denominado 'sinal IF' (sinal de frequência intermediária).
Um bônus adicional do design do sensor: a frequência portadora do sinal geralmente fica em torno de 30 GHz ou 60 GHz. Se precisássemos digitalizar um sinal com tais frequências, teríamos requisitos muito elevados para o ADC. Toda a análise de sinal é feita em sinal IF cuja frequência geralmente fica em torno de alguns MHz, o que relaxa significativamente os requisitos do ADC.
Como foi mostrado acima, para encontrar a distância de todos os objetos no radar FoV, precisamos decompor o sinal x_out em seus componentes de frequência. A Transformada de Fourier é um algoritmo que converte um sinal no domínio do tempo no domínio da frequência.
A transformada de Fourier do sinal IF revelará vários tons, e a frequência de cada tom é proporcional ao alcance de cada objeto do radar - na literatura, essa transformada de Fourier também é chamada de transformada de Fourier de tempo rápido ou transformada de Fourier de alcance.
Problema: se houver vários objetos à mesma distância, teremos problemas porque o intervalo FFT não nos permitirá diferenciar dois objetos. Mas se os objetos se moverem em velocidades diferentes, eles poderão ser separados por velocidade.
Os chilreios geralmente são repetidos imediatamente um após o outro ou com um ligeiro atraso. Na literatura, o tempo entre o início de dois chilreios é denominado Tempo de Repetição do Chirp. Vários sinais sonoros (geralmente 16 a 256) são empilhados para formar uma estrutura de radar. Um tempo de quadro = Tempo de repetição de chilreios * Número de chilreios. Normalmente, o tempo de 1 quadro varia de dezenas de microssegundos a dezenas de milissegundos.
Por que empilhar vários chilreios juntos? A fase do sinal IF é muito sensível a pequenas e grandes vibrações de objetos no campo de visão do radar - pode até ser usada para medir a frequência de vibração de um motor ou o batimento cardíaco de uma pessoa ou animal.
É possível medir a velocidade de um objeto em uma faixa específica analisando as mudanças de fase ao longo do tempo (mudança de fase de chirp para chirp):
O algoritmo para medir a velocidade com o radar mmWave FMCW é muito simples:
Aplique a Transformada de Fourier a cada chirp em um quadro. Cada frequência corresponde a uma distância específica do objeto. Às vezes, essas frequências são chamadas de intervalos de faixa, pois cada frequência corresponde a um intervalo específico.
se o sinal IF original for representado com valores não complexos, a segunda metade das frequências (faixas de faixa) deve ser descartada de acordo com o teorema de Nyquist-Shannon
Aplique outra transformada de Fourier em cada intervalo de faixa - decomponha as mudanças de fase ao longo do tempo em frequências onde a frequência corresponderá a valores Doppler (velocidade) específicos
Problema: se houver dois objetos à mesma distância movendo-se na mesma velocidade, eles produzirão um único pico na imagem Doppler. Mas se tivermos várias antenas receptoras Rx, pode ser possível separar os objetos pela sua posição angular
Conforme explicado anteriormente, uma pequena mudança na distância resultará em uma mudança de fase. A mudança de fase entre sinais separados no tempo é usada para calcular a velocidade dos objetos. A mudança de fase entre chirps separados no espaço (chirps recebidos por diferentes antenas Rx) pode ser usada para estimativa de ângulo.
O algoritmo de estimativa de ângulo com múltiplas antenas receptoras Rx é muito simples:
Transmita um quadro de chilreios com uma antena Tx.
Calcule a transformada de Fourier 2D (imagem alcance-doppler) de quadros recebidos por todas as antenas Rx. As imagens range-doppler de cada antena Rx terão picos no mesmo local e doppler, mas com fase diferente (a diferença de fase corresponde à distância entre as antenas Rx).
Use a diferença de fase (ω) para estimar o ângulo de chegada dos objetos - aplique a terceira transformada de Fourier em todas as antenas Rx.
import os import numpy as np import scipy import scipy.io as spio import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import math
Baixe um exemplo de dados de radar mmWave FMCW do projeto RAMP-CNN .
!pip uninstall gdown -y && pip install gdown !gdown -V !gdown --folder https://drive.google.com/drive/folders/1Eg-8R45RPvifNf2VYI_MG-LRjdkLOHTf -O /content/sample_slice_data
Carregue dados do arquivo.
file_name = '/content/sample_slice_data/2019_04_30/2019_04_30_pbms002/2019_04_30_pbms002_000000.mat' mat = spio.loadmat(file_name, squeeze_me=True) adc_data = np.asarray(mat["adc_data"]) print(adc_data.shape) # ADC samples, vRx, chirps - (128, 8, 255) print(adc_data.dtype) # complex128
Funções de visualização.
def show_one_chirp(one_chirp_data, y_label='amplitude', x_label='One chirp'): plt.figure(figsize=[5, 4]) plt.plot(one_chirp_data) plt.xlabel(x_label) plt.ylabel(y_label) plt.show() def show_image(image_data, image_name, x_label='', y_label=''): plt.imshow(image_data) plt.title(image_name) plt.xlabel(x_label) plt.ylabel(y_label) plt.show() def show_3_images(img_data1, img_data2, img_data3): plt.figure(figsize=(10, 8)) plt.subplot(2, 2, 1) plt.imshow(img_data1[0], aspect=1.44) plt.title(img_data1[1]) plt.xlabel(img_data1[2]) plt.ylabel(img_data1[3]) plt.subplot(2, 2, 2) plt.imshow(img_data2[0], aspect=1.0) plt.title(img_data2[1]) plt.xlabel(img_data2[2]) plt.ylabel(img_data2[3]) plt.subplot(2, 2, 3) plt.imshow(img_data3[0], aspect=1.0) plt.title(img_data3[1]) plt.xlabel(img_data3[2]) plt.ylabel(img_data3[3]) plt.show()
Mostre um dado ADC de um chirp.
show_one_chirp(np.absolute(adc_data[:,0,0]), x_label='IF signal of a chirp')
Mostre um chilrear após o intervalo fft.
chirp_fft = np.fft.fft(adc_data[:,0,0]) show_one_chirp(np.absolute(chirp_fft), x_label='IF signal amplitude (range)', y_label='Amplitude')
Mostre o quadro do radar nos domínios do tempo e da frequência.
# show all chirps show_one_chirp(np.absolute(adc_data[:,0,:]), x_label='IF signal of frame chirps') show_image(np.absolute(np.fft.fft(adc_data[:,:,:], axis=0).mean(1)), 'range FFT', x_label='Chirps', y_label='Range')
Obtenha alcance, doppler e ângulo a partir de dados de radar.
def get_range_doppler_angle(adc_data_in): # adc_data_in - ADC samples, vRx, chirps samples_in = adc_data_in.shape[0] range_window = np.hamming(samples_in).reshape(-1,1,1) range_data = np.fft.fft(adc_data_in*range_window, samples_in, axis=0) # chirps_in = range_data.shape[2] doppler_window = np.hamming(chirps_in).reshape(1,1,-1) range_doppler_data = np.fft.fftshift(np.fft.fft(range_data*doppler_window, chirps_in, axis=2), axes=2) # # samples, vRx, chirps angle_window = np.hamming(range_doppler_data.shape[1]).reshape(1,-1,1) angle_bins=180 rda_data = np.fft.fftshift(np.fft.fft(range_doppler_data*angle_window, angle_bins, axis=1), axes=1) return range_data, range_doppler_data, rda_data
range_image, range_doppler_image, rda_cube = get_range_doppler_angle(adc_data)
show_3_images([np.absolute(range_image.mean(axis=1)), 'range doppler', 'Doppler', 'Range'], [np.absolute(rda_cube.mean(axis=2)), 'range angle', 'Angle', 'Range'], [np.absolute(rda_cube.mean(axis=0)), 'angle doppler', 'Doppler', 'Angle'] )
Os próximos dois artigos abordarão: