جدول المحتويات:

فهم خلط القنوات: 4 خطوات (بالصور)
فهم خلط القنوات: 4 خطوات (بالصور)

فيديو: فهم خلط القنوات: 4 خطوات (بالصور)

فيديو: فهم خلط القنوات: 4 خطوات (بالصور)
فيديو: هكذا كيف تصطاد الدودة الشريطية فريستها 😬 2024, يوليو
Anonim
Image
Image
طريقة المزيج »لا شيء
طريقة المزيج »لا شيء

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

المزج هو ببساطة كيفية استخدام البيانات من عصا التحكم الخاصة بك لتحديد مقدار الطاقة التي يجب توفيرها لكل جانب من جوانب الهيكل.

إذا فتحت عصا التحكم ، فسترى عمومًا مقياسين للجهد بالداخل. أحدهما لقياس موقعك الحالي على طول المحور Y (لأعلى ولأسفل) ، والآخر لقياس مكانك على طول المحور X (جنبًا إلى جنب).

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

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

دعنا نلقي نظرة على بعض أساليب الخلط المختلفة.

الخطوة 1: طريقة الخلط »لا شيء

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

على سبيل المثال ، إذا قمت بدفع عصا التحكم إلى الأمام بشكل مستقيم ، يكون المحور Y عند دواسة الوقود الكاملة والمحور X عند 0. لذلك ستقود في دوائر بدلاً من السير بشكل مستقيم.

الخطوة 2: الطريقة الطريقة »التدوير

طريقة الطريقة »استدارة
طريقة الطريقة »استدارة

أشار لي أحد زملائي في العمل مرة إلى أنه في حالة الضرورة ، يمكنك تدوير جهاز الإرسال 45 درجة للحصول على مزيج فقير. إذا كنت تعتقد أن القيم من مقياسي الجهد في عصا التحكم هي المحور x و y على الشبكة (مع امتداد كلا المحورين من -100 إلى +100) ، فهذا منطقي للغاية لأنك ستذهب إلى +100 على كلا المحورين عندما تضغط على عصا التحكم لأعلى ولليمين. لذا ، إذا كان هذا يتجه مباشرة إلى قناتي الهيكل (الجانبين الأيسر والأيمن من الروبوت الخاص بك) ، فإنه سيجعل الروبوت الخاص بك يتقدم للأمام.

لذا فإن الطريقة الأولى للخلط التي جربتها كانت تدوير إحداثي x و y رياضيًا بمقدار 45 درجة حول النقطة المركزية للشبكة.

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

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

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

دعنا نلقي نظرة على بعض أمثلة التعليمات البرمجية.

ملاحظات حول أمثلة الكود الخاص بي: سأترك كيفية الحصول على قيم جويستيك _x و جويستيك _ ص لأنها ستتغير اعتمادًا على مشروعك. سأقوم أيضًا بتعيين / التقييد بـ ± 100 ولكن قد تحتاج على الأرجح إلى التعيين إلى 1000-2000 لـ PWM أو من 0 إلى 255 للإخراج التناظري وما إلى ذلك.

مثال اردوينو:

// تناوب رياضيا

راد مزدوج = -45 * M_PI / 180 ؛ int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (rad) ؛ int rightThrottle = joystick_y * cos (rad) + joystick_x * sin (rad) ؛ // تقييد leftThrottle = تقييد (leftThrottle ، -100 ، 100) ؛ rightThrottle = تقييد (rightThrottle ، -100 ، 100) ؛

مثال على JavaScript:

// رياضيًا rotatevar rad = -45 * Math. PI / 180 ؛ leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (rad) ؛ rightThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad) ؛ // constrainleftThrottle = تقييد (leftThrottle ، -100 ، 100) ؛ rightThrottle = تقييد (rightThrottle ، -100 ، 100) ؛ // قيمة دالة المساعد = دالة (num، min، max) {return Math.min (Math.max (num، min)، max) ؛ } ؛

الخطوة 3: الطريقة الطريقة »بسيطة

طريقة الطريقة »بسيطة
طريقة الطريقة »بسيطة

بعد ذلك ، لدينا معادلة بسيطة للغاية التقطتها لأول مرة من أحد مقاطع فيديو Shawn Hymel's Adventures in Science SparkFun حيث كان يعمل في مشروع مشابه جدًا للمشروع الذي كنت أعمل عليه.

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

وبالمناسبة أنا لا أسمي هذا بالانتقاص البسيط … هناك جمال في البساطة.

مثال اردوينو:

int leftThrottle = joystick_y + joystick_x ؛

int rightThrottle = joystick_y - joystick_x ؛ // تقييد leftThrottle = تقييد (leftThrottle ، -100 ، 100) ؛ rightThrottle = تقييد (rightThrottle ، -100 ، 100) ؛

مثال على JavaScript:

var leftChannel = joystick_y + joystick_x ؛

var rightChannel = joystick_y - joystick_x ؛ // تقييد leftChannel = تقييد (leftChannel ، -100 ، 100) ؛ rightChannel = تقييد (rightChannel ، -100 ، 100) ؛ // قيمة دالة المساعد = دالة (num، min، max) {return Math.min (Math.max (num، min)، max) ؛ } ؛

الخطوة 4: الطريقة الطريقة »التناسبية

طريقة الطريقة »النسبي
طريقة الطريقة »النسبي

لقد انطلقت من الطريقة البسيطة على أمل تحقيق أفضل ما في معادلة العالمين. الفكرة هنا هي أن تكون متناسبًا تمامًا في جميع الاتجاهات حتى قطريًا على الرغم من حقيقة أنك تتحرك لمسافة أكبر ، فإن لها نفس النطاق كما هو الحال عندما تتحرك عموديًا وهي مسافة أصغر.

ينتهي بك الأمر بمقياس من -200 إلى +200 في جميع الاتجاهات في الأمثلة الخاصة بي ، وأقوم بتعيين ذلك إلى ± 100 لأنه يمثل النسبة المئوية للطاقة التي تذهب إلى كل قناة - ومع ذلك سترغب في تعيينها لأي شيء يعمل في استخدامك- حالة لوحدة تحكم المحرك الخاص بك. على سبيل المثال ، إذا كنت ترسل إشارة PWM ، فيمكنك تعيين ذلك على 1000 إلى 2000 أو إذا كنت ترسل إشارة تناظرية ، فيمكنك تعيينها على 0-255 وتعيين الاتجاه على أنه منطقي وما إلى ذلك.

مثال اردوينو:

int leftThrottle = joystick_y + joystick_x ؛

int rightThrottle = joystick_y - joystick_x ؛ // في بعض الحالات يكون الحد الأقصى 100 ، وفي بعض الحالات يكون 200 // لنأخذ في الاعتبار الفرق ، لذا يكون الحد الأقصى دائمًا 200int فرق = القيمة المطلقة (abs (joystick_y) - abs (joystick_x)) ؛ leftThrottle = leftThrottle <0؟ leftThrottle - diff: leftThrottle + diff ؛ rightThrottle = rightThrottle <0؟ rightThrottle - فرق: rightThrottle + فرق ؛ // خريطة من ± 200 إلى ± 100 أو أي نطاق تريده // constrainleftThrottle = تقييد (leftThrottle ، -100 ، 100) ؛ rightThrottle = تقييد (rightThrottle ، -100 ، 100) ؛

مثال على JavaScript:

var leftThrottle = joystick_y + joystick_x ؛ var rightThrottle = joystick_y - joystick_x ؛ // في بعض الحالات يكون الحد الأقصى 100 ، وفي بعض الحالات يكون 200 ، // لنأخذ في الاعتبار الفرق ، لذا يكون الحد الأقصى دائمًا 200var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)) ؛ leftThrottle = leftThrottle <0؟ leftThrottle - diff: leftThrottle + diff ؛ rightThrottle = rightThrottle <0؟ rightThrottle - diff: rightThrottle + diff ؛ // خريطة من ± 200 تراجعًا إلى ± 100 أو أيًا كان ما تريده -100 ، 100) ؛ // constrain leftThrottle = constrain (leftThrottle، -100، 100)؛ rightThrottle = constrain (rightThrottle، -100، 100)؛ // بعض الدوال المساعدة var constrain = function (num، min، max) {return Math.min (Math. ماكس (عدد ، دقيقة) ، كحد أقصى ؛ } ؛ var map = function (num، inMin، inMax، outMin، outMax) {var p، inSpan، outSpan، mapped؛ inMin = inMin + inMax ؛ الأسطوانات = الأسطوانات + inMax ؛ inMax = inMax + inMax ؛ inSpan = Math.abs (inMax-inMin) ؛ p = (num / inSpan) * 100 ؛ outMin = outMin + outMax ؛ outMax = outMax + outMax ؛ outSpan = Math.abs (outMax - outMin) ؛ تعيين = outSpan * (p / 100) - (outMax / 2) ؛ عودة تعيين؛}؛

موصى به: