← Estudos técnicos

Narrativa da missão, passo a passo

As 44 etapas do roteiro com o texto que o operador lê e o algoritmo que cada uma representa, confrontados com os parâmetros que a simulação usa hoje. Serve para revisão: registra o que divergia, como ficou e — quando foi o caso — o que a própria revisão errou.

Todas as correções foram aplicadas. A seção 1 registra o que estava divergente e como ficou. Onde o número acompanha um parâmetro, o texto passou a ser calculado — trocar alcance ou afastamento na simulação reescreve a narrativa junto, e essa classe de defasagem não volta. A seção 2 traz o roteiro completo já corrigido.

Uma das correções estava errada e foi desfeita. A da etapa 0.5 confundiu o plano do rotor com a face frontal da nacele e inverteu o sinal de uma folga de segurança. Está marcada em vermelho na seção 1, com o histórico completo — o registro não foi apagado.
Corrigidas
14
números que contradiziam o modelo
Desambiguadas
3
estavam certas, faltava dizer que eram folga
Conferidos e certos
7
grupos de valores sem problema
Revertidas
1
a correção estava errada, ver 0.5
Etapas no roteiro
44
todas com narrativa e algoritmo

Parâmetros vigentes

Extraídos do próprio simulador no momento em que este arquivo foi gerado.

ParâmetroValorObservação
Alcance de trabalho do C18 majustável na simulação; nominal do sensor é 12 m
Afastamento de percepção6 mfases F0 e FA
Afastamento fotográfico15 mfase FB — depende da câmera, não do LiDAR
Afastamento do arco de raiz14 mtambém fotográfico
Altura do cubo90 mponta da pá a 150 m
Comprimento da pá60 mraiz cilíndrica até 10,8 m
Raio da torre2 → 1.3 mafina da base ao topo
Rotor à frente do eixo7.5 mOVERHANG
Resolução angular0.72°define o espaçamento na superfície

1 · Divergências corrigidas

Cada item mostra o texto anterior e o que está no simulador agora.

0.4 narrativa corrigido
antes
· dentro da fatia: 10 cm a 8 m
agora
· dentro da fatia: 7,5 cm a 6 m
O afastamento de percepção é 6 m. A 0,72° de resolução angular, 6 m dão 7,5 cm de espaçamento na superfície — não 10 cm, que era o valor a 8 m. Agora sai calculado de D_PROF.
0.5 narrativa revisado duas vezes
original
RECUO obrigatório: a nacele avança 8,7 m à frente do eixo. Manter 10 m do eixo deixaria o drone a 1,3 m dela.
primeira revisão — incorreta
RECUO obrigatório: a nacele avança 7,5 m à frente do eixo. Manter 8 m do eixo — o afastamento do perfilamento — deixaria o drone a apenas 0,5 m dela.
agora
RECUO obrigatório: o NARIZ da nacele avança 8,7 m à frente do eixo da torre — 1,2 m além do próprio plano do rotor. Manter 8,0 m do eixo — o afastamento do perfilamento — colocaria o drone 0,7 m DENTRO do envelope dela. O recuo para 13,5 m devolve 4,8 m de folga.
A primeira revisão estava errada e foi desfeita. O 8,7 m do texto original nunca foi um número desatualizado: é a face frontal da nacele, definida no modelo como OVERHANG + 1,2. Já OVERHANG = 7,5 m é o plano do rotor — outra coisa. Trocar um pelo outro deslocou a referência 1,2 m para trás e, com ela, o sinal da folga: o texto passou a anunciar +0,5 m de sobra onde há −0,7 m de interferência. A ramificação para folga negativa já existia no código e não disparava porque estava sendo alimentada com o número errado. A nacele agora vem de NAC_FRENTE e NAC_TRAS, declaradas uma vez e usadas tanto pelo obstáculo do ray-cast quanto pela narrativa — as duas não podem mais divergir.

A trajetória em si sempre esteve correta: a etapa 0.5 recua para 13,5 m antes de chegar à altura da nacele. O defeito era só do texto que justifica o recuo.
0.5 algoritmo corrigido
antes
afastamento = 15.5 m do EIXO
agora
afastamento = 13.5 m do EIXO
OVERHANG (7,5) + afastamento de percepção. Era 7,5 + 8 = 15,5; agora 7,5 + 6 = 13,5 — o valor que o roteiro de fato executa.
A.1 narrativa corrigido
antes
Adquirir no meio seria apostar. Esta etapa para na BORDA do alcance, a 13 m.
agora
Esta etapa para a 13 m laterais do eixo da pá; somando a profundidade, a pá ainda está a cerca de 15 m — FORA de alcance. A aquisição não acontece aqui: ela se dá durante o fechamento da etapa seguinte, à medida que a seção entra nos 8 m do sensor.
O ponto de parada nunca esteve "na borda do alcance": a 13 m laterais mais a profundidade, a pá está a cerca de 15 m — fora até dos 12 m nominais antigos. A aquisição se dá no fechamento seguinte.
A.1 algoritmo corrigido
antes
voa_ate(raiz_prevista + normal * 13 m)
enquanto nao adquirida:
    cand = agrupa(C1.ler()) menos torre
    se forma alongada plausivel: adquirida
agora
voa_ate(raiz_prevista + normal * 13 m)

// fora de alcance aqui: quem adquire e a etapa A.1b,
// fechando ate a secao aparecer na fatia
O laço "enquanto não adquirida" rodava num ponto onde o sensor não alcança a pá: nunca terminaria. A aquisição foi movida para onde de fato acontece.
A.1b narrativa corrigido
antes
Só agora fecha para 8 m, com a pá já ADQUIRIDA.
agora
Só agora fecha para 6 m, adquirindo a pá durante a aproximação.
Afastamento de percepção, e a ordem dos fatos: a pá é adquirida DURANTE o fechamento, não antes dele.
A.2 narrativa corrigido
antes
Seguimento a 0,3 m/s e 8 m de afastamento.
agora
Seguimento a 0,3 m/s e 6 m de afastamento.
Afastamento de percepção.
A.2 algoritmo corrigido
antes
corrige_afastamento(d -> 8.0 m)
agora
corrige_afastamento(d -> 6.0 m)
Mesmo parâmetro, agora no laço de controle.
A.3b algoritmo corrigido
antes
se folga < 12 m: recalcula com waypoint
agora
// folga de PLANEJAMENTO, medida contra o modelo
// ja construido — nao e alcance de sensor
se folga_geometrica < 12 m: recalcula com waypoint
Os 12 m estavam certos: é folga geométrica contra o modelo já construído, não distância percebida. O que faltava era dizer isso — do jeito antigo parecia erro de parâmetro.
A.3c narrativa corrigido
antes
Mesma lógica da P1: chega-se pela raiz, e só depois de adquirir é que se fecha para 8 m.
agora
Mesma lógica da P1: chega-se pela raiz, e o fechamento até 6 m é que traz a pá para dentro do alcance.
Afastamento de percepção, e a mesma inversão de causa da A.1b.
A.3c algoritmo corrigido
antes
voa_ate(raiz_P3 + normal * 12 m)
agora
voa_ate(raiz_P3 + normal * 8 m)
Ponto de espera para ADQUIRIR a pá. Com alcance de 8 m, esperar a 12 m garante não enxergar nada — a aquisição nunca dispararia.
A.4 narrativa corrigido
antes
Densidade típica por pá: ~1.630 fatias, ~20 pontos por fatia na corda, cerca de 33 mil pontos por face — ~330 pontos por metro quadrado.
agora
Densidade típica por pá: ~1.630 fatias, ~26 pontos por fatia na corda, cerca de 42 mil pontos por face — ~442 pontos por metro quadrado.
As 1.630 fatias não mudam (vêm de 0,3 m/s a 10 Hz). Os pontos por fatia sim: 26 medidos no ray-cast a 6 m, contra 20 a 8 m. Densidade sobe 34%. Os três números agora são derivados do afastamento.
B.0 algoritmo corrigido
antes
se d_min < 12 m e nao previsto: PARA
agora
se d_min < 8 m e nao previsto: PARA
Limiar da guarda de proximidade, que só pode disparar dentro do que o sensor enxerga. Com alcance de 8 m, um gatilho em 12 m nunca é atingido: a guarda ficaria inerte durante toda a fase fotográfica.
↻ algoritmo corrigido
antes
verifica_folga(ponto) >= 12 m

(11 ocorrências nos trânsitos e arcos da Fase B)
agora
// folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
Mesmo caso da A.3b: folga de planejamento, correta em 12 m. Recebeu o comentário que a distingue do alcance do sensor.
RTH algoritmo corrigido
antes
//   Meia tarde. Decide a arquitetura.
agora
//   Decide a arquitetura de percepcao.
O relatório para a diretoria deixou de tratar de prazos. Era a última menção de esforço no conjunto.
RTH narrativa corrigido
antes
O preço: a distância de reação cai de ~60 m para 12 m.
agora
O preço: a distância de reação cai de ~60 m para 8 m, e o afastamento de percepção para 6 m. Risco gerenciável por procedimento — aproximação pela raiz, contato contínuo, aborto por discrepância.
Já era dinâmico no alcance, mas omitia o afastamento de percepção — que é a outra metade do preço.
— painel corrigido
antes
LiDAR 2D de 12 m como único sensor de percepção — sem cadastro prévio e sem RTK.
agora
LiDAR 2D como único sensor de percepção — sem cadastro prévio e sem RTK.
Alcance de trabalho 8 m · afastamento de percepção 6 m.
(a segunda linha é reescrita a cada troca de parâmetro)
Está na descrição fixa do painel, fora do roteiro. Como o alcance virou botão, o texto contradizia a simulação assim que alguém trocava o valor. Passou a ter uma linha gerada em tempo real.

Conferidos e corretos

Valores que examinei e que não precisam mudar — registrados para que a revisão não os reabra.

ItemPor que está certo
Alcance do C1 nas narrativasF0 0.1, F0 0.3, FB B.0 e FB RTH já usam M.C1_RANGE e acompanham o botão.
Nomes das etapas“Aproximação até 6 m” e “Fechamento para 6 m” já são montados a partir de D_PROF.
Afastamento fotográfico — 15 mNão depende do LiDAR: vem do zoom da H20. Correto em todas as ocorrências.
Arco da raiz — 14 m e 10,8 mGeometria da pá e afastamento de câmera. Não mudam.
1.630 fatias por páVem de 0,3 m/s a 10 Hz sobre 49,2 m. Independe do afastamento.
~60 m de um sensor de longo alcanceReferência externa de comparação. Não muda.
Velocidades, alturas e ângulos0,5 m/s, 0,3 m/s, 1,0 m/s, cubo a 90 m, pá de 60 m, passo de 85°, 120° entre pás — todos conferem com o modelo.

2 · Roteiro completo

As 44 etapas na ordem de execução. Borda verde marca etapa que recebeu correção.

Fase 0 · aquisição sem cadastro
0.1 Decolagem e posicionamento sensor: nenhum

Decolagem a cerca de 30 m do pé da torre. Repare na Vista 03: a fatia está VAZIA. O LiDAR alcança 8 m e a torre está a 30 m. Nesta fase ele não contribui — e é justamente essa lacuna que o telêmetro da câmera existe para fechar.

estado = DECOLANDO
alvo_altitude = 5 m
aguarda(isFlying && alt >= 5)
0.2 Busca da torre pelo telêmetro sensor: tele

Varredura do gimbal com o telêmetro laser. Fora da torre o feixe se perde; sobre ela devolve ~30 m. A transição marca as BORDAS. Uma torre de 4 m vista de 30 m subtende 7,6°: de 1° em 1° obtêm-se ~7 acertos — o bastante para calcular direção, distância e diâmetro. Nada disso veio de cadastro.

para yaw de -30° a +30° passo 1°:
    d = telemetro.ler()
    se valido: registra(yaw, d)

direcao  = bissetriz das bordas
diametro = distancia * abertura
se diametro fora de 2..6 m -> ABORTA
0.3 Aproximação até 6 m sensor: ambos

Aproximação a 0,5 m/s. Ao cruzar os 8 m o LiDAR entra em alcance e a fatia ganha vida: aparece um ARCO DE CÍRCULO. A partir daqui há DUAS medidas independentes da mesma distância. Divergência acima de 0,5 m interrompe a aproximação.

enquanto d_telemetro > 8.0:
    avanca(0.5 m/s)
    se |d_lidar - d_telemetro| > 0.5: PARA
    se d_telemetro < 6.0: RECUA
0.4 Perfilamento vertical da torre sensor: ambos

Subida a 0,3 m/s, perfilando. É o coração da técnica. O LiDAR mede uma fatia horizontal 10× por segundo; a subida empilha as fatias, e a pilha É a nuvem 3D. · entre fatias: 3 cm · dentro da fatia: 7,5 cm a 6 m A fatia é sempre um ARCO DE CÍRCULO — e um círculo determina completamente as duas coordenadas horizontais. Casar fatias sucessivas dá posição centimétrica SEM GNSS. É por isto que a missão dispensa RTK.

a cada fatia (10 Hz):
    pontos = C1.ler()
    circ   = RANSAC_circulo(pontos)
    registra(altura, circ.centro, circ.raio)
    delta  = ICP_2D(fatia, anterior)
    pose.corrige(delta)
    nuvem.acumula(pontos, pose)

eixo_torre = ajuste_reta(centros)
0.5 Topo da torre e nacele sensor: ambos

RECUO obrigatório: o NARIZ da nacele avança 8,7 m à frente do eixo da torre — 1,2 m além do próprio plano do rotor. Manter 8,0 m do eixo — o afastamento do perfilamento — colocaria o drone 0,7 m DENTRO do envelope dela. O recuo para 13,5 m devolve 4,8 m de folga. No topo, dois eventos. O arco circular ACABA — e é isso que define a ALTURA DO CUBO, medida e não lida de cadastro. E surge um RETÂNGULO de 3,0 × 7,7 m: o lado maior dá o EIXO da máquina. Um retângulo, porém, é simétrico: dá a reta, não o sentido. Quem desfaz os 180° é a assimetria — a caixa não é centrada no eixo da torre, avança para o lado do rotor. Como o eixo da torre já foi medido na subida, o sentido sai da comparação.

se altura > cubo_estimado - 15:
    afastamento = 13.5 m do EIXO

se circulo falhar por N fatias:
    altura_cubo = ultima valida

caixa    = caixa_minima(pontos_nacele)
eixo_maq = lado maior da caixa       // reta: 180 ambiguo
off      = centroide(caixa) - eixo_torre
yaw_nacele = eixo_maq orientado por off
Fase A · modelo, de perto
A.1 Aproximação da raiz da P1 sensor: lidar

Aproximação SEMPRE PELA RAIZ. O rotor foi freado com intenção de parar em Mercedes, mas não para exatamente ali. Um desvio de azimute desloca a pá proporcionalmente ao raio: 20° de desvio → 3,7 m na raiz → 20,5 m na ponta Adquirir no meio seria apostar. Esta etapa para a 13 m laterais do eixo da pá; somando a profundidade, a pá ainda está a cerca de 15 m — FORA de alcance. A aquisição não acontece aqui: ela se dá durante o fechamento da etapa seguinte, à medida que a seção entra nos 8 m do sensor.

raiz_prevista = cubo + direcao * 10.8 m
voa_ate(raiz_prevista + normal * 13 m)

// fora de alcance aqui: quem adquire e a etapa A.1b,
// fechando ate a secao aparecer na fatia
A.1b Fechamento para 6 m sensor: lidar

Só agora fecha para 6 m, adquirindo a pá durante a aproximação. A aproximação é feita de LADO, dentro do plano do rotor. Com as pás embandeiradas a corda fica alinhada com barlavento-sotavento: de frente, o drone veria só o bordo de ataque, de poucos centímetros aparentes. De lado, vê a corda inteira.

enquanto d_lidar > 8.0:
    aproxima(0.5 m/s)
    se secao vazia: PARA
    se d_lidar < 6.0: RECUA
A.2 Seguimento da P1 — raiz à ponta sensor: lidar

Seguimento a 0,3 m/s e 6 m de afastamento. Esta pá é vertical e a fatia a corta PERPENDICULARMENTE: cada fatia é literalmente uma SEÇÃO DE AEROFÓLIO. Corda, passo e torção saem direto, sem inferência. A pá nunca sai do alcance: a cada instante sabe-se onde ela está porque está sendo MEDIDA.

a cada fatia:
    secao = agrupa_alvo(C1.ler())
    d     = distancia_minima(secao)
    corrige_afastamento(d -> 6.0 m)
    corda = maior extensao
    passo = angulo(corda, plano_rotor)
    nuvem.acumula(pontos, pose)
A.2b Trânsito P1 → raiz da P2 sensor: lidar · trânsito

Trânsito calculado sobre o MODELO PARCIAL já construído — torre, cubo, nacele e P1 inteira — e não sobre cadastro. O LiDAR segue em modo guarda.

rota = contorna(cubo, raio_seguranca)
C1.modo = GUARDA
velocidade = 1.5 m/s
A.3 Seguimento da P2 — corte oblíquo sensor: lidar

Aqui está a pergunta que costuma travar o raciocínio: o eixo da P2 está 30° abaixo da horizontal, e a fatia a corta OBLIQUAMENTE. Isso estraga o modelo? NÃO. O perfil aparece ALONGADO 2× — exatamente 1/sen(30°). E não é problema porque O MODELO NÃO PRECISA DE CORTES PERPENDICULARES. Precisa de PONTOS SOBRE A SUPERFÍCIE. A seção verdadeira sai depois, em software.

// o codigo nao muda; muda a trajetoria
direcao = (cos 210, sin 210)
// desce 0.5 m e translada 0.87 m
// a cada 1 m de avanco
stretch = 1 / |sin(elevacao)|   // = 2.0
A.3b Trânsito P2 → ponto alto sensor: lidar · trânsito

A reta direta até a P3 passaria rente à própria P2, ao longo de quase toda a envergadura. Não é perigoso — a P2 acabou de ser medida ponto a ponto — mas voar a 5 m de qualquer coisa sem necessidade é gastar margem à toa.

// folga de PLANEJAMENTO, medida contra o modelo
// ja construido — nao e alcance de sensor
para cada segmento da rota:
    se folga_geometrica < 12 m: recalcula com waypoint
C1.modo = GUARDA
A.3c Descida à raiz da P3 sensor: lidar · trânsito

Mesma lógica da P1: chega-se pela raiz, e o fechamento até 6 m é que traz a pá para dentro do alcance. A esta altura já estão construídos: torre, cubo, nacele, P1 e P2 inteiras.

direcao_P3 = rotaciona(eixo_P1_medido, +240°)
voa_ate(raiz_P3 + normal * 8 m)
aguarda aquisicao
A.4 Seguimento da P3 sensor: lidar

Espelhada da P2. Ao final, a nuvem contém a torre, a nacele e as três pás. Densidade típica por pá: ~1.630 fatias, ~26 pontos por fatia na corda, cerca de 42 mil pontos por face — ~442 pontos por metro quadrado.

azimute_medido = mediana(eixos ajustados)

// PORTAO DE QUALIDADE
se |ang(P1,P2) - 120| > 3: REJEITA
se residuo_rms > 25 cm:    REJEITA
A.5 Re-fatiamento em software sensor: nenhum

O passo que dissolve o problema do corte oblíquo — e acontece INTEIRAMENTE EM SOFTWARE, com o drone pairando. 1 · ajustar o EIXO de cada pá sobre a nuvem 2 · cortar em planos PERPENDICULARES a esse eixo 3 · extrair corda, passo e torção Só agora o operador recebe o modelo, revisa e confirma. Nenhuma trajetória de percepção voa sem confirmação humana.

para cada pa:
    eixo = PCA(nuvem_pa)
    para r de 10.8 a 60 passo 0.5:
        secao = nuvem ∩ plano_perp(eixo, r)
        corda(r), passo(r)

envia_por_MOP(modelo)   // ~400 bytes
aguarda CONFIRMACAO DO OPERADOR
Fase B · fotografia, de longe
B.0 Recuo para o afastamento fotográfico sensor: guarda

Recuo para 15 m. A fatia ESVAZIA: a pá está fora do alcance do LiDAR. Ele não fica ocioso — passa a GUARDA DE PROXIMIDADE 360°: não vê a pá, mas vê qualquer coisa que entre em 8 m. Por que 15 m e não 25? A 15 m os dois níveis de resolução saem da mesma posição, só mudando o zoom: varredura a 1,0 mm/px e detalhe a 0,3 mm/px. A 25 m o detalhe exigiria focal acima da disponível.

C1.modo = GUARDA_PROXIMIDADE
a cada fatia:
    se d_min < 8 m e nao previsto: PARA

// navegacao passa a ser pelo MODELO
B1 P1 · 12 h · intradorso sensor: guarda

Passagem 1 de 12 — P1 · 12 h, INTRADORSO. Da raiz até a ponta, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície dentro do plano do rotor. Com as pás embandeiradas, intradorso e extradorso olham tangencialmente, não para barlavento.

face  = IN   (s=1, t=0)
n     = normal_da_face(modelo.pa[0], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[0][0] = CONCLUIDA
↻ arco → bordo de ataque sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de intradorso para bordo de ataque. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 0   // intradorso
theta1 = 90   // bordo de ataque
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B2 P1 · 12 h · bordo de ataque sensor: guarda

Passagem 2 de 12 — P1 · 12 h, BORDO DE ATAQUE. Da ponta até a raiz, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. O bordo de ataque é a superfície mais crítica: é onde ocorre a erosão. Merece o maior GSD.

face  = BA   (s=0, t=1)
n     = normal_da_face(modelo.pa[0], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[0][1] = CONCLUIDA
↻ arco → extradorso sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de bordo de ataque para extradorso. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 90   // bordo de ataque
theta1 = 180   // extradorso
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B3 P1 · 12 h · extradorso sensor: guarda

Passagem 3 de 12 — P1 · 12 h, EXTRADORSO. Da raiz até a ponta, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície dentro do plano do rotor. Com as pás embandeiradas, intradorso e extradorso olham tangencialmente, não para barlavento.

face  = EX   (s=-1, t=0)
n     = normal_da_face(modelo.pa[0], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[0][2] = CONCLUIDA
↻ arco → bordo de fuga sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de extradorso para bordo de fuga. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 180   // extradorso
theta1 = 270   // bordo de fuga
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B4 P1 · 12 h · bordo de fuga sensor: guarda

Passagem 4 de 12 — P1 · 12 h, BORDO DE FUGA. Da ponta até a raiz, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície a sotavento: o drone passa atrás do plano do rotor. Em Mercedes há folga — nenhuma pá aponta para baixo.

face  = BF   (s=0, t=-1)
n     = normal_da_face(modelo.pa[0], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[0][3] = CONCLUIDA
↻ sobe ao ponto de trânsito sensor: guarda · trânsito

Troca de pá. A estação anterior é a de bordo de fuga, a sotavento. Uma reta até a primeira da pá seguinte passaria rente à TORRE. A rota sobe para um ponto atrás do plano do rotor, 26 m para o lado e 16 m acima do cubo — cada uma das três escolhas resolve um conflito do traçado.

reta = segmento(atual, proxima)
// folga GEOMETRICA contra o modelo, nao alcance
se folga(reta, modelo) < 12 m:
    rota = [atual, PT_TRANSITO, proxima]
↻ desce → P2 · 4 h sensor: guarda · trânsito

Descida à primeira estação da P2 · 4 h. A posição sai de girar o afastamento de 15 m em torno do eixo, a partir da direção da corda MEDIDA na Fase A.

n    = normal_da_face(modelo.pa[1], IN)
alvo = ponto_da_pa(10.8 m) + n * 15 m
B5 P2 · 4 h · intradorso sensor: guarda

Passagem 5 de 12 — P2 · 4 h, INTRADORSO. Da raiz até a ponta, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície dentro do plano do rotor. Com as pás embandeiradas, intradorso e extradorso olham tangencialmente, não para barlavento.

face  = IN   (s=1, t=0)
n     = normal_da_face(modelo.pa[1], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[1][0] = CONCLUIDA
↻ arco → bordo de ataque sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de intradorso para bordo de ataque. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 0   // intradorso
theta1 = 90   // bordo de ataque
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B6 P2 · 4 h · bordo de ataque sensor: guarda

Passagem 6 de 12 — P2 · 4 h, BORDO DE ATAQUE. Da ponta até a raiz, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. O bordo de ataque é a superfície mais crítica: é onde ocorre a erosão. Merece o maior GSD.

face  = BA   (s=0, t=1)
n     = normal_da_face(modelo.pa[1], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[1][1] = CONCLUIDA
↻ arco → extradorso sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de bordo de ataque para extradorso. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 90   // bordo de ataque
theta1 = 180   // extradorso
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B7 P2 · 4 h · extradorso sensor: guarda

Passagem 7 de 12 — P2 · 4 h, EXTRADORSO. Da raiz até a ponta, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície dentro do plano do rotor. Com as pás embandeiradas, intradorso e extradorso olham tangencialmente, não para barlavento.

face  = EX   (s=-1, t=0)
n     = normal_da_face(modelo.pa[1], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[1][2] = CONCLUIDA
↻ arco → bordo de fuga sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de extradorso para bordo de fuga. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 180   // extradorso
theta1 = 270   // bordo de fuga
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B8 P2 · 4 h · bordo de fuga sensor: guarda

Passagem 8 de 12 — P2 · 4 h, BORDO DE FUGA. Da ponta até a raiz, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície a sotavento: o drone passa atrás do plano do rotor. Em Mercedes há folga — nenhuma pá aponta para baixo.

face  = BF   (s=0, t=-1)
n     = normal_da_face(modelo.pa[1], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[1][3] = CONCLUIDA
↻ sobe ao ponto de trânsito sensor: guarda · trânsito

Troca de pá. A estação anterior é a de bordo de fuga, a sotavento. Uma reta até a primeira da pá seguinte passaria rente à TORRE. A rota sobe para um ponto atrás do plano do rotor, 26 m para o lado e 16 m acima do cubo — cada uma das três escolhas resolve um conflito do traçado.

reta = segmento(atual, proxima)
// folga GEOMETRICA contra o modelo, nao alcance
se folga(reta, modelo) < 12 m:
    rota = [atual, PT_TRANSITO, proxima]
↻ desce → P3 · 8 h sensor: guarda · trânsito

Descida à primeira estação da P3 · 8 h. A posição sai de girar o afastamento de 15 m em torno do eixo, a partir da direção da corda MEDIDA na Fase A.

n    = normal_da_face(modelo.pa[2], IN)
alvo = ponto_da_pa(10.8 m) + n * 15 m
B9 P3 · 8 h · intradorso sensor: guarda

Passagem 9 de 12 — P3 · 8 h, INTRADORSO. Da raiz até a ponta, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície dentro do plano do rotor. Com as pás embandeiradas, intradorso e extradorso olham tangencialmente, não para barlavento.

face  = IN   (s=1, t=0)
n     = normal_da_face(modelo.pa[2], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[2][0] = CONCLUIDA
↻ arco → bordo de ataque sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de intradorso para bordo de ataque. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 0   // intradorso
theta1 = 90   // bordo de ataque
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B10 P3 · 8 h · bordo de ataque sensor: guarda

Passagem 10 de 12 — P3 · 8 h, BORDO DE ATAQUE. Da ponta até a raiz, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. O bordo de ataque é a superfície mais crítica: é onde ocorre a erosão. Merece o maior GSD.

face  = BA   (s=0, t=1)
n     = normal_da_face(modelo.pa[2], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[2][1] = CONCLUIDA
↻ arco → extradorso sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de bordo de ataque para extradorso. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 90   // bordo de ataque
theta1 = 180   // extradorso
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B11 P3 · 8 h · extradorso sensor: guarda

Passagem 11 de 12 — P3 · 8 h, EXTRADORSO. Da raiz até a ponta, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície dentro do plano do rotor. Com as pás embandeiradas, intradorso e extradorso olham tangencialmente, não para barlavento.

face  = EX   (s=-1, t=0)
n     = normal_da_face(modelo.pa[2], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[2][2] = CONCLUIDA
↻ arco → bordo de fuga sensor: guarda · trânsito

Quarto de arco em torno do eixo da pá, de extradorso para bordo de fuga. Na Vista 02 a trajetória CONTORNA a pá, não corta por dentro. Bordo de ataque e de fuga ficam em lados opostos do plano do rotor. Por isso a ordem é intradorso → bordo de ataque → extradorso → bordo de fuga: cada salto é de 90°, nunca de 180°.

theta0 = 180   // extradorso
theta1 = 270   // bordo de fuga
para th de theta0 a theta1 passo 5:
    ponto = pa(r) + 15 * (cos th * p + sin th * n)
    // folga GEOMETRICA contra o modelo:
    verifica_folga(ponto) >= 12 m
B12 P3 · 8 h · bordo de fuga sensor: guarda

Passagem 12 de 12 — P3 · 8 h, BORDO DE FUGA. Da ponta até a raiz, 49 m de envergadura, a 1,0 m/s, gimbal perpendicular à superfície. Disparo em intervalo durante o movimento: ~18 fotos a 1,0 mm/px. Superfície a sotavento: o drone passa atrás do plano do rotor. Em Mercedes há folga — nenhuma pá aponta para baixo.

face  = BF   (s=0, t=-1)
n     = normal_da_face(modelo.pa[2], face)
linha = eixo_pa deslocado de 15 m ao longo de n
gimbal.aponta(-n)
camera.intervalo(passo = 2.72 m, 1/1000 s)
percorre(linha, 1.0 m/s)
progresso[2][3] = CONCLUIDA
R1 P1 · 12 h · arco da raiz sensor: guarda

Arco da raiz — o trecho de 0 a 10,8 m, que NÃO é coberto pelas 12 passagens. Até 18 % da envergadura a pá ainda é o CILINDRO do rolamento de passo: não existem ali as quatro faces. O que faz sentido é ORBITAR o eixo. E não é região secundária: é onde o MOMENTO FLETOR É MÁXIMO, onde ficam os parafusos de raiz e a linha de colagem. Órbita completa: esta pá aponta para cima e não há torre no caminho.

r_raiz = 5,4 m
d      = 14 m
arco   = varredura_numerica(folga >= 5 m)
para th no arco, passo 60 graus:
    ponto = pa(r) + d * (cos th * p + sin th * n)
    aponta_gimbal(eixo da pa); dispara()
R2 P2 · 4 h · arco da raiz sensor: guarda

Arco da raiz — o trecho de 0 a 10,8 m, que NÃO é coberto pelas 12 passagens. Até 18 % da envergadura a pá ainda é o CILINDRO do rolamento de passo: não existem ali as quatro faces. O que faz sentido é ORBITAR o eixo. E não é região secundária: é onde o MOMENTO FLETOR É MÁXIMO, onde ficam os parafusos de raiz e a linha de colagem. Arco de 290°, não 360°: um setor cairia na zona de exclusão da torre — e ele inclui o lado de SOTAVENTO. A face de trás continua inspecionada, das duas estações que flanqueiam o setor, a apenas 35° de incidência. Zero grau de circunferência sem cobertura útil. O preço é GSD efetivo 1,22× o nominal, compensado com mais zoom nessas duas estações.

r_raiz = 5,4 m
d      = 14 m
arco   = varredura_numerica(folga >= 5 m)
para th no arco, passo 60 graus:
    ponto = pa(r) + d * (cos th * p + sin th * n)
    aponta_gimbal(eixo da pa); dispara()
R3 P3 · 8 h · arco da raiz sensor: guarda

Arco da raiz — o trecho de 0 a 10,8 m, que NÃO é coberto pelas 12 passagens. Até 18 % da envergadura a pá ainda é o CILINDRO do rolamento de passo: não existem ali as quatro faces. O que faz sentido é ORBITAR o eixo. E não é região secundária: é onde o MOMENTO FLETOR É MÁXIMO, onde ficam os parafusos de raiz e a linha de colagem. Arco de 290°, não 360°: um setor cairia na zona de exclusão da torre — e ele inclui o lado de SOTAVENTO. A face de trás continua inspecionada, das duas estações que flanqueiam o setor, a apenas 35° de incidência. Zero grau de circunferência sem cobertura útil. O preço é GSD efetivo 1,22× o nominal, compensado com mais zoom nessas duas estações.

r_raiz = 5,4 m
d      = 14 m
arco   = varredura_numerica(folga >= 5 m)
para th no arco, passo 60 graus:
    ponto = pa(r) + d * (cos th * p + sin th * n)
    aponta_gimbal(eixo da pa); dispara()
RTH Retorno e pouso sensor: guarda

Missão concluída. · UM LiDAR de US$ 100, 110 g, 2,5 W · SEM odometria inercial, SEM IMU · carga de CPU abaixo de 5 % · SEM cadastro obrigatório: torre, cubo e nacele foram medidos · SEM RTK: a navegação é relativa e medida pelo sensor O preço: a distância de reação cai de ~60 m para 8 m, e o afastamento de percepção para 6 m. Risco gerenciável por procedimento — aproximação pela raiz, contato contínuo, aborto por discrepância.

retorno_monitorado_ate_pouso()

// ENSAIO PENDENTE, ELIMINATORIO:
//   alcance util do C1 sob sol direto,
//   contra gel coat branco.
//   Decide a arquitetura de percepcao.