4

私は現在、組み込みの修士号を取得しようとしています。論文では、Robot のプログラミングにおける Erlang の有効性を研究する必要があります。私の知る限り、 Erlang の宣言型の性質と同時実行性は効果的である可能性があるため、C プログラムからセンサー値を取得し(Erlang はセンサーを直接読み取ることができないため)、計算を実行して制御信号を C プログラムに送り返す「アダプティブ クルーズ コントロール」用の Erlang コードを作成しました。しかし、コードのサイズ (行数) はかなり大きく見えます。宣言型の性質を使用できないのはなぜですか、または他の問題がありますか? これが私のコードスニペットです。

 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 の有効性を示す方法を教えてください。すべての提案を歓迎します。

ありがとう..

この問題は Erlang の有効性を示すのに十分ではないという @cthulahoops に同意します。Erlang で実装できるロボット アプリケーションを提案できる人はいますか??

4

4 に答える 4

2

例: 何らかの方法で相互作用する複数のロボットがあり、それぞれが中央の erlang サーバーによって制御される独自のロジックを持っている場合。

通常、大きなループを作成し、すべての要素のロジックを各サイクルに配置します。標準スレッドを使用する場合は、共有メモリやミューテックスなどの醜いものを使用します。erlang では、より自然にコーディングして、最小限のスペースを浪費する関数を生成し、メッセージ パッシングを介して通信させることができます。OTP を使用すると、一般的な問題に対するより煩わしい非機能的な側面を処理する一般的な構造を作成し、監視ツリーを使用して耐障害性を持たせることができます。最終的には、コードがはるかに読みやすくなり、開発するのにはるかに効率的で堅牢な構造になります。

それがアーランの力です。

于 2010-08-22T11:30:50.807 に答える
2

まず最初に、これは Erlang の有効性を示すにはあまり良いプロジェクトではないように思えます。

コードをより宣言的にするために頭に浮かぶ最初のことは、次のように if out を別の関数に分割することです。

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.

これにより、センサーに応答する方法の宣言が、メッセージのループや送信などの面倒な作業から分離されます。また、不可解な整数ではなくアトムを返すことで、その情報をコメントに入れる必要がなくなります。(コメントの哲学に従うと、コードを明確にする必要がある場所がわかります。)

于 2010-08-21T11:37:16.743 に答える
1

カップル変数 (Right、Left など) に基づいていくつかの決定を計算する必要がある場合は、明らかにそれを避けることはできません。問題は、erlang を使用してどのように利益を得るかです。

ここで、私の頭に浮かぶのは、OTP 動作の 1 つである gen_fsm (有限状態マシン) を実装することです。したがって、ロジックは次のようになります (おそらく/おそらく?): 左を受信 -> 右または中央のみを待機、など。これにより、コードが非常に明確になり、現在の状態に基づいて多くのアクションを生成できるようになり、非同期システムが完全に制御できるようになります。

于 2010-08-21T11:22:29.900 に答える
1

Erlang はロボットの群れに特に適していると思います。swarm の各メンバーがrpc:abcast他のすべてのメンバーにメッセージを送ることは、手続き型言語で対処しなければならない通常の UDP ボイラープレートのがらくたに代わる素晴らしい方法です。ポートへのバインド、メッセージのバイナリ形式の指定、オブジェクトのシリアル化などはありません。

お住まいの地域の他のノードの発見を整理できる限り、分散型/分散型の Erlang swarm は素晴らしいプロジェクトになると思われます。

于 2011-03-17T01:04:34.507 に答える