В настоящее время я изучаю магистратуру по встраиваемым технологиям, и для моей диссертации я должен изучить эффективность Erlang для программирования робота.AFAIK Декларативный характер и параллелизм Erlang могут быть эффективными , поэтому я создал код Erlang для «Адаптивного круиз-контроля», который принимает значения датчиков из программы C (поскольку Erlang не может считывать датчики напрямую)затем выполнить вычисление и отправить обратно управляющий сигнал в программу C.Но код выглядит довольно большим по размеру (строки). Почему я не могу использовать декларативный характер или есть какая-то другая проблема?Вот мои фрагменты кода.
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).
Этот код больше похож на C-код.
- Мой способ реализации неверен (особенно если IF ... end) или сама проблема небольшая (только 2 процесса)
Пожалуйста, предложите мне, как показать эффективность Erlang в программировании роботов. Все предложения приветствуются.
Спасибо ..
Ну Я согласен с @cthulahoops, чтоэтой проблемы недостаточно, чтобы показать эффективность Erlang .Кто-нибудь может предложить какое-нибудь приложение Robotic, которое я могу реализовать в Erlang ??