adicionado inversao no eixo de movimento do weed_detector

This commit is contained in:
Diego Freitas 2026-07-01 15:00:06 -03:00
parent 84e2c88b4f
commit 719a71917d
1 changed files with 64 additions and 13 deletions

View File

@ -71,6 +71,13 @@ class WeedDetector:
self.config.get("inverter_ordem_bicos", False)
)
# TESTE INLINE:
# False = lógica atual: erva caminha topo -> pé
# True = lógica invertida: erva caminha pé -> topo
self.inverter_sentido_vertical_bicos = bool(
self.config.get("inverter_sentido_vertical_bicos", True)
)
self.detector_debug_perf = bool(
self.config.get("detector_debug_perf", False)
)
@ -145,16 +152,15 @@ class WeedDetector:
"""
Converte os dois parâmetros de campo para zona de atuação normalizada.
Convenção:
Convenção interna:
0.0 = topo da imagem
1.0 = da imagem
Exemplo:
faixa_atuacao_bicos = 0.70
area_atuacao_bicos = 0.10
Normal:
faixa=0.90, area=0.10 -> 90% até 100%, embaixo.
Resultado:
zona de atuação = 70% até 80% da imagem
Com inverter_sentido_vertical_bicos=True:
faixa=0.90, area=0.10 -> 0% até 10%, em cima.
"""
faixa = float(cfg.get("faixa_atuacao_bicos", 0.70) or 0.70)
@ -172,6 +178,17 @@ class WeedDetector:
if fim < inicio:
inicio, fim = fim, inicio
if getattr(self, "inverter_sentido_vertical_bicos", False):
# Espelha verticalmente.
# Exemplo: 0.90..1.00 vira 0.00..0.10.
inicio, fim = 1.0 - fim, 1.0 - inicio
inicio = max(0.0, min(1.0, inicio))
fim = max(0.0, min(1.0, fim))
if fim < inicio:
inicio, fim = fim, inicio
return inicio, fim
def atualizar_config(self, config: Optional[dict] = None):
@ -187,6 +204,7 @@ class WeedDetector:
old_qtd = self.qtd_bicos
old_inv = self.inverter_ordem_bicos
old_inv_vertical = getattr(self, "inverter_sentido_vertical_bicos", False)
old_num_cells = getattr(self, "num_cells", None)
old_cell_cm = getattr(self, "cell_cm", None)
old_comp_cm = getattr(self, "comprimento_visao_chao_cm", None)
@ -219,12 +237,19 @@ class WeedDetector:
self.inverter_ordem_bicos,
)
)
self.inverter_sentido_vertical_bicos = bool(
self.config.get(
"inverter_sentido_vertical_bicos",
self.inverter_sentido_vertical_bicos,
)
)
self._atualizar_geometria_memoria()
mudou_mapeamento = (
old_qtd != self.qtd_bicos
or old_inv != self.inverter_ordem_bicos
or old_inv_vertical != self.inverter_sentido_vertical_bicos
or old_num_cells != self.num_cells
or old_cell_cm != self.cell_cm
or old_comp_cm != self.comprimento_visao_chao_cm
@ -488,6 +513,10 @@ class WeedDetector:
"grid": grid_info,
"score_update": score_update_info,
"atuacao": estat_atuacao,
"sentido_vertical_invertido": bool(
getattr(self, "inverter_sentido_vertical_bicos", False)
),
}
return atuacao_bicos, estatisticas
@ -564,14 +593,19 @@ class WeedDetector:
shift_cells: float,
) -> np.ndarray:
"""
Desloca a memória para baixo na imagem.
Desloca a memória na direção física da atuação.
Convenção interna:
cell 0 = topo da imagem
cell N-1 = da imagem
Se o rover avançou, o que estava na célula 20 vai para 21, 22...
Portanto:
new[i] = old[i - shift]
Normal:
erva caminha topo ->
old[20] -> new[21]
Invertido:
erva caminha -> topo
old[80] -> new[79]
"""
if grid.size == 0:
return grid
@ -585,7 +619,13 @@ class WeedDetector:
return np.zeros_like(grid, dtype=np.float32)
idx = np.arange(n, dtype=np.float32)
src = idx - float(shift_cells)
if getattr(self, "inverter_sentido_vertical_bicos", False):
# Move a memória para cima: índices diminuem.
src = idx + float(shift_cells)
else:
# Move a memória para baixo: índices aumentam.
src = idx - float(shift_cells)
shifted = np.zeros_like(grid, dtype=np.float32)
@ -749,8 +789,15 @@ class WeedDetector:
# porque elas chegarão na zona quando o bico abrir de fato.
antecipacao_frac = max(0.0, vel_mps * lat_s * k_shift)
zona_eval_ini_frac = zona_ini_frac - antecipacao_frac
zona_eval_fim_frac = zona_fim_frac - antecipacao_frac
if getattr(self, "inverter_sentido_vertical_bicos", False):
# Se a erva vem do pé para o topo, antecipar significa olhar
# um pouco abaixo da zona real, pois ela ainda vai subir até o bico.
zona_eval_ini_frac = zona_ini_frac + antecipacao_frac
zona_eval_fim_frac = zona_fim_frac + antecipacao_frac
else:
# Lógica atual: erva vem do topo para o pé.
zona_eval_ini_frac = zona_ini_frac - antecipacao_frac
zona_eval_fim_frac = zona_fim_frac - antecipacao_frac
zona_eval_ini_frac = max(0.0, min(1.0, zona_eval_ini_frac))
zona_eval_fim_frac = max(0.0, min(1.0, zona_eval_fim_frac))
@ -841,6 +888,10 @@ class WeedDetector:
if zona_scores.size
else np.zeros(self.qtd_bicos, dtype=np.float32)
),
"sentido_vertical_invertido": bool(
getattr(self, "inverter_sentido_vertical_bicos", False)
),
}
def _agregar_score_zona(