Visão Geral
Nossa solução de roteamento de última geração suporta campos arbitrariamente complexos, navegação de cabeceiras e muitas outras opções configuráveis. Nesta página você encontrará exemplos e explicações dos diversos recursos de roteamento, além de protótipos experimentais novos e empolgantes.
Modelagem de Curvas
Suportamos vários tipos de curva, escolhidos automaticamente de acordo com uma combinação da geometria do campo e das características dos equipamentos. Se duas faixas estiverem a menos de 3 larguras de passagem uma da outra, tentaremos conectá-las diretamente com uma curva. Se as faixas estiverem mais afastadas, ou se não couber nenhuma curva, realizaremos o que chamamos de travessia de cabeceira, explicada com mais detalhes abaixo.
Conectores Faixa-Faixa
Para conexões diretas de faixa a faixa, suportamos os seguintes tipos de curva:
Curva em U
Quando o raio de curva é inferior a 50% da largura de passagem, curvas em U como esta serão geradas para faixas adjacentes. Há uma opção para estender o segmento reto até a cabeceira, dando mais espaço para realizar a curva e minimizando o pisoteio.
Curva em U Perfeita
Quando o raio de curva é exatamente 50% da largura de passagem, curvas em U perfeitas como esta serão geradas para faixas adjacentes, sem segmento reto intermediário.
Curva em Bulbo
Quando o raio de curva é superior a 50% da largura de passagem, uma curva em bulbo é usada para conectar duas faixas adjacentes. Este tipo só seria utilizado se uma curva em U não coubesse.
Curva em P
Se a cabeceira estiver em um ângulo agudo em relação à curva e o raio de curva for suficientemente grande, suportamos curvas em P para minimizar a quantidade de direção necessária.
Conectores Faixa-Cabeceira
Quando uma conexão direta não é possível, conectamos a uma cabeceira próxima, realizando uma ou mais travessias de cabeceira para unir duas faixas. Isso nos permite criar caminhos entre quase quaisquer duas faixas do campo inteiro sem cruzar o campo de forma inválida fora de uma zona de cabeceira.
Conectores em Arco
Por padrão, tentamos usar conectores em arco, que têm curvatura constante e raio de curva pelo menos tão grande quanto o raio mínimo de viragem. Isso permite uma transição suave da faixa para a cabeceira sem movimentos bruscos. A curva pode ser encurtada automaticamente se não houver espaço suficiente para completá-la sem que o veículo ultrapasse o limite do campo.
Conectores Dubins
Se um conector em arco falhar, é realizada uma busca para conectar um conector Dubins a vários pontos da cabeceira na direção de deslocamento desejada, até encontrar um válido que minimize a variação total de ângulo.
Conector de Reserva
Como último recurso, criamos um conector de reserva que simplesmente une os dois pontos diretamente (seja entre duas faixas ou faixa-cabeceira) e aparece na interface como uma grande linha vermelha. O usuário deve realizar essa curva manualmente antes de continuar a rota.
Encurtamento de Curvas
Se uma curva não couber de uma faixa para outra ou para uma cabeceira sem que alguma parte do veículo ultrapasse o limite do campo, e se a configuração "Encurtar Faixas" estiver ativada, a curva será encurtada, ou seja, iniciará antes do fim da faixa para conseguir realizá-la. Infelizmente isso causa uma área perdida, a menos que seu veículo consiga recuar antes de fazer a curva (trabalhos futuros suportarão essa funcionalidade se houver demanda). Se você notar que muita área está sendo perdida, provavelmente não há cabeceiras suficientes com base no raio de curva do seu veículo, e pode ser necessário replanejar com mais cabeceiras. No roadmap está a sugestão automática de número de cabeceiras com base no seu campo e equipamento.
Extensão de Curvas
Em algumas situações, pode ser desejável estender as curvas mais fundo na cabeceira. Isso pode ser ativado pela configuração "Estender Curvas nas Cabeceiras". Se a curva couber, ela será estendida até tocar a cabeceira mais externa. Isso oferece mais espaço para curvar e endireitar, minimizando o pisoteio. Trabalhos futuros incluem sempre latar nas cabeceiras quando possível para minimizar ainda mais o pisoteio.
Conexões de Cabeceira Encurtadas
Curvas adjacentes encurtadas para caber na cabeceira serão convertidas em travessias de cabeceira quando possível. Isso pode ser ativado pela configuração "Preferir Conexões de Cabeceira Encurtadas". Trabalhos futuros incluem habilitar isso para todas as conexões faixa-faixa.
Sem Configuração
A curva é encurtada para apenas tocar a cabeceira, mas não percorre ao longo dela.
Com Configuração
As conexões são feitas ao longo da cabeceira entre conectores adjacentes, minimizando o pisoteio.
Algoritmos / Padrões
Algoritmo Padrão
Por padrão, modelamos o problema como uma instância do Problema de Roteamento Agrícola (ARP), que é a versão agrícola do bem conhecido Problema de Roteamento de Veículos. É o que se conhece como NP-difícil, ou seja, não existem algoritmos que possam resolver eficientemente todas as instâncias possíveis do problema de forma perfeita. Por isso desenvolvemos um solver meta-heurístico personalizado para resolver o ARP, codificando os padrões dos produtores na própria matriz de custos, gerando uma rota capaz de navegar pelos campos mais complexos em questão de minutos ou até segundos.
Nosso solver de roteamento calcula as distâncias de/para cada par possível de faixas no campo, usando rotas exatas para faixas na mesma área e estimativas inteligentes para faixas no lado oposto do campo. Isso cria o que se chama de matriz de distâncias, que é então alimentada ao nosso solver proprietário para otimizar um caminho que percorra cada faixa e cabeceira, minimizando a distância não trabalhada. Nenhuma suposição prévia é feita sobre o padrão de trabalho; os resultados são baseados exclusivamente nas distâncias calculadas entre elas. Isso permite que o solver tenha uma visão notável em certos momentos, pulando uma ou mais faixas que não são imediatamente óbvias para o usuário, apenas para usá-las depois para sair eficientemente de uma situação em que uma abordagem tradicional ficaria presa.
Início/Fim Padrão
O comportamento padrão vai de um lado do campo ao outro, começando pela borda reta se definida.
Início/Fim Personalizado
Nosso algoritmo padrão também permite definir o ponto de início e fim onde desejar no campo.
Evitar Pular Passagens
Quando ativado, o custo de deslocamento para uma faixa adjacente é reduzido à metade. Isso encoraja (mas não força) um padrão mais reto, ao custo potencial de maior distância não trabalhada ou, no caso abaixo, maior área perdida. No exemplo abaixo, outra cabeceira pode ser preferível para que as curvas caibam.
Conectores Adjacentes com Peso Normal
As conexões no topo do campo se conectam à cabeceira por causa do menor custo, mas o campo não é executado de forma uniforme.
Distância total: 15,15 km
Área perdida: 3,65 ha
Evitar Pular Passagens
As travessias de cabeceira são substituídas por curvas adjacentes. Devido ao grande raio de curva, estas são curvas em bulbo e, por haver apenas uma cabeceira, são encurtadas significativamente. O usuário pode precisar planejar duas cabeceiras se quiser adjacência.
Distância total: 15,45 km
Área perdida: 4,89 ha
Faixas Contínuas (Boustrophedon)
Um padrão predefinido de ida e volta, começando de um lado do campo e indo até o outro. Ótimo para campos simples e aqueles com pequenos obstáculos.
Se você notar que há travessias de cabeceira em excesso, recomendamos executar nosso algoritmo padrão e ativar "Evitar Pular Passagens". Isso evitará casos extremos de travessias de cabeceira, ao custo de perder a uniformidade.
Espiral Agrupada
Um padrão predefinido que impõe sempre ao menos um salto de N faixas em um padrão de avançar e depois retornar. Funciona melhor em campos simples e com pequenos obstáculos.
Cobra
O padrão cobra cobre o campo pulando uma faixa a cada curva e depois retornando pelas faixas não cobertas. Reduz o número de curvas acentuadas.
Roteamento por Capacidade
Se o usuário especificar capacidade e vazão para seu veículo, poderá acessar nossos diversos recursos de roteamento por capacidade. Atualmente temos dois fluxos de trabalho separados para isso. O primeiro é Veículo Único, que é o tipo de rota mostrado acima, sem área de preparo e apenas um veículo trabalhando. O outro é Múltiplos Veículos com Capacidade, em que um ou mais veículos partem de uma área de preparo e podem trabalhar faixas até atingirem sua capacidade, momento em que retornarão ao depósito de preparo pelas cabeceiras.
Exato
Se ativado, o usuário pode ver exatamente onde ficará sem produto no campo. Passando o cursor sobre um ponto, serão exibidos a capacidade restante, a área total restante a cobrir e a área até o próximo ponto.
Início da Faixa
Se ativado, os pontos de reabastecimento anteriores serão movidos para o início da faixa em que o produto acabou. Isso garante que o produtor não fique sem produto no meio de uma faixa.
Cabeceira Exterior Mais Próxima
Semelhante ao início da faixa, mas o ponto será recuado na rota até atingir um lado exterior do campo, evitando que o usuário fique sem produto no meio do campo ou próximo a um obstáculo, garantindo que sempre consiga chegar à área de preparo.
Múltiplos Veículos com Área de Preparo
Atualmente é uma configuração experimental em desenvolvimento. As rotas podem não estar bem otimizadas e podem se comportar de forma estranha ou até mesmo travar até que as desenvolvamos mais.
Se ativado, uma área de preparo será determinada estendendo primeiro a faixa mediana do campo e escolhendo um ponto no limite que a intercepte. A ideia é ter uma área de preparo aproximadamente central, mas trabalhos futuros incluem a opção de definir uma ou mais áreas de preparo possíveis para retorno. As áreas de preparo são definidas atualmente como um único ponto no limite.
A rota agora começará e terminará na área de preparo e, quando necessário, o veículo realizará uma travessia de cabeceira de volta para reabastecimento/descarga. O otimizador considera o custo de ir e vir da área de preparo, o que é diferente dos métodos acima, que são realizados como pós-processamento de uma rota regular sem capacidade. Na literatura acadêmica, isso é conhecido como Problema de Roteamento de Veículos com Capacidade, ou CVRP.
Experimental
Uma coleção de funcionalidades futuras e experimentais em que a equipe Verge está trabalhando. Entre em contato conosco para dúvidas ou sugestões do que você gostaria de ver a seguir.
Plano de Percurso por Dados de Log
Usando dados de log da sua máquina, podemos recriar o trajeto percorrido pelo seu veículo, permitindo reprodução de rota, análise e, em breve, planejamento a partir de dados de log. Isso permite cobrir exatamente a mesma área que uma operação anterior, ou funcionalidades mais complexas, como semeadura entre fileiras ou tratamento de fileiras com lacunas. Algoritmos inteligentes utilizam dados de log para reconstruir com precisão as faixas mesmo quando há dados ausentes.
Atualmente estamos experimentando suporte ao John Deere e ao Trimble PTx FarmENGAGE, mas se você utiliza um formato específico, ficaremos mais do que felizes em trabalhar juntos para acomodá-lo.
Recriação de Faixas a Partir de Dados de Sensor
Usando os dados do sensor, muitas vezes conseguimos recuperar a linha central original, mesmo quando alguns pontos estão ausentes ou têm leituras incorretas.
Reprodução de Rota com Dados Reais
Visualize e analise como seu campo foi trabalhado. Trabalhos futuros podem incluir análises detalhadas de quando as operações foram realizadas, por quais máquinas e sugestões de como melhorá-las.
Implementos Rebocados
Um veículo pode ter um ou mais implementos rebocados acoplados atrás dele. Atualmente modelamos o veículo principal com geometria de direção Ackermann, com o ponto de engate a uma distância fixa atrás do eixo traseiro de cada veículo e implemento. Múltiplos implementos podem ser encadeados, e assumimos que todos são não motorizados. Executamos simulações cinemáticas do veículo percorrendo nossas curvas para mostrar onde estarão os limites do seu sistema de equipamentos, alertando sobre situações perigosas de saída do campo. Trabalhos futuros incluem melhorar as curvas levando em conta o implemento rebocado, otimizar curvas para minimizar o estresse no engate e incorporar isso ao nosso algoritmo de busca.
Representação do Campo em Grade
Uma abordagem promissora usada em autonomia é discretizar a área de trabalho como uma grade, onde um tipo de busca conhecido como A* híbrido pode ser usado para encontrar o caminho direcionável mais curto entre quaisquer dois pontos da grade. Abaixo está um exemplo de parte de um campo discretizado dessa forma. As seções verdes são passagens de cabeceira e são consideradas preferíveis para deslocamento, o marrom é espaço de cabeceira válido e o vermelho é área perigosa que pode levar à saída do campo.
Todas as abordagens atuais são baseadas em métodos geométricos e, portanto, podem ter dificuldade em encontrar atalhos. Um exemplo pode ser a seção inferior, onde uma abordagem tradicional de "sempre seguir a cabeceira" pode fazer o usuário dar uma volta desnecessária ao redor do obstáculo, aumentando o tempo não produtivo. Executando um algoritmo de busca, podemos ver que talvez seja possível cruzar por ali. Essa estimativa aproximada pode ajudar a guiar uma busca mais refinada, validando que seu veículo junto com quaisquer implementos pode realmente realizar esse atalho.
Um exemplo de um veículo buscando um caminho em um sistema de grade mais simples. Observe como o planejador incorpora as dimensões do veículo. Os vários arcos verdes e marrons correspondem a possíveis trajetórias que o algoritmo percorreu antes de encontrar a solução final. Trabalhos futuros incluem uma função de penalização que evite colar nas paredes como neste vídeo, bem como diversas melhorias de desempenho, preferência por percursos ao longo das cabeceiras e integração geral com nossa solução completa de roteamento.
Mais informações sobre casos de uso potenciais e mais exemplos em breve.
Opções de Configuração
Uma lista de opções possíveis a serem passadas ao algoritmo de roteamento, com uma breve explicação. Para mais informações, consulte nossa documentação de API ou entre em contato conosco.
| Configuração | Valores Possíveis | Explicação |
|---|---|---|
Algoritmo / Padrão de Rota
algorithm
|
Verge / Continuous Tracks / Clustered Spiral / Snake Novo / Greedy | Determina o padrão de trabalho no campo |
Tipo de Problema
routeProblemType
|
SingleVehicle / CapacitatedMultiVehicles | Que tipo de problema de roteamento estamos resolvendo: veículo único sem área de preparo ou múltiplos veículos idênticos com área de preparo |
Ponto de Início
startPointNodeIndex
|
Positive integer less than 2*trackCount | Referência ao índice do nó de rota que especifica o início da rota |
Ponto de Fim
endPointNodeIndex
|
Positive integer less than 2*trackCount | Referência ao índice do nó de rota que especifica o fim da rota |
Encurtamento de Faixas
enableTrackShortening
|
true / false | Habilita o encurtamento de faixas para tornar possíveis conectores de cabeceira entre nós, caso contrário resultariam em trajetórias inválidas (por exemplo, se o raio de curva for muito grande para realizar uma curva em uma cabeceira). Padrão: true. |
Extensão de Curvas
enableTurnExtending
|
true / false | Habilita a extensão de curvas para que tentem tocar a cabeceira mais próxima do limite. O limite máximo de deslocamento é 1.4*swathWidth*headlandLoopCount, portanto em alguns casos pode ser atribuída uma cabeceira mais próxima. Observe que isso não forçará travessias de cabeceira, apenas que toque pelo menos um ponto. Padrão: false |
Passagem Direta pela Cabeceira
enableHeadlandDrivethrough
|
true / false | Se ativado, faixas nos lados opostos de uma passagem de cabeceira e dentro de um determinado limiar de distância serão forçadas como um conector reto que atravessa a cabeceira, desde que o conector com buffer não cruze o limite. Padrão: false |
Preferir Latch na Cabeceira
Novo
preferHeadlandLatching
|
true / false | Se ativado, todas as curvas para conectar faixas tentarão fazer latch na cabeceira. Ideal para CTF ou quando o pisoteio de cabeceira é uma preocupação. Só funcionará se o raio de curva for menor que 50% da largura de passagem, ou seja, curvas em bulbo não são afetadas. Padrão: true |
Ordem das Cabeceiras
headlandOrder
|
OutToIn / InToOut | Determina se as cabeceiras são concluídas antes ou depois das faixas interiores. |
headlandsFirst
Headland First
|
true / false | Se ativado, as passagens de cabeceira exteriores aparecem primeiro na rota. Caso contrário, aparecem após as faixas internas. Padrão: true |
Preferir Cabeceira Mais Externa
attachToOutermostHeadland
|
true / false | Força os conectores a fazer latch na cabeceira mais externa quando o espaço permitir. |
Preferir Conexões de Cabeceira Encurtadas
preferShortenedHeadlands
|
true / false | Força conectores que precisam ser encurtados a fazer latch na cabeceira quando o espaço permitir. |
Forçar Direção da Cabeceira
forcedDirection
|
winding / reverseWinding | A direção de enrolamento que somos forçados a tomar ao conectar a uma cabeceira. Não recomendado, pois reduz as opções do algoritmo ao escolher o melhor caminho. Null implica nenhuma direção forçada; no entanto, a direção anti-horária é sempre forçada para a travessia exterior inicial. |
Evitar Pular Passagens
preferAdjacentConnectors
|
true / false | Se true, define o custo dos conectores dubins adjacentes como metade do custo real, fazendo com que o otimizador prefira escolher faixas adjacentes, mesmo quando pode não ser vantajoso em termos de distância. Padrão: true |
Pontos de Reabastecimento
calculateRefillPoints
|
true / false | Determina se os pontos de reabastecimento devem ser calculados ao longo de uma rota. Aplica-se apenas ao problema de Veículo Único. Padrão: false |
Estratégia de Reabastecimento
refillStrategyType
|
ExactPoint / StartOfTrack / NearestHeadland | Seleciona o fluxo de reabastecimento (nó exato, início da faixa ou cabeceira exterior mais próxima) descrito em Roteamento por Capacidade. |