Hatte gehofft heute dazu zu kommen den Roomba mal tatsächlich laufen zu lassen - mit seiner internen Intelligenz.
Leider zeigte sich dass der Compiler, dank der Code-Optimierung zur Speicherplatz Reduzierung, mist gebaut hat. Die gestrigen Routen waren falsch, das habe ich inzwischen heraus gefunden.
Man möge es nicht glauben oder ich habe heute Tomaten auf den Augen.
Kann mir jemand erklären was der Unterschied zwischen diesen zwei Varianten ist?
Variant 1 (funktioniert):
Code:
unsigned char PATH_CheckField (unsigned char x, unsigned char y, unsigned char Type) // Prüfen ob das Feld X/Y näher am aktuellen Standort des Robis liegt
// Prüft ob das angegebene Feld ein Hinderniss enthält
// und falls nicht ob der Aufwand dort hin zu gelangen
// kleiner ist als bisher bekannt.
{
if ((x>=PATH_SizeX)||
(y>=PATH_SizeY)) return 0;
if (!Type)
{ // Nach Hindernissen suchen:
if (PATH_Field[x][y].bWall==0) // Es darf kein Hinderniss sein
{
if (PATH_NewDistance>PATH_Field[x][y].b6Distance) // Ist es näher?
{
PATH_Field[x][y].b6Distance = PATH_NewDistance;
}
}
return 0;
}
else
{ // Nach ungereinigten (noch unbefahrene Stelle) suchen
if (PATH_Field[x][y].bClean==0) // noch ungereinigt?
{
if (PATH_NewDistance>PATH_Field[x][y].b6Distance) // Ist es näher?
{
PATH_Field[x][y].b6Distance = PATH_NewDistance;
PATH_DestinationX = x;
PATH_DestinationY = y;
return 1; // ungereinigte Stelle gefunden
}
}
else
{ // Es ist schon gereinigt, wenn kein Hinderniss dann ggf. neue
// Entfernung speichern
if (PATH_Field[x][y].bWall==0) // Es darf kein Hinderniss sein
{
if (PATH_NewDistance>PATH_Field[x][y].b6Distance) // Ist es näher?
{
PATH_Field[x][y].b6Distance = PATH_NewDistance;
}
}
}
}
return 0;
}
Variante 2 (funktioniert nicht):
Code:
unsigned char PATH_CheckField (unsigned char x, unsigned char y, unsigned char Type) // Prüfen ob das Feld X/Y näher am aktuellen Standort des Robis liegt
// Prüft ob das angegebene Feld ein Hinderniss enthält
// und falls nicht ob der Aufwand dort hin zu gelangen
// kleiner ist als bisher bekannt.
{
if ((x>=PATH_SizeX)||
(y>=PATH_SizeY)) return 0;
if (!Type)
{ // Nach Hindernissen suchen:
if (PATH_Field[x][y].bWall==0) // Es darf kein Hinderniss sein
if (PATH_NewDistance>PATH_Field[x][y].b6Distance) // Ist es näher?
PATH_Field[x][y].b6Distance = PATH_NewDistance;
}
else
{ // Nach ungereinigten (noch unbefahrene Stelle) suchen
if (PATH_Field[x][y].bClean==0) // noch ungereinigt?
{
if (PATH_NewDistance>PATH_Field[x][y].b6Distance) // Ist es näher?
{
PATH_Field[x][y].b6Distance = PATH_NewDistance;
PATH_DestinationX = x;
PATH_DestinationY = y;
return 1; // ungereinigte Stelle gefunden
}
}
else
{ // Es ist schon gereinigt, wenn kein Hinderniss dann ggf. neue
// Entfernung speichern
if (PATH_Field[x][y].bWall==0) // Es darf kein Hinderniss sein
if (PATH_NewDistance>PATH_Field[x][y].b6Distance) // Ist es näher?
PATH_Field[x][y].b6Distance = PATH_NewDistance;
}
}
return 0;
}
Inhaltlich sollten beide das selbe durchführen.
Egal, hat lange gedauert das heraus zu finden.
Er findet jetzt übrigens den Weg in maximal 60ms, hatte nochmals Simulationen laufen lassen (in AVR Studio).
Lesezeichen