From 719a71917dddf9305da877c23dd419766ceb9f34 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Wed, 1 Jul 2026 15:00:06 -0300 Subject: [PATCH] adicionado inversao no eixo de movimento do weed_detector --- .../workers/weed_worker/weed_detector.py | 77 +++++++++++++++---- 1 file changed, 64 insertions(+), 13 deletions(-) diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py index a46614649..2845ef673 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py @@ -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 = pé 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 = pé 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 -> pé + old[20] -> new[21] + + Invertido: + erva caminha pé -> 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(