كيف تُظهر فعالية إرلانج لبرمجة الروبوتات؟

StackOverflow https://stackoverflow.com/questions/3536664

  •  30-09-2019
  •  | 
  •  

سؤال

أنا أتابع حاليًا الماجستير في جزء لا يتجزأ من أطروحتي ، يجب أن أدرس فعالية 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.

  • هل طريقتي في التنفيذ خاطئة؟ (خاصة إذا ... نهاية) أو المشكلة نفسها صغيرة (فقط عمليتان)

من فضلك اقترح علي كيفية إظهار فعالية إرلانج في برمجة الروبوتات. جميع الاقتراحات موضع ترحيب.

شكرًا..

نحن سوف أنا أتفق مع cthulahoops على أن هذه المشكلة ليست كافية لإظهار فعالية إرلانج. هل يمكن لأي شخص أن يقترح بعض التطبيقات الآلية التي يمكنني تنفيذها في إرلانج ؟؟

هل كانت مفيدة؟

المحلول

حسنًا ، أولاً ، أود أن أقول إن هذا لا يبدو بمثابة مشروع جيد جدًا لإظهار فعالية إرلانج.

أول ما يتبادر إلى الذهن لجعل الكود أكثر تصريحًا هو تقسيم إذا كان الخروج إلى وظيفة منفصلة مثل هذه:

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.

الذي يفصل إعلان كيفية الاستجابة لأجهزة الاستشعار عن العمل الفوضوي المتمثل في حلقات وإرسال الرسائل ، وما إلى ذلك أيضًا ، يتجنب إرجاع الذرات بدلاً من الأعداد الصحيحة الخفية الاضطرار إلى وضع هذه المعلومات في التعليقات. (بعد فلسفة التعليقات أخبرك أين تحتاج إلى توضيح الرمز.)

نصائح أخرى

مثال: إذا كان لديك روبوتات متعددة من شأنها أن تتفاعل مع بطريقة ما وكان لكل منها منطقه الخاص بواسطة خادم Erlang المركزي.

عادةً ما تقوم بعمل حلقة كبيرة وتضع منطق جميع العناصر في كل دورة ، مع أشياء قبيحة مثل الذاكرة المشتركة والموادف إذا كنت تستخدم مؤشرات الترابط القياسية. في إرلانج ، يمكنك ترميزه بشكل طبيعي ووظائف تفرخ التي تضيع مساحة الحد الأدنى وجعلها التواصل عبر تمرير الرسائل. باستخدام OTP ، يمكنك إنشاء هياكل عامة تتعامل مع الجوانب غير الوظيفية المزعجة للمشاكل الشائعة وتساعدها على جعلها تتسامح مع أشجار الإشراف. ينتهي بك المطاف بقراءة التعليمات البرمجية وبنية أكثر كفاءة وقوة لتطويرها.

هذه هي قوة إرلانج.

إذا كنت بحاجة إلى حساب بعض القرارات التي تتسع على متغيرات الزوجين (يمينًا ، يسارًا ، إلخ ..) من الواضح أنك لن تتجنب ذلك. والسؤال هو كيفية الاستفادة من استخدام إرلانج.

هنا ، ما يتبادر إلى ذهني ، هو تنفيذ واحدة من سلوكيات OTP - Gen_FSM (آلة الحالة المحدودة). لذلك ، سيكون المنطق (ربما/ربما؟): استقبل اليسار -> انتظر فقط إلى اليمين أو الوسط وما إلى ذلك. هذا من شأنه أن يجعل الكود الخاص بك واضحًا للغاية ويمنحك إمكانية لتفريخ الكثير من الإجراءات التي تستند إلى الحالة الحالية ، مما سيؤدي إلى نظام غير متزامن تمامًا تحت سيطرتك.

إنه يذهلني أن إرلانج مناسب بشكل خاص للأسرار الآلية. امتلاك كل عضو في Swarm rpc:abcast تعد الرسائل إلى جميع الأعضاء الآخرين بديلاً رائعًا عن حماقة UDP المعتادة التي يتعين عليك التعامل معها بلغة إجرائية. لا يوجد ارتباط للمنافذ ، ولا يحدد تنسيقًا ثنائيًا لرسائلك ، ولا تسلسلي للكائنات ، إلخ.

طالما يمكنك فرز اكتشاف العقد الأخرى في منطقتك ، يبدو أن سرب Erlang/الموزعة غير المركزية سيكون مشروعًا رائعًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top