سؤال

لدي روبوت يستخدم فأرة بصرية كمسار موضع. في الأساس، حيث يتحرك الروبوت أنه قادر على تتبع التغيير في الاتجاهات X و Y باستخدام الماوس. يتتبع الماوس أيضا الاتجاه الذي يتحرك - أي X سلبي أو X. يتم تلخيص هذه القيم في سجلات X و Y منفصلة.

الآن، يدور الروبوت في مكان ويتحرك فقط. لذا فإن حركة الروبوت هي مثالية في خطوط مستقيمة (على الرغم من أن تتبع الماوس يمكن أن تلتقط الانحرافات إذا كنت تنحرف) في زوايا معينة. ستكون مجموعة معينة من حركات الروبوت:
ج: تدوير 45 درجة، نقل 3 بوصات
ب: تدوير 90 درجة، نقل 10 بوصات
ج: تدوير درجات -110، نقل 5 بوصات
D: تدوير 10 درجة، انقل 1 بوصة
ولكن في كل مرة يسجل الفأر x والماوس y المسافات الحقيقية التي تحركها في كل اتجاه.

الآن، إذا كنت ترغب في تكرار حركة الحركة التي تذهب من A إلى D فقط، كيف يمكنني القيام بذلك باستخدام المعلومات التي جمعتها بالفعل. أعلم أنني أستطيع أن ألخص بشكل أساسي جميع الزوايا والمسافات التي أطعمها بالفعل، لكن هذا من شأنه أن يكون غير دقيق إذا كان هناك أخطاء كبيرة في كل أوامر حركة. كيف يمكنني استخدام المعلومات الخام من الماوس؟ قدم أحد الأصدقاء فكرة أنه يمكنني وضع جيب وتسييحه بشكل مستمر وقيم الماوس وحساب المتجه النهائي لكنني لست متأكدا حقا كيف سيعمل ذلك.

المشكلة هي أن الماوس يعطي فقط قراءات نسبية بالتناوب أو الانتقال إلى الوراء، فمن المحتمل أن تمحو المعلومات. لذلك نعم، ما أتساءله هو كيف يمكنك تنفيذ الخوارزمية حتى تتمكن من تتبع التغييرات باستمرار لتعطيك أقصر مسار إذا انتقلت في متعرجة للوصول إلى هناك في الأصل.

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

المحلول

أعتقد أن الخوارزمية الأساسية التي تحتاج إلى القيام به هي:

currentX = currentY = 0;
heading = 0; // radians
while (true)
{
    deltas = SampleMouseDeltas();
    heading += deltas.Heading;
    currentX += Math.Cos(heading) * deltas.Distance;
    currentY += Math.Sin(heading) * deltas.Distance;
}

أنت على حق في فكرتك أن هذا لن يكون دقيقا. ويسمى "ميتة الحساب" لسبب ما.

حيث يمكنك الحصول على Deltas.HEADING استنادا إلى تنسيق "X" (ستكون الصيغة (DELTAX في بوصة) / (مسافة استشعار الماوس في بوصة من مركز الدوران). أيضا، سيأتي Deltas.Distance من "Y "الاستشعار، بعد تحويله من بكسل إلى بوصة.

ثم لأداء الخطوات، يمكنك القيام بشيء مثل:

robot.RotateLeft();
heading = 0;
while (heading < 45 degrees)
    heading += SampleMouseDeltas.Heading;
robot.StopRotateLeft();

... etc ...

نصائح أخرى

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

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

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