adicionado inversao no eixo de movimento do weed_detector
This commit is contained in:
parent
84e2c88b4f
commit
719a71917d
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue