Frage

Ich bin derzeit Masters in Embedded verfolgen und für meine Diplomarbeit habe ich für die Programmierung Roboter die Wirksamkeit von Erlang zu studieren. AFAIK Erlang deklarative Natur und Gleichzeitigkeit wirksam sein kann, , so dass ich einen Erlang-Code für "Adaptive Cruise Control" gemacht, die nimmt Sensorwerte von C-Programm (da Erlang nicht lesen können Sensoren direkt), dann die Berechnung durchführen und das Steuersignal zu C-Programm zurückzuschicken. Aber der Code sieht ziemlich groß in der Größe (Linien). Warum bin ich deklarative Natur verwenden nicht in der Lage oder gibt es ein anderes Problem? Hier ist mein Code-Schnipsel.

 start() -> 
    spawn( cr, read_sensor, []),
    spawn(cr, take_decision, []),
    sleep_infinite().
% this will make it to run infinitely 
sleep_infinite() -> 
    receive
        after infinity ->
            true
    end.

read_sensor() -> 
    register(read, self()),
    Port = open_port({spawn , "./cr_cpgm" }, [{packet, 2}]),
    Port ! {self(),{command, [49]}},% for executing read sensor fun in C pgm
    read_reply(Port).

read_reply(Port) -> 
    receive 
        read_sensor -> 
            Port ! { self(), { command, [49]}};

        {Port, {data, Data}} -> 
            [Left,Center,Right,Distance] = Data, % stored values of sensors into variables for further computation
            io:format("value of Left: ~w and Center: ~w and Right: ~w and Distance: ~w~n",[Left,Center,Right,Distance]),

        if         Distance =< 100 -> decision ! {1, out}; % Distance shows the value returned by front sharp sensor
                ((Left > 25) and (Center > 25) and (Right > 25)) -> decision ! {2, out}; % stop robot
                        Center < 25 -> decision ! {3, out}; % move forward
                   ((Left > 25) and (Center > 25)) -> decision ! {4, out}; % turn right
                 ((Right > 25) and (Center > 25)) -> decision ! {5, out}; % turn left
                          true ->   decision ! {6, out}   % no match stop robot  
        end
    end,
    read_reply(Port).

take_decision() ->
    register(decision, self()),
    Port = open_port({spawn , "./cr_cpgm" }, [{packet, 2}]),
    decision_reply(Port).

decision_reply(Port) ->
    receive
        {A, out} ->
            Port ! {self(), {command, [50,A]}};

        {Port,{data, Data}} ->
        if
            Data == [102] ->  read ! read_sensor %
        end
    end,
    decision_reply(Port).

Dieser Code sieht eher wie ein C-Code.

  • Ist meine Art und Weise der Umsetzung nicht in Ordnung? (Vor allem, wenn ... end) oder das Problem selbst ist klein (nur 2 Prozesse)

Bitte machen Sie mir, wie die Wirksamkeit von Erlang zu zeigen, Roboter in der Programmierung. Alle Vorschläge sind willkommen.

Danke ..

Nun Ich bin einverstanden mit @cthulahoops, dass dieses Problem nicht genug ist, um die Wirksamkeit von Erlang zeigen . Kann jemand empfehlen, eine Roboteranwendung, die ich in Erlang implementieren kann ??

War es hilfreich?

Lösung

Nun, erstens würde ich sagen, dass dies klingt nicht wie ein sehr gutes Projekt für die Wirksamkeit von Erlang zeigt.

Das erste, was der Code mehr deklarative zu machen in den Sinn kommt, ist das, wenn aus in eine separate Funktion wie folgt aufgeteilt:

choice(Distance, _Left, _Center, _Right) when Distance =< 100 -> something_you_didnt_say_what;
choice(_Distance, Left, Center, Right) when Left > 25, Center > 25, Right > 25 -> stop;
choice(_Distance, Left, _Center, _Right) when Center < 25 -> forward;
choice(_Distance, Left, Center, _Right) when Center > 25, Left > 25 -> right;
choice(_Distance, _Left, Center, Right) when Center > 25, Right > 25 -> left.

, der eine Erklärung dafür, wie zu reagieren auf Sensoren von dem unordentlichen Geschäft des Looping und das Senden von Nachrichten trennt, etc. Auch mit Atomen, anstatt der kryptischen Zahlen vermeiden Rückkehr, dass die Informationen in Kommentare zu setzen. (Nach der Philosophie von Kommentaren sagen Ihnen, wo Sie brauchen, um den Code zu klären.)

Andere Tipps

. Beispiel: Wenn Sie mehrere Roboter hatten, die mit einer gewissen Art und Weise interagieren würden und jeder hatte ihre eigene Logik, die von einem zentralen Server gesteuert erlang

Normalerweise würde man eine große Schleife machen und setzen die Logik aller Elemente in jedem Zyklus durch, mit hässlichen Sachen wie Shared Memory und Mutexe, wenn Sie Standardgewinde verwenden. In Erlang können Sie es codieren mehr natürlich und Laich-Funktionen, die nur wenig Platz verschwenden und sie über Message-Passing kommunizieren. Mit OTP können Sie generische Strukturen machen, die die lästigen nicht-funktionale Aspekte für gemeinsame Probleme und dazu beitragen, dass es tolerant mit Bäumen Aufsicht Fehler behandeln. Am Ende haben Sie viel einfacher up-Code zu lesen und viel effiziente und robuste Struktur zu entwickeln, bei.

Das ist die Macht des erlang.

Wenn Sie einige Entscheidungen basieren auf paar Variablen berechnen müssen (rechts, links, etc ..) Sie werden natürlich nicht vermeiden. Die Frage ist, wie von der Verwendung erlang profitieren.

Was hier kommt meiner Meinung nach, ist die Umsetzung eines von OTP Verhaltensweisen - gen_fsm (Finite State Machine). So würde die Logik sein (vielleicht / wahrscheinlich?): Erhalten Left -> Warten nur für Rechts oder Mitte und so weiter. Dies würde Ihren Code sehr klar machen und gibt Ihnen die Möglichkeit zu laichen vielen Aktionen auf aktuellen Stand zu stützen, die im asynchronen System vollständig unter Kontrolle führen würden.

Es scheint mir, dass Erlang ist besonders gut geeignet für Roboterschwärme. Jedes Mitglied des Schwarms rpc:abcast Nachrichten an alle anderen Mitglieder zu haben, ist eine fantastische Alternative zu den üblichen UDP vorformulierten Mist, dass Sie mit in einer prozeduralen Sprache zu tun haben würde. Es gibt keine Bindung an Ports, kein ein binäres Format für Ihre Nachrichten spezifiziert, keine Serialisierung von Objekten, etc.

Solange Sie die Entdeckung von anderen Knoten in Ihrer Umgebung aussortieren können, scheint es wie ein dezentralen / verteilten Erlang Schwarm wäre ein großes Projekt sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top