Skip to content

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.