如何证明Erlang在机器人编程中的有效性?

i2byvkas  于 5个月前  发布在  Erlang
关注(0)|答案(4)|浏览(47)

我目前正在攻读嵌入式硕士学位,为了我的论文,我必须研究Erlang对Robot编程的有效性。AFAIKErlang的声明性和并发性可以是有效的,所以我为“自适应巡航控制”编写了一个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的有效性。有人能推荐一些我可以在Erlang中实现的Robotic应用程序吗??

niwlg2el

niwlg2el1#

首先,我要说的是,这听起来不像是一个展示Erlang有效性的好项目。
要想让代码更具声明性,首先想到的是将if拆分为一个单独的函数,如下所示:

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.

字符串
它将如何响应传感器的声明与循环和发送消息等混乱的业务分开。此外,返回原子而不是神秘的整数避免了将这些信息放入注解中。(遵循注解的哲学告诉您需要澄清代码的地方。)

qvk1mo1f

qvk1mo1f2#

例如:如果你有多个机器人,它们以某种方式进行交互,每个机器人都有自己的逻辑,由一个中央erlang服务器控制。
通常你会做一个大循环,把所有元素的逻辑放在每个循环中,如果你使用标准的线程,你会遇到一些丑陋的东西,比如共享内存和互斥锁。在erlang中,你可以更自然地编写代码,生成浪费最少空间的函数,并通过消息传递进行通信。使用OTP,你可以创建通用的结构,处理常见问题的更烦人的非功能方面,并帮助解决问题。宽容的监督树。你最终会得到更容易阅读的代码和更有效和更健壮的结构来开发。
这就是Erlang的力量。

brvekthn

brvekthn3#

如果你需要根据两个变量(右,左,等等)来计算一些决策,你显然不会避免它。问题是如何从使用erlang中受益。
在这里,我想到的是实现OTP行为之一- gen_fsm(有限状态机)。因此,逻辑将是(可能/可能?):接收左->只等待右或中心等。这将使您的代码非常清晰,给予您基于当前状态产生大量动作的可能性,这将导致异步系统完全在您的控制之下。

syqv5f0l

syqv5f0l4#

我觉得Erlang特别适合机器人集群。让集群中的每个成员向所有其他成员发送rpc:abcast消息是一个很好的替代方案,而不是你必须在过程语言中处理的通常UDP样板垃圾。没有端口绑定,没有为消息指定二进制格式,没有对象序列化等。
只要你能整理出你所在区域的其他节点的发现,分散/分布式的Erlang swarm似乎是一个很好的项目。

相关问题