Jump to content

Cálculo de Rotas pra Robô


Psicopunk

Recommended Posts

Boas, ppl,

estou a programar rotas para um robô móvel autónomo mas tenho tido alguns problemas com a obtenção de rotas.

tenho um extracto de código que não está a funcionar como pretendo.

int calculo_rota(caminho rota[],int matriz[][MATRIZ_MAX])
{
caminho seguinte; // guarda a célula que sai do teste_periferia
seguinte.linha = 0;
seguinte.coluna= 0;
seguinte.valor = 0;
int i=0;

printf("vou calcular os pontos seguintes\n");
while(seguinte.valor != 2)
{

seguinte = teste_periferia(rota,matriz,i); // testa a periferia da celula para encontrar o passo seguinte

i++;
rota[i] = seguinte;

	if(i>=2)
	{

	//testar se estamos num mínimo local
		if(seguinte.valor == rota[i-1].valor)
		{
			if(rota[i-1].valor == rota[i-2].valor)
			{
				printf("Estamos presos num Mínimo Local\n");
				seguinte.valor = 2; //para sairmos do ciclo
				//exit(11); // código de erro em k nao se encontra um caminho por causa de dum minimo local
				return 11;				
			}
		}
	}			


}


if(rota[i].valor == 2)
{
printf("CAMINHO ENCONTRADO\n");	
}

//Printar a rota no ecra

}

O problema está quando encontro um ponto do qual não consigo avançar para o ponto objectivo. Nesse caso quero  retornar o valor 11 para uma variável que recebe a saída desta função. No entanto, ele não acaba com o ciclo e acaba por estourar...

Alguém entende o que estou a fazer mal?

Cumprimentos

Link to comment
Share on other sites

Não estou a ver nenhum erro nessa porção de código.

Para perceber melhor o que estás a fazer era melhor dares uma explicação rapida do que é a estrutura caminho e qual o significado de ter o valor 0 (que dás no seguinte) ou 2 (para terminar). Assim como o código ou explicação da função teste_periferia.

Edit: Afinal acho que tens aí um bug, mas que não é a causa do teu problema. Nunca preenches a posição 0 do array de rotas. Depois quando i é 2, vais às posições 1 e 0, mas 0 não foi inicializado.... pelo menos nesse pedaço de código.

Contudo, se disseste k não termina o ciclo, é porque existem mais problemas...

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

A posição 0 do vector rota[ ] é preenchida antes de entrar naquela função pois é o ponto inicial ( onde o robô  se encontra actualmente).

A estrutura caminho guarda a linha e coluna da matriz e o valor guardado na matriz[linha][coluna]. Pois o que eu pensei foi criar uma espécie de campo gravitacional em volta do Ponto Objectivo( o valor aqui é 2)

Qt mais longe está do ponto Objectivo maior é o valor do campo. Logo o que faço na função teste_periferia( ) é testar os valores que as células adjacentes têm e ver qual delas é a menor. Dessa forma seguimos para essa célula e obtemos mais um ponto da rota até atingir uma célula com valor = 2 que  é o ponto Objectivo.

O que acontece é que por vezes não se consegue obter um caminho para o ponto objectivo pois adicionei Obstáculos ao Mapa. Logo quando encalhar numa posição, pretendo sair daquela função. E usar um método com pontos intermédios já conhecidos para obter novo caminho até ao Ponto Objectivo.

Mas com o Exit() ele sai do programa quando isso acontece. No entanto, usar o Return dá asneira. Não fecha o ciclo e acaba por trabalhar "lixo" e mais "lixo" até crashar...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.