我目前正在攻读嵌入式硕士学位,为了我的论文,我必须研究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的有效性。**欢迎所有建议。
- 是我的实现方式错了吗?(尤其是IF. end)还是问题本身很小(只有2个进程)*
谢谢你
好吧我同意@cthulahoops的观点,这个问题不足以证明Erlang的有效性。有人能推荐一些我可以在Erlang中实现的Robotic应用程序吗??
4条答案
按热度按时间niwlg2el1#
首先,我要说的是,这听起来不像是一个展示Erlang有效性的好项目。
要想让代码更具声明性,首先想到的是将if拆分为一个单独的函数,如下所示:
字符串
它将如何响应传感器的声明与循环和发送消息等混乱的业务分开。此外,返回原子而不是神秘的整数避免了将这些信息放入注解中。(遵循注解的哲学告诉您需要澄清代码的地方。)
qvk1mo1f2#
例如:如果你有多个机器人,它们以某种方式进行交互,每个机器人都有自己的逻辑,由一个中央erlang服务器控制。
通常你会做一个大循环,把所有元素的逻辑放在每个循环中,如果你使用标准的线程,你会遇到一些丑陋的东西,比如共享内存和互斥锁。在erlang中,你可以更自然地编写代码,生成浪费最少空间的函数,并通过消息传递进行通信。使用OTP,你可以创建通用的结构,处理常见问题的更烦人的非功能方面,并帮助解决问题。宽容的监督树。你最终会得到更容易阅读的代码和更有效和更健壮的结构来开发。
这就是Erlang的力量。
brvekthn3#
如果你需要根据两个变量(右,左,等等)来计算一些决策,你显然不会避免它。问题是如何从使用erlang中受益。
在这里,我想到的是实现OTP行为之一- gen_fsm(有限状态机)。因此,逻辑将是(可能/可能?):接收左->只等待右或中心等。这将使您的代码非常清晰,给予您基于当前状态产生大量动作的可能性,这将导致异步系统完全在您的控制之下。
syqv5f0l4#
我觉得Erlang特别适合机器人集群。让集群中的每个成员向所有其他成员发送
rpc:abcast
消息是一个很好的替代方案,而不是你必须在过程语言中处理的通常UDP样板垃圾。没有端口绑定,没有为消息指定二进制格式,没有对象序列化等。只要你能整理出你所在区域的其他节点的发现,分散/分布式的Erlang swarm似乎是一个很好的项目。