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) 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.detector_debug_perf = bool(
self.config.get("detector_debug_perf", False) 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. Converte os dois parâmetros de campo para zona de atuação normalizada.
Convenção: Convenção interna:
0.0 = topo da imagem 0.0 = topo da imagem
1.0 = da imagem 1.0 = da imagem
Exemplo: Normal:
faixa_atuacao_bicos = 0.70 faixa=0.90, area=0.10 -> 90% até 100%, embaixo.
area_atuacao_bicos = 0.10
Resultado: Com inverter_sentido_vertical_bicos=True:
zona de atuação = 70% até 80% da imagem faixa=0.90, area=0.10 -> 0% até 10%, em cima.
""" """
faixa = float(cfg.get("faixa_atuacao_bicos", 0.70) or 0.70) faixa = float(cfg.get("faixa_atuacao_bicos", 0.70) or 0.70)
@ -172,6 +178,17 @@ class WeedDetector:
if fim < inicio: if fim < inicio:
inicio, fim = 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 return inicio, fim
def atualizar_config(self, config: Optional[dict] = None): def atualizar_config(self, config: Optional[dict] = None):
@ -187,6 +204,7 @@ class WeedDetector:
old_qtd = self.qtd_bicos old_qtd = self.qtd_bicos
old_inv = self.inverter_ordem_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_num_cells = getattr(self, "num_cells", None)
old_cell_cm = getattr(self, "cell_cm", None) old_cell_cm = getattr(self, "cell_cm", None)
old_comp_cm = getattr(self, "comprimento_visao_chao_cm", None) old_comp_cm = getattr(self, "comprimento_visao_chao_cm", None)
@ -219,12 +237,19 @@ class WeedDetector:
self.inverter_ordem_bicos, 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() self._atualizar_geometria_memoria()
mudou_mapeamento = ( mudou_mapeamento = (
old_qtd != self.qtd_bicos old_qtd != self.qtd_bicos
or old_inv != self.inverter_ordem_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_num_cells != self.num_cells
or old_cell_cm != self.cell_cm or old_cell_cm != self.cell_cm
or old_comp_cm != self.comprimento_visao_chao_cm or old_comp_cm != self.comprimento_visao_chao_cm
@ -488,6 +513,10 @@ class WeedDetector:
"grid": grid_info, "grid": grid_info,
"score_update": score_update_info, "score_update": score_update_info,
"atuacao": estat_atuacao, "atuacao": estat_atuacao,
"sentido_vertical_invertido": bool(
getattr(self, "inverter_sentido_vertical_bicos", False)
),
} }
return atuacao_bicos, estatisticas return atuacao_bicos, estatisticas
@ -564,14 +593,19 @@ class WeedDetector:
shift_cells: float, shift_cells: float,
) -> np.ndarray: ) -> 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 0 = topo da imagem
cell N-1 = da imagem cell N-1 = da imagem
Se o rover avançou, o que estava na célula 20 vai para 21, 22... Normal:
Portanto: erva caminha topo ->
new[i] = old[i - shift] old[20] -> new[21]
Invertido:
erva caminha -> topo
old[80] -> new[79]
""" """
if grid.size == 0: if grid.size == 0:
return grid return grid
@ -585,7 +619,13 @@ class WeedDetector:
return np.zeros_like(grid, dtype=np.float32) return np.zeros_like(grid, dtype=np.float32)
idx = np.arange(n, 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) 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. # porque elas chegarão na zona quando o bico abrir de fato.
antecipacao_frac = max(0.0, vel_mps * lat_s * k_shift) antecipacao_frac = max(0.0, vel_mps * lat_s * k_shift)
zona_eval_ini_frac = zona_ini_frac - antecipacao_frac if getattr(self, "inverter_sentido_vertical_bicos", False):
zona_eval_fim_frac = zona_fim_frac - antecipacao_frac # 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_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)) zona_eval_fim_frac = max(0.0, min(1.0, zona_eval_fim_frac))
@ -841,6 +888,10 @@ class WeedDetector:
if zona_scores.size if zona_scores.size
else np.zeros(self.qtd_bicos, dtype=np.float32) else np.zeros(self.qtd_bicos, dtype=np.float32)
), ),
"sentido_vertical_invertido": bool(
getattr(self, "inverter_sentido_vertical_bicos", False)
),
} }
def _agregar_score_zona( def _agregar_score_zona(