Дотримання лінії: управління увімкненням/вимкненням ================================== Тепер звернемо увагу на одну з основних проблем у фінальному проекті — слідування по лінії. У проекті робот повинен буде рухатися до декількох різних місць, але якщо робити це, орієнтуючись лише на відстань, робот може не дістатися до потрібного місця. Що робити, якщо колеса прокручуються під час руху? Що робити, якщо робот повинен рухатися по складній кривій? Слідувати за лінією простіше, ніж точно виміряти маршрут, яким повинен рухатися робот, і запрограмувати його. Як слідувати лінії? ------------------------ Розгляньте можливість використання одного з датчиків відбиття. Нагадуємо, що він видає значення від 0 (чорний) до 1 (білий). Припускаючи, що датчик відбиття знаходиться приблизно в центрі робота, він буде хоча б частково зчитувати чорну лінію, коли робот знаходиться по центру лінії. Який тип логіки нам потрібен, якщо ми хочемо слідувати за центром лінії? Ну, якщо датчик відбиття показує чорний колір, це означає, що робот знаходиться точно на лінії, і ми хочемо рухатися прямо, встановивши двигуни на однакову швидкість. Але якщо датчик відбиття показує сірий або білий колір, це означає, що робот частково або повністю з'їхав з лінії. Ми хочемо виправити це, повертаючи його назад до центру, але чи повертати вліво чи вправо? На жаль, цього неможливо визначити. Робот не має можливості дізнатися, в якому напрямку він відхиляється від лінії. Замість цього спробуйте слідувати за краєм лінії. Якщо ми спробуємо слідувати за лівим краєм, то існує два можливих стани, в яких реагує робот. * Якщо датчик показує значення, ближче до білого, це означає, що ми занадто далеко вліво, тому нам потрібно трохи повернути вправо. * Якщо датчик показує значення, ближче до чорного, це означає, що ми занадто далеко вправо, тому нам потрібно трохи повернути вліво. І все! Ми хочемо продовжувати швидко опитувати (отримувати значення) відбивального і щоразу визначати, чи він ближче до білого (зі значенням менше 0,5) чи до чорного (зі значенням більше 0,5), і залежно від результату, або налаштовувати двигун на поворот праворуч (встановлювати швидкість лівого двигуна швидшою за правий), або поворот ліворуч (встановлювати швидкість правого двигуна швидшою за лівий). Це схоже на рішення, що передбачає використання оператора if-else. Наша умова буде пов'язана з тим, чи значення більше або менше 0,5. Оператор :code:`if` / :code:`else` дозволяє виконувати різні блоки коду на основі *умови* (такого ж типу, як *умова*, яку ви використовували в циклі :code:`while`) Розглянемо наступний приклад коду: .. tab-set:: .. tab-item:: Python .. code-block:: python from XRPLib.defaults import * while True: if drivetrain.get_left_encoder_position() > 20: print("Left encoder is greater than 20 cm") else: print("Left encoder is less than 20 cm") .. tab-item:: Blockly .. image:: media/if-else.png :width: 300 У цьому прикладі коду ми просто показуємо різні повідомлення на комп'ютері на основі значення лівого енкодера, але ви можете ввести будь-який код, який захочете, у блоки. Наприклад, ви можете змусити робота повертати за годинниковою стрілкою або проти годинникової стрілки залежно від умови, використовуючи оператор :code:`if` / :code:`else`. .. figure:: media/on_off_control.png :align: center Дії, які повинен виконати ваш робот на основі того, що бачить датчик. Вище наведено ілюстрацію того, як ми хочемо, щоб робот діяв на основі показань сенсора. .. admonition:: Спробуйте Напишіть код, який використовує оператор :code:`if` / :code:`else`, щоб повернути робота в той чи інший бік на основі даних датчика відбиття. Для цього використовуйте функцію :code:`drivetrain.set_speed`, задаючи різні швидкості для лівого і правого коліс. Пам'ятайте, що використання більш високої швидкості на лівому колесі змусить робота повернути праворуч, і навпаки. Ви можете використовувати свою функцію ``is_over_line()``, щоб перевірити, чи бачить датчик лінію. Вам доведеться експериментувати з різними значеннями швидкості для кожного колеса; якщо швидкість буде занадто високою, ваш робот з'їде з лінії, не встигнувши її виправити, а якщо занадто низькою, ваш робот не встигне виправити положення і буде крутитися по колу. Постарайтеся, щоб ваш робот слідував за лінією якомога швидше!