Рухи керують моторами робота та його системою керування. Ви можете використовувати послідовні команди руху, розділяючи їх переносом рядка, як у програмі Hello World!. Роботи Sphero рухаються за допомогою трьох основних інструкцій: heading (напрямок), speed (швидкість) та duration (тривалість). Наприклад, якщо ви задаєте heading = 0°, speed = 60, duration = 3s, робот буде котитися вперед протягом 3 секунд з помірною швидкістю. Деякі роботи, такі як Sphero BOLT+ і Sphero RVR/RVR+, мають покращені енкодери моторів, що дозволяє встановлювати рух робота на конкретну відстань у сантиметрах (см), а не за певний проміжок часу.
Що таке шкала 255 і чому вона використовується для швидкості?
Шкала 255 пов'язана з пам'яттю комп'ютера і використовується замість відсотків для того, щоб молодші користувачі краще розуміли, як працює комп'ютерна пам'ять. Пам'ять у її найпростішій формі складається з бінарних цифр 0 і 1, де кожна з цих цифр називається бітом. Хоча один біт може представляти лише значення 0 або 1, кілька бітів можуть комбінуватися для представлення більших значень, так само як одиничні цифри 1, 2 і 3 можуть комбінуватися для представлення числа 123 у десятковій системі числення, яку ми зазвичай використовуємо поза контекстом програмування. У цьому прикладі десяткової системи, 3 в одиничному місці, 2 в місці десятків і 1 в місці сотень комбінуються, щоб представити число сто двадцять три. Оскільки бінарна цифра може представляти лише одне з двох значень, лічба в бінарній системі використовує місце одиниць, місце двійок, місце чотвірок, місце восьмиць, місце шістнадцяток тощо, замість одиниць, десятків, сотень.
Аналіз того, як комп'ютер рахує до п'яти, ілюструє цей концепт. 0 в одиничному місці (0) означає нуль. 1 в одиничному місці (1) означає одиницю. 1 у місці двійок і 0 в одиничному місці (10) дорівнює двом. 1 в обох місцях (одиниці та двійки) (11) додається для отримання трьох. 1 у місці чотвірок (100) дорівнює чотирьом. І, нарешті, 1 в обох місцях чотвірок та одиниць (101) дорівнює п'яти. Підсумовуючи, комп'ютер, що рахує від нуля до п'яти, виглядає так: 0, 1, 10, 11, 100, 101. Тоді як біт представляє один 1 або 0, байт представляє вісім бітів. Оскільки байт може містити вісім одиничних або нульових значень, найбільше значення, яке байт може представляти, заповнений одиничними бітами (11111111), дорівнює 255. Тому використання найменшої кількості пам'яті для значення (одного байта) пропонує діапазон від 0 до 255. Оскільки роботи Sphero мають обмежену пам'ять для зберігання значень, важливо ефективно використовувати пам'ять, тому ми використовуємо один байт з можливими значеннями від 0 до 255 для представлення швидкості.
Roll (Котитися)

await roll() поєднує heading (напрямок - від 0 до 360°), speed (швидкість - від -255 до 255) та duration (тривалість - час (с)), щоб змусити робота котитися однією командою. Наприклад, щоб змусити робота котитися на 90° зі швидкістю 200 протягом 2 секунд, використовуйте:
await roll(90, 200, 2); // котитися (90°, 200 швидкість, 2 с)
Roll to Distance (Котитися на відстань)

await rollToDistance() поєднує heading (напрямок - від 0 до 360°), speed (максимальна швидкість - від -255 до 255) та distance (відстань - в сантиметрах), щоб змусити BOLT+ та RVR/RVR+ котитися однією командою. Наприклад, щоб котитися на 90°, з максимальною швидкістю 200 на 200 см, використовуйте:
await rollToDistance(90, 200, 200);
// котитися (90°, 200 швидкість, 200 см)
Зверніть увагу, що точність відстані залежить від кількох факторів, зокрема від поверхні під BOLT+ або RVR/RVR+ та ваги вантажу на борту (у разі RVR/RVR+).
Оскільки BOLT+ і RVR/RVR+ намагаються точно націлюватися на конкретну відстань за допомогою Roll to Distance (котитися до відстані), прошивка керує швидкістю інакше, ніж при використанні await roll() (котитися з очікуванням). Існує період прискорення та сповільнення на початку та в кінці руху робота. Ці переходи допомагають зменшити ковзання, яке може вплинути на точність енкодера. В результаті, ваша максимальна швидкість може не бути досягнута, якщо ви встановили коротшу відстань для руху. Експериментуйте з вашою відстанню та максимальною швидкістю для отримання бажаних результатів.
Drive (Керування)

drive() (керування) активує або деактивує інтерфейс управління рухом у додатку Sphero Edu. Це дозволяє вам вручну керувати Sphero BOLT+ одночасно виконуючи додатковий код. Для активації інтерфейсу управління використовуйте drive(true) (керування (включити)). Для деактивації інтерфейсу використовуйте drive(false) (керування (вимкнути)).
Важливо розуміти, що інтерфейс управління буде деактивовано автоматично, якщо більшість команд руху використовуються після команди drive. Наприклад, спостерігайте за наступним фрагментом коду:
drive(true); // керування (включити)
await delay(25);
await roll(0, 255, 5); // котитися (0°, 255 швидкість, 5 с)
drive(true);
await delay(25);
await roll(0, 255, 5);
У цьому прикладі інтерфейс управління з'явиться і буде доступний для використання протягом 25 секунд, що є тривалістю встановленої затримки. Після виконання команди roll інтерфейс управління автоматично вимкнеться. Наступні команди руху вимикають інтерфейс управління при використанні після команди Drive (керування):
- Roll (котитися)
- Roll to Distance (котитися до відстані)
- Spin (обертання)
- Speed (швидкість)
- Heading (напрямок)
- Raw Motor (тільки мотор)
Наступні команди руху не вимикають інтерфейс управління при використанні після команди Drive (керування):
- Stabilization (стабілізація)
- Stop (зупинка)
- Reset Aim (скидання напрямку)
Інтерфейс управління має два елементи інтерфейсу користувача: керування рухом вашого BOLT+ та повзунок швидкості. Оскільки в інтерфейсі управління немає контролю напрямку, вам потрібно буде використовувати команду Reset Aim (скидання напрямку) у креативний спосіб для скидання вашого напрямку. Наприклад, ви можете скинути напрямок одразу після команди drive (керування):
drive(true); resetAim();
Або ви можете використати команду On Button event (подія на кнопці), щоб вручну скинути напрямок простим натисканням кнопки в будь-який час:
var _softwareButtonEvents = ['Reset Aim'];
async function startProgram() {
registerSoftwareButton(_softwareButtonEvents);
drive(true);
}
async function onSoftwareButton(button) {
if (button !== 'Reset Aim') return;
resetAim();
}
registerEvent(EventType.onSoftwareButton, onSoftwareButton);Існує безліч інших способів креативно керувати напрямком при використанні команди Drive (керування). Експериментуйте і досліджуйте відповідно до ваших потреб програмування!
Stabilization (Стабілізація)

setStabilization(true) (включити стабілізацію) включає систему стабілізації, setStabilization(false) (вимкнути стабілізацію) вимикає її. Коли стабілізація включена, робот тримається вертикально за допомогою Inertial Measurement Unit (IMU) (інерціальна вимірювальна одиниця), яка є комбінацією даних з Accelerometer (акселерометр - напрямкова прискореність), Gyroscope (гіроскоп - швидкість обертання) та Encoders (енкодери - місцезнаходження та відстань).
Після виклику setStabilization(false) (вимкнути стабілізацію) і включення моторів робот не буде балансувати. Це призведе до нестабільної поведінки, наприклад, до хитання під час руху або стрибків, якщо ви встановите дуже високу потужність.
Деякі випадки, коли варто вимикати стабілізацію:
- Стрибки: встановіть Raw Motor (тільки мотор) на максимальні значення, і робот стрибне з землі!
- Гіроскоп: програми, як Spinning Top (вертушка), де ви хочете ізолювати показники гіроскопа замість того, щоб робот автоматично балансувався всередині оболонки.
Коли стабілізація вимкнена, ви не можете використовувати setSpeed (встановлення швидкості) для встановлення швидкості, оскільки це вимагає увімкненої системи керування. Однак ви можете керувати моторами за допомогою Raw Motor (тільки мотор) із await rawMotor() (тільки мотор з очікуванням).
Spin (Обертання)
await spin() (обертання) змушує робота обертатися на задану кількість градусів протягом часу, при цьому 360° є одним обертом.
Наприклад, щоб обернути робота на 360° за 1 секунду, використовуйте:
await spin(360, 1); // обертання (360°, 1 сек)
Використовуйте setSpeed() (встановлення швидкості) перед await spin() (обертання), щоб змусити робота рухатись по колу або дузі.
Speed (Швидкість)

setSpeed() (встановлення швидкості) встановлює швидкість робота від -255 до 255, де позитивна швидкість - вперед, негативна - назад, а 0 означає зупинку. Кожен тип робота транслює це значення по-різному у реальний швидкісний режим; наприклад, Ollie (Оллі) майже в три рази швидший за Sphero (Сферо). Наприклад, використовуйте setSpeed(188) (встановлення швидкості) для встановлення швидкості 188, яка збережеться, поки ви не зміните швидкість. Ви також можете подивитися значення реальної швидкості в сантиметрах на секунду, яке надається енкодерами моторів.
Stop (Стоп)

stopRoll() (зупинка котіння) встановлює швидкість на нуль для зупинки робота, що ефективно є тим самим, що й команда setSpeed(0) (встановлення швидкості).
Heading (Напрямок)

setHeading() (встановлення напрямку) встановлює напрямок, в якому котиться робот. Припускаючи, що ви націлюєте робота так, що блакитне заднє світло спрямоване на вас, то 0° (0°) - вперед, 90° (90°) - праворуч, 270° (270°) - ліворуч, і 180° (180°) - назад. Наприклад, використовуйте setHeading(90) (встановлення напрямку) для того, щоб робот рухався праворуч.
Raw Motor (Тільки мотор)

await rawMotor() (тільки мотор) керує електричною потужністю, що подається на лівий і правий мотори незалежно, на шкалі від -255 до 255, де позитивне значення - вперед, негативне - назад, а 0 означає зупинку. Якщо ви встановите обидва мотори на повну потужність, робот стрибне, оскільки стабілізація (використання IMU для підтримки робота у вертикальному положенні) вимкнена при використанні цієї команди. Це відрізняється від setSpeed, оскільки await rawMotor() (тільки мотор) надсилає "електричну силу" на мотори, тоді як setSpeed (встановлення швидкості) - це цільова швидкість, виміряна енкодерами. Наприклад, щоб встановити мотори на повну потужність протягом 4 секунд і змусити робота стрибнути з землі, використовуйте: await rawMotor(255, 255, 4).
Reset Aim (Скидання напрямку)

resetAim() (скидання напрямку) скидає калібрування напрямку (aim) до поточного напрямку робота як 0° (від 0 до 360°). Наприклад, використовуйте resetAim(90) (скидання напрямку) для використання поточного правого напрямку робота як 0°. Коли resetAim() (скидання напрямку) використовується в полотні блоків, його можливості обмежені встановленням поточного переднього напрямку робота як 0°.
Sphero BOLT має компас (магнітометр) з унікальними функціями. Металеві та магнітні об'єкти поблизу можуть впливати на точність компаса, тому намагайтеся використовувати цю функцію в місцях без перешкод або піднімайте робот в повітря, якщо не можете уникнути перешкод.
Calibrate Compass (Калібрування компаса)

await calibrateCompass() (калібрування компаса) калібрує магнітометр, обертаючи робота на місці. Ви повинні виконати цю команду перед встановленням або отриманням напрямку компаса. Металеві та магнітні об'єкти поблизу можуть впливати на точність компаса.
Compass Direction (Напрямок компаса)

setCompassDirection() (встановлення напрямку компаса) встановлює реальний напрямок на основі останнього калібрування компаса. 0° - на північ, 90° - на схід, 180° - на південь, 270° - на захід. Потрібно виконати команду Calibrate Compass (калібрування компаса), перш ніж ви зможете встановити це значення.
Наприклад, щоб націлити Sphero BOLT на північ, використовуйте:
async function startProgram() {
await calibrateCompass();
setCompassDirection(0);
}Droid Animations (Анімація дроїдів)

await Animation.DroidName.Category.AnimationName.play() (відтворення анімації дроїда) відтворює знакові анімації дроїдів Star Wars, унікальні для BB-8, BB-9E та R2-D2, що поєднують рухи, світло та звук. Назви дроїдів пишуться як BB8, BB9E та R2D2. Ви можете випадковим чином змінювати анімації та звуки, не вказуючи категорію та ім'я анімації, наприклад: await Animation.R2D2.play(). Якщо ви вказуєте категорію, але залишаєте ім'я анімації порожнім, воно випадково вибирається в межах цієї категорії, наприклад: await Animation.R2D2.Patrol.play().
Усі анімації для дроїдів наведені нижче:
BB-8
- Positive: Giddy (Веселий), Yes (Так)
- Negative: Angry (Злий), No (Ні)
- Action: Electrified (Електричний), Number 8 (Число 8), Searching (Пошук), Square (Квадрат)
BB-9E
- Action: Retreat (Відступ), Scan Sweep (Сканування)
- Positive: Affirmative (Підтверджено), Content (Задоволений), Greetings (Привітання), Understood (Зрозуміло), Yes (Так)
- Negative: Agitated (Тривожний), Alarm (Тривога), Angry (Злий), Antagonized (Антагонізований), Furious (Лютий), No (Ні)
- Watch With Me: Angry (Злий), Antagonized (Антагонізований), Bored (Нудьгуючий), Bow (Поклон), Defiant (Відкритий), Disagree (Не згоден), Disappointed (Розчарований), Disbelief (Невербальність), Double Take (Подвійний погляд), Doubtful (Сумнівний), Excited (Захоплений), Frustrated (Розчарований), Furious (Лютий), Happy (Щасливий), Laugh (Сміх), No (Ні), Ominous (Зловісний), Relieved (Звільнений), Shake (Тремтіння), Surprised (Здивований), Uncertain (Невизначений), Yelling (Крики), Yoohoo (Йуху)
R2-D2
- Action: Drive (Їздить), Scan (Сканує), Sleep (Спить), Spin (Крутиться)
- Idle: Idle 1 (Бездіяльність 1), Idle 2 (Бездіяльність 2), Idle 3 (Бездіяльність 3)
- Negative: Alarm (Тривога), Angry (Злий), Annoyed (Роздратований), Ion Blast (Іонний вибух), No (Ні), Sad (Сумний), Scared (Наляканий)
- Patrol: Alarm (Тривога), Hit (Удар), Patrolling (Патрулює)
- Positive: Chatty (Балакучий), Confident (Впевнений), Excited (Захоплений), Happy (Щасливий), Laugh (Сміх), Surprised (Здивований), Yes (Так)
- Watch With Me: Angry (Злий), Anxious (Тривожний), Bow (Поклон), Concern (Турбота), Curious (Здивованість), Double Take (Подвійний погляд), Excited (Захоплений), Fiery (Вогненний), Frustrated (Розчарований), Happy (Щасливий), Jittery (Тремтячий), Laugh (Сміх), Long Shake (Довга тряска), No (Ні), Ominous (Зловісний), Relieved (Звільнений), Sad (Сумний), Scared (Наляканий), Shake (Тремтіння), Surprised (Здивований), Taunting (Насмішка), Whisper (Шепіт), Yelling (Крики), Yoohoo (Йуху)
R2-Q5

Анімації для R2-Q5 недоступні :(
R2D2.setDomePosition() rotates the dome on its axis, from -160° to 180°. For example, set to 45° using setDomePosition(45).
Stance (Позиція)

Stance (позиція) змінює положення між двома ніжками (bipod) та триніжками (tripod).
Встановіть на bipod (дві ніжки), використовуючи: await setStance(Stance.Bipod) І на tripod (три ніжки), використовуючи: await setStance(Stance.Tripod). Tripod (три ніжки) необхідний для котіння.
Waddle (Хитання)

Waddle (хитання) змінює ходу робота на хитаючу, увімкнувши її за допомогою: await setWaddle(true) І вимкнувши її за допомогою: await setWaddle(false).
