c't

c't-Projekte - Mailinglisten


[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

Re: [ct-bot] ct-Bot-Lokalisierung

Absender: Menzel, Frank IT-OS
Datum: Di, 07.09.2010 14:02:26
In-reply-to: <630E0098-34A8-4C3D-B4B7-6ED89C60E710@xxxxxxxxxxxxxxx>
References: <AEC150FE-E322-4CBE-A1B5-47666F5BC251@xxxxxxxxxxxxxxx> <096FD558C4D20046A1BABE72DFF0C6C33A5FD1D9B3@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> <096FD558C4D20046A1BABE72DFF0C6C33D3F0510D7@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> <681CE81A-8241-4207-BC75-36F15F444089@xxxxxxxxxxxxxxx> <096FD558C4D20046A1BABE72DFF0C6C33D47499098@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> <630E0098-34A8-4C3D-B4B7-6ED89C60E710@xxxxxxxxxxxxxxx>


Hallo Timo,
OK, hab's soweit, denke ich, verstanden.

Da wäre doch aber eine Doku angebracht...
Gruß, Frank

-----Original Message-----
From: ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx [mailto:ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx] On Behalf Of Timo Sandmann
Sent: Tuesday, September 07, 2010 12:57 PM
To: Entwicklung rund um den c't-bot
Subject: Re: [ct-bot] ct-Bot-Lokalisierung

Hallo Frank,

Am 07.09.2010 um 11:11 schrieb Menzel, Frank IT-OS:
> Hallo Timo,
> hier das konkrete Beispiel:
> Berechnete Position: (405|2300)
> behaviour_scan_beacons.c(241)   - DEBUG -        >  Heading: 98
> behaviour_scan_beacons.c(242)   - DEBUG -        > Bisherige Position: (-1|0)
> behaviour_scan_beacons.c(243)   - DEBUG -        >  Heading: 101

ich nehme mal an, der Bot stand dabei noch auf seinem Startplatz, also Startplatz 1 der Welt:
1.) Der "globale Ursprung", also die Welt-Position (0 | 0) ist das Feld ganz rechts unten, denn beim Bot zeigt die X-Achse des Koordinatensystems aus Bot-Sicht nach vorn (heading 0°) und die Y-Achse nach links (heading 90°). Dass das Koordinatensystem des Bots so liegt, war nicht meine Idee, das ist schon von Anfang an so - warum auch immer.
2.) Der Bot-Startplatz 1 (rotes Feld) ist nach 1.) auf Feld (1 | 9). Ein Sim-Feld ist 240 mm breit und hoch, die Mitte des Startplatzes hat also die Position (1 * 240 + 120 | 9 * 240 + 120) = (360 | 2280), also X = 360 mm und Y = 2280 mm.
3.) Die Lokalisierung ergibt (405 | 2300), liegt also ca. 49 mm neben der eigentlichen Position. Die Ungenauigkeit kommt vor allem daher, dass zwei der drei Baken in der Welt (vom Startplatz aus gesehen) sehr dicht beieinander liegen, die Winkeldifferenz also sehr klein ist. Mit mehr Baken (und einem entsprechend angepassten Verhalten) oder besser angeordneten Baken (z.B. um den Bot herum) würde es genauer werden. Sinnvoll wäre auch, wenn es mehr Baken in der Welt gibt und das Verhalten wählt die "besten" für den aktuellen Bot-Standort aus.

> Ich deute es so, dass die neu berechnete Position für den Bot laut der Landmarken eben die 405, 2300 ist. Den Parameter habe ich nicht gesetzt, so dass die Ausgabe reine Info ist. Und die Startpos des Bots war der Einsetzpunkt auf genau 0,0.  Und alte und neue Pos sind doch  beides Weltkoordinaten und somit doch vergleichbar!?

Nein, die alte Position, also (0 | 0), war die bot-eigene Position, vor der ersten Lokalisierung kann der Bot von Weltkoordinaten ja keine Ahnung haben. Außerdem wäre für jeden Bot die ersten (eigene) Position (0 | 0), zwei Bots (auf zwei unterschiedlichen Startplätzen) müssen aber ja auch unterschiedliche Weltkoordinaten haben. Ist das soweit jetzt verständlich? Ansonsten kann ich auch noch mal eine Skizze machen.

> Aber andererseits sind für die Baken die Positionen fest verdrahtet:
>
> /*! @todo Nur Test-Daten */
>        switch (id) {
>        case 0xd:
>                pos.x = 0;
>                pos.y = 0;
>                break;
>        case 0xe:
>                pos.x = 1250;
>                pos.y = 0;
>                break;
>        case 0xc:
>                pos.x = 1250;
>                pos.y = 610;
>                break;
>        }

Das ist aber der falsche Code. Vollständig lautet er:

static position_t get_position_from_id(uint16_t id) {
        position_t pos = {0, 0};
#ifdef PC
        pos.x = (id >> 8) * BEACON_GRID_SIZE + (BEACON_GRID_SIZE / 2);
        pos.y = (id & 0xff) * BEACON_GRID_SIZE + (BEACON_GRID_SIZE / 2);
#else // MCU
/*! @todo Nur Test-Daten */
        switch (id) {
        case 0xd:
                pos.x = 0;
                pos.y = 0;
                break;
        case 0xe:
                pos.x = 1250;
                pos.y = 0;
                break;
        case 0xc:
                pos.x = 1250;
                pos.y = 610;
                break;
        }
#endif // PC

        LOG_DEBUG("  Pos v. Landmarke %d: (%d|%d)", id, pos.x, pos.y);
        return pos;
}

> Da diese Koords auch nicht stimmen für Test-Localisation Parcour, können doch die Psoitionen auch nicht stimmen, müssen doch sicher erst für den Parcour angepasst werden oder?

Im Fall eines simulierten Bots werden also nicht die fest verdrahteten Positionen verwendet, sondern die, die der Sim (als Sensorwert) überträgt. Anpassen muss man nur für realen Bots etwas.

> Oder habe ich generell einen Denkfehler?
> Meine Denkweise war zumindest die, dass ich die Botkoordinaten auf dem Sim-Display sehe und er mir nach den Baken eine fast identische Positionsangabe liefern sollte-oder?

Was meinst Du mit "Sim-Display"? Das (grüne) Display zeigt nur das an, was der Bot selbst "denkt", nichts Globales.

Grüße,
Timo


_______________________________________________
ct-bot-entwickler Mailingliste
ct-bot-entwickler@xxxxxxxxxxxxxxxxx
http://www.heise.de/bin/newsletter/listinfo/ct-bot-entwickler

Confidentiality note:
The information in this email and any attachment may contain confidential and proprietary information of Heidelberger Druckmaschinen AG and/or its affiliates and may be privileged or otherwise protected from disclosure. If you are not the intended recipient, you are hereby notified that any review, reliance or distribution by others or forwarding without express permission is strictly prohibited and may cause liability. In case you have received this message due to an error in transmission, we kindly ask you to notify the sender immediately and to delete this email and any attachment from your system.