Components
component.py — Componentes físicos do simulador de radar.
Define as classes de base e especializadas para todos os objetos que compõem a cena de simulação: o radar e os alvos (targets).
Hierarquia de classes::
Components (ABC)
├── Radar
└── Target
├── OrbitalTarget
└── NestedOrbitalTarget
O método update(dt) avança o estado cinemático de cada componente
por um passo de tempo dt (em segundos).
Components
Bases: ABC
Classe base abstrata para todos os componentes da cena.
Mantém o estado cinemático (posição, velocidade, aceleração, ângulo) e fornece métodos de atualização para movimento linear uniforme.
Subclasses concretas (Radar, Target, etc.) sobrescrevem update()
para implementar sua cinemática específica.
Attributes:
| Name | Type | Description |
|---|---|---|
x |
float
|
Posição x em metros (sistema cartesiano centrado no radar). |
y |
float
|
Posição y em metros. |
theta |
float
|
Ângulo de orientação/heading em radianos. |
velocity |
float
|
Módulo da velocidade em m/s. |
acceleration |
float
|
Módulo da aceleração em m/s². |
phi |
float
|
Ângulo de fase auxiliar (uso específico de subclasses). |
update_acceleration(acc)
Atualiza a aceleração do componente.
update_velocity(dt)
Atualiza a velocidade escalar por integração da aceleração: v += a·dt.
update_position(dt)
Atualiza a posição por integração da velocidade em direção a theta
x += v·cos(θ)·dt y += v·sin(θ)·dt
update(dt)
Avança o estado cinemático por um passo de tempo dt. Primeiro atualiza a velocidade (v += a·dt) e depois a posição.
Radar
Bases: Components
Radar monoestático com antena giratória.
O radar fica fixo na origem (x=0, y=0) e rotaciona em torno do eixo Z
a uma velocidade angular constante definida por rpm.
Attributes:
| Name | Type | Description |
|---|---|---|
rpm |
float
|
Rotações por minuto da antena. |
clockwise |
bool
|
Sentido de rotação (True = horário). |
prf |
float
|
Pulse Repetition Frequency máxima (Hz) calculada de r_max. |
pt |
float
|
Potência de transmissão (W). |
gt |
float
|
Ganho da antena em transmissão (dBi). |
s_min |
float
|
Sensibilidade mínima do receptor (W/m²). |
beamwidth |
float
|
Largura do feixe principal (°). |
deg_step |
float
|
Resolução angular de quantização das detecções (°). |
irradPattern |
Callable opcional G(deg_error) → ganho linear. Se None, usa modelo Gaussiano calibrado pela beamwidth. |
__init__(r_max, pt, gt, s_min, beamwidth, irradPattern, x=0, y=0, theta=0, rpm=1, clockwise=False, deg_step=0.1)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
r_max
|
float
|
Alcance máximo do radar (m). Usado para calcular a PRF máxima. |
required |
pt
|
float
|
Potência de transmissão (W). |
required |
gt
|
float
|
Ganho da antena (dBi). |
required |
s_min
|
float
|
Sensibilidade mínima do receptor (W/m²). |
required |
beamwidth
|
float
|
Largura do feixe principal (graus). |
required |
irradPattern
|
Padrão de irradiação customizado. Se None, usa Gaussiano. |
required | |
x,
|
y
|
Posição inicial (padrão: origem). |
required |
theta
|
float
|
Ângulo inicial da antena (graus). |
0
|
rpm
|
float
|
Velocidade de rotação (rotações por minuto). |
1
|
clockwise
|
bool
|
Sentido horário se True, anti-horário se False. |
False
|
deg_step
|
float
|
Resolução angular de detecção (graus). |
0.1
|
rotate(dt)
Avança o ângulo da antena por dt segundos.
A velocidade angular é rpm × 360° / 60 s = rpm × 6°/s. O ângulo é mantido no intervalo [0°, 360°).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dt
|
float
|
Passo de tempo em segundos. |
required |
update(dt)
Avança o estado do radar (rotação da antena) por dt segundos.
Target
Bases: Components
Alvo com movimento linear (ou estático).
Herda a cinemática linear de Components:
x(t) = x₀ + v·cos(θ)·t + ½·a·cos(θ)·t²
y(t) = y₀ + v·sin(θ)·t + ½·a·sin(θ)·t²
Para um alvo estático, basta vel=0 e acc=0.
__init__(x, y, vel, acc, theta)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x,
|
y
|
Posição inicial (m). |
required |
vel
|
float
|
Velocidade inicial (m/s). |
required |
acc
|
float
|
Aceleração tangencial (m/s²). |
required |
theta
|
float
|
Heading (rad). Direção do movimento. |
required |
OrbitalTarget
Bases: Target
Alvo em movimento orbital circular (com aceleração tangencial opcional).
A trajetória é parametrizada em coordenadas polares
α(t) = α₀ + ω·t + ½·β·t² x(t) = r · cos(α(t)) y(t) = r · sin(α(t))
onde ω = v₀/r é a velocidade angular inicial e β = acc/r é a aceleração angular. O heading (theta) é sempre tangente à órbita.
Attributes:
| Name | Type | Description |
|---|---|---|
r |
float
|
Raio orbital (m). |
alpha |
float
|
Fase atual (rad). |
omega |
float
|
Velocidade angular atual (rad/s). Negativo se clockwise. |
beta |
float
|
Aceleração angular (rad/s²). |
clockwise |
bool
|
Sentido de rotação. |
__init__(r, speed, acceleration, clockwise=False, alpha_start=0)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
r
|
float
|
Raio da órbita (m). |
required |
speed
|
float
|
Velocidade tangencial inicial (m/s). |
required |
acceleration
|
float
|
Aceleração tangencial (m/s²). Positivo = acelera. |
required |
clockwise
|
bool
|
Se True, orbita no sentido horário. |
False
|
alpha_start
|
float
|
Fase inicial da órbita (rad). Padrão: 0 (eixo +X). |
0
|
update(dt)
Avança o estado orbital por dt segundos.
Integra aceleração → velocidade angular → fase, depois recalcula posição cartesiana e heading tangente à trajetória.
NestedOrbitalTarget
Bases: Target
Alvo com movimento epicíclico — órbita dentro de órbita.
O alvo descreve uma trajetória epicicloidal
P(t) = O₁(t) + O₂(t)
onde O₁ é o centro orbital primário (orbitando o radar) e O₂ é a posição do alvo relativa a O₁ (órbita secundária).
Isso produz trajetórias complexas como rosetas, hipocicloides e epicicloides, adequadas para testar algoritmos de rastreamento.
Attributes:
| Name | Type | Description |
|---|---|---|
r1, |
r2 (float
|
Raios das órbitas primária e secundária (m). |
alpha1, |
alpha2 (float
|
Fases atuais das órbitas (rad). |
omega1, |
omega2 (float
|
Velocidades angulares (rad/s). Negativas se CW. |
beta1, |
beta2 (float
|
Acelerações angulares (rad/s²). |
__init__(r1, speed1, acc1, r2, speed2, acc2, clockwise1=False, clockwise2=False, alpha1_start=0, alpha2_start=0)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
r1,
|
(speed1, acc1)
|
Parâmetros da órbita primária (raio m, vel m/s, acc m/s²). |
required |
r2,
|
(speed2, acc2)
|
Parâmetros da órbita secundária. |
required |
clockwise1
|
bool
|
Direção da órbita primária (True = horário). |
False
|
clockwise2
|
bool
|
Direção da órbita secundária. |
False
|
alpha1_start
|
float
|
Fase inicial da órbita primária (rad). |
0
|
alpha2_start
|
float
|
Fase inicial da órbita secundária (rad). |
0
|
update(dt)
Avança o estado epicíclico por dt segundos.
Integra ambas as órbitas independentemente, soma as posições cartesianas e recalcula velocidade e heading resultantes.