Ich mache zur Zeit einen Master in Embedded und für meine Diplomarbeit muss ich die Effektivität von Erlang für die Programmierung von Robotern untersuchen. AFAIK Die deklarative Natur von Erlang und die Gleichzeitigkeit können wirksam sein Deshalb habe ich einen Erlang-Code für "Adaptive cruise control" erstellt, der übernimmt Sensorwerte aus C-Programm (da Erlang die Sensoren nicht direkt auslesen kann), dann eine Berechnung durchführen und ein Steuersignal an das C-Programm zurücksenden. Aber der Code sieht ziemlich groß in Größe (Zeilen). Warum kann ich die deklarative Natur nicht nutzen? 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 aus.
- Ist meine Art der Implementierung falsch (insbesondere IF...end) oder ist das Problem selbst klein (nur 2 Prozesse)
Bitte schlagen Sie mir vor, wie ich die Wirksamkeit von Erlang bei der Programmierung von Robotern zeigen kann. Alle Vorschläge sind willkommen.
Danke.
Quelle: Ich stimme mit @cthulahoops überein, dass dieses Problem nicht ausreicht, um die Wirksamkeit von Erlang zu zeigen . Kann jemand eine Robotik-Anwendung vorschlagen, die ich in Erlang implementieren kann?