Роботи, лабіринти й архітектура поглинання (исходники), Різне, Програмування, статті

Введення


Робототехніка давним давно вийшла за межі науково-фантастичних романів і в даний час є однією з рушійних сил, що визначають прогрес в багатьох областях, таких як автоматизація виробництва, медицина, космос і т.д. Важливу роль в робототехніці грають програмні симулятори, тому що вони не тільки спрощують роботу інженерів, а й дозволяють дослідникам випробовувати новітні алгоритми штучного інтелекту (AI) і машинного навчання. Одним з таких симуляторів є Simbad – проект з відкритим кодом, розроблений на основі технології Java 3D. У даній статті ми розповімо, як програмувати віртуальних роботів, використовуючи інструментарій Simbad, для отримання кращого уявлення про одну з філософій проектування роботів – архітектурі поглинання (subsumption architecture).


Початок статті присвячено короткому огляду робототехніки та концепції архітектури поглинання. Потім ми перейдемо до інструментарію Simbad і розповімо, як, використовуючи його, можна реалізувати дану архітектуру. Після цього прийде час створення простого робота відповідно до описаної архітектурою. Зрештою, ви поринете в цікавий світ лабіринтів і створите Другий робот, який, подібно Гомеру з Сімпсонів, зможе самостійно з них вибиратися. Зрозуміло, створені роботи будуть “віртуальними”, тобто будуть жити у віртуальному середовищі Simbad.


Програмування роботів


На даний момент не існує єдиного, всіма визнаного визначення терміну “робот”. У нашій статті, під роботом ми будемо мати на увазі щось, що складається як мінімум з следуюшіе компонентів:



Традиційна робототехніка


Під традиційної робототехнікою зазвичай розуміється період розвитку даної галузі аж до 1986 року. Для того часу було характерно уявлення про робота, як про механізм, керованому центральним контролером (Мозком), який постійно оновлює своє уявлення про навколишній світ і виробляє план поведінки, виходячи з цього подання. Нова інформація про світ надходить від сенсорів, наприклад, дотику, світла, ультразвуку і т.д. Мозок аналізує всю інформацію від сенсорів і оновлює уявлення про навколишнє середовище, а потім приймає рішення про те чи іншу дію. Всі дії виконуються за допомогою приводів і ефекторів. Перші зазвичай є якісь двигуни, під’єднані до пристроїв, безпосередньо взаємодіє з навколишнім світом – ефекторів. Прикладами останніх можуть служити колеса або руки. При цьому іноді під приводами (actuators) розуміються як самі приводи, так і ефектори.


Таким чином, традиційний робот отримує дані від безлічі сенсорів, комбінує ці дані в процесі оновлення картини світу, потім виробляє план дій на основі даної картини, і нарешті, приводить його у виконання. На жаль, даний підхід пов’язаний з певними труднощами. По-перше, він вимагає великого обсягу обчислень. По-друге, підтримка актуальної картини навколишнього світу – задача дуже складна, тому що світ змінюється постійно. При цьому відомо, що багато організми, наприклад, комахи, благополучно існують і без підтримки повної картини світу, більш того, навіть не маючи пам’яті як такої. Так може варто спробувати перейняти їх підхід до функціонування? Подібні міркування стали відправною точкою нової течії в робототехніці, домінуючого в даний час. Воно отримало назву “поведінкова робототехніка” (behavior-based robotics – BBR).


Архітектура поглинання


Одним із способів організації BBR-роботів є архітектура поглинання, запропонована в 1986 р. Родні Бруксом (Rodney A. Brooks) – в даний час головою лабораторії штучного інтелекту в Массачусетському Технологічному Інституті (MIT) – в його фундаментальної статті під назвою “Слони не грають в шахи”. Згідно Бруксу, поведінкові роботи можна розглядати як набір простих і незалежних поведінкових вузлів (behaviors), кожен з яких визначається двома речами – тим, що викликає дану поведінку (як правило, інформація, яка надходить від сенсорів), і тим дією, що є його результатом (як правило, виконаним за допомогою ефектора). Поведінки можуть нашаровуватися один на одного, а також конфліктувати між собою. В цьому випадку, в дію вступає спеціальний механізм арбітражу, який вирішує, яка поведінка в даний момент є пріоритетним. Ключовим моментом є те, що поведінка робота, як єдиного цілого, не закладається заздалегідь, а вимальовується з взаємодії його поведінкових вузлів. Більш того, на думку прихильників BBR, глобальне поведінка є чимось більшим, ніж просто суперпозицією його частин. Воно поглинає кожне з локальних, низькорівневих поводжень. В цілому, ідея полягає в тому, що замість проектування робота і точного опису його поведінки у всіх ситуаціях, можна просто додавати поведінкові вузли і дивитися, що вийде в результаті.


Simbad: середа для моделювання роботів







 



LEGO Mindstorms

У даній статті розглядається створення програмних агентів (ботів), але якщо вас цікавлять реальні фізичні роботи, то зверніть увагу на LEGO Mindstorms – чудовий інструментарій для робототехніка.


Слоган в штаб-квартирі LEGO Mindstorms говорить: “Ми зробимо для робототехніки те, що iPod зробив для музики” (“We will do for robotics what iPod did for music”). Перша версія Mindstorms була представлена в 1998 р. і відразу ж перевершила очікування LEGO за обсягом продажів. Ціна комплекту ($ 250) може здатися трохи завищеною, але не забувайте, що стільки ж коштує iPod Classic, а він є практично у кожного .


При цьому iPod не надає собою такого інтересу для злому як Mindstorms. Варто було вийти першим релізом Mindstorms, як різного роду хакери почали зламувати і аналізувати блоки RCX, які є “Мізками” роботів. LEGO перебувала в деякому подиві і спочатку не могла вирішити, чи залишити все як є або ж випустити офіційну вимогу припинити подібні дії. До честі керівництва компанії, вони вирішили надати хакерам повну свободу дій стосовно Mindstorms.


Це призвело до розквіту спільноти Mindstorms. Одним з наслідків стало стороннє портування платформи Mindstorms під інші мови, такі як C і Java, в той час, як сам інструментарій спочатку постачався тільки разом з графічним мовою програмування NXT-G. В результаті, більше половини користувачів інструментарію – це дорослі фахівці.


Simbad призначений для програмного моделювання роботів. Згідно Web-сторінці проекту, Simbad “надає програмні засоби для розробки роботів, опису їх впливу на навколишній світ, а так само використання сенсорів. Simbad був у першу чергу розроблено для дослідників, яким необхідний простий інструментарій для вивчення ситуаційного штучного інтелекту, машинного навчання і алгоритмів AI взагалі, особливо стосовно до автономним роботам і агентам “.


Simbad був розроблений на Java Луї Уге (Louis Hugue) і Ніколя бредеш (Nicolas Bredeche). Проект розміщений на сервері SourceForge.net і може вільно використовуватися або модифікуватися відповідно до ліцензією GNU GPL (General Public License).


Технічні подробиці


Світ у середовищі Simbad може містити як агентів (роботів), так і різні неживі предмети, такі як, ящики, стіни, джерела світла і т.д. Час в цьому світі дискретно, тобто розбито на інтервали. Simbad включає в себе планувальник, що розподіляє час між агентами. Аналогічно реальним роботам, агенти Simbad мають як сенсори (датчики відстані, дотику, світла і т.д.), так і приводи (як правило, колеса). У будь відведений йому час, робот може виконувати якусь дію.


Класи, що реалізують агентів, повинні перевизначати метод performBehavior(), Який описує їх поведінку. Усередині цього методу робот може аналізувати надходить від сенсорів інформацію і змінювати обертальну і поступальну складові швидкості руху. На виконання методу performBehavior() відводиться короткий проміжок часу, тому не можна віддавати такі команди, як, наприклад, “просунутися вперед на один метр”. Для того щоб обійти це обмеження як правило доводиться постійно контролювати стан, в якому знаходиться робот. Крім цього можна використовувати таймер для відстеження кількості тимчасових інтервалів, протягом яких робот знаходився в поточному стані.


Simbad API


У прикладах до даної статті в основному порушуються питання, пов’язані з наступними двома пакетами, що входять до складу Simbad API:


Реалізація архітектури поглинання за допомогою Simbad







 



Румба

У той час як я пишу ці рядки, Румба (Roomba) пилососить килим у мене під ногами (при цьому періодично наштовхуючись на кошеня). Румба – це робот, розроблений компанією iRobot, заснованої трьома випускниками MIT: Рідні Бруксом, Коліном Енгла (Colin Angle) і Хелен Грейнер (Helen Greiner). Він був створений у згоді з принципами архітектури поглинання і надає відкритий інтерфейс, що дозволяє змінювати його поведінку самим довільним чином. Книга Тода Курта (Tod E. Kurt) “Зламуючи Румбу” розповідає про безліч таких можливостей.


Реалізовувати архітектуру поглинання на основі Simbad ми почнемо з оголошення класу-нащадка Agent під назвою BehaviorBasedAgent. Кожен екземпляр даного класу буде містити масив поводжень (об’єктів типу Behavior), А так же булеву матрицю, що зберігає інформацію про їх попарному поглинання.






private Behavior[] behaviors;
private boolean suppresses[][];

Клас BehaviorBasedAgent виступає в ролі планувальника поводжень. У лістингу 1 наведений фрагмент коду, ітерірующего по масиву поводжень та регулюючого їх запуск. При цьому змінна currentBehaviorIndex використовується для зберігання посилання на поведінку, яка має бути активовано на наступному кроці алгоритму.


Лістинг 1. Цикл для почергової активації поводжень та вирішення конфліктів





protected void performBehavior() {
boolean isActive[] = new boolean[behaviors.length];
for (int i = 0; i < isActive.length; i++) {
isActive[i] = behaviors[i].isActive();
}
boolean ranABehavior = false;
while (!ranABehavior) {
boolean runCurrentBehavior = isActive[currentBehaviorIndex];
if (runCurrentBehavior) {
for (int i = 0; i < suppresses.length; i++) {
if (isActive[i] && suppresses[i][currentBehaviorIndex]) {
runCurrentBehavior = false;
break;
}
}
}
if (runCurrentBehavior) {
if (currentBehaviorIndex < behaviors.length) {
Velocities newVelocities = behaviors[currentBehaviorIndex].act();
this.setTranslationalVelocity(newVelocities
.getTranslationalVelocity());
this
.setRotationalVelocity(newVelocities
.getRotationalVelocity());
}
ranABehavior = true;
}
if (behaviors.length > 0) {
currentBehaviorIndex = (currentBehaviorIndex + 1)
% behaviors.length;
}
}
}

Відзначте, що метод performBehavior() перевантажує аналогічний метод в класі simbad.sim.Agent.


У класі поведінки Behavior оголошено два абстрактних (abstract) методу:


Приклад блукаючого робота, притягивающегося до джерел світла


Тепер прийшов час створити програмного робота (або бота), який буде включати 4 нижчеперелічених поведінки, що зберігаються в порядку убування пріоритету. Код бота показаний в лістингу з другого по п’ятий.


Лістинг 2. Клас Avoidance (На основі демонстраційного прикладу SingleAvoiderDemo.java з поставки Simbad)




public boolean isActive() {
return getSensors().getBumpers().oneHasHit()
// getSensors().getSonars().oneHasHit();
}
public Velocities act() {
double translationalVelocity = 0.8;
double rotationalVelocity = 0;
RangeSensorBelt sonars = getSensors().getSonars();
double rotationalVelocityFactor = Math.PI / 32;
if (getSensors().getBumpers().oneHasHit()) { / / Сталося зіткнення
translationalVelocity = -0.1;
rotationalVelocity = Math.PI / 8
– (rotationalVelocityFactor * Math.random());
} else if (sonars.oneHasHit()) { / / Зчитування показань ехолокаторов
double left = sonars.getFrontLeftQuadrantMeasurement();
double right = sonars.getFrontRightQuadrantMeasurement();
double front = sonars.getFrontQuadrantMeasurement(); / / Перешкода близько
if ((front < 0.7) // (left < 0.7) // (right < 0.7)) {
double maxRotationalVelocity = Math.PI / 4;
if (left < right)
rotationalVelocity = -maxRotationalVelocity
– (rotationalVelocityFactor * Math.random());
else
rotationalVelocity = maxRotationalVelocity
– (rotationalVelocityFactor * Math.random());
translationalVelocity = 0;
} else {
rotationalVelocity = 0;
translationalVelocity = 0.6;
}
}
return new Velocities(translationalVelocity, rotationalVelocity);
}

Лістинг 3. Клас LightSeeking (На основі демонстраційного прикладу LightSearchDemo.java з поставки Simbad)




public boolean isActive() {
float llum = getSensors().getLightSensorLeft().getAverageLuminance();
float rlum = getSensors().getLightSensorRight().getAverageLuminance();
double luminance = (llum + rlum) / 2.0;
/ / Активізуватися якщо джерело світла неподалік
return luminance > LUMINANCE_SEEKING_MIN;
}
public Velocities act() { / / Повертати в бік джерела світла
float llum = getSensors().getLightSensorLeft().getAverageLuminance();
float rlum = getSensors().getLightSensorRight().getAverageLuminance();
double translationalVelocity = 0.5 / (llum + rlum);
double rotationalVelocity = (llum – rlum) * Math.PI / 4;
return new Velocities(translationalVelocity, rotationalVelocity);
}

Лістинг 4. Клас Wandering




public boolean isActive() {
return random.nextDouble() < WANDERING_PROBABILITY;
}
public Velocities act() {
return new Velocities(0.8, random.nextDouble() * 2 * Math.PI);
}

Лістинг 5. Клас StraightLine class




public boolean isActive() {
return true;
}
public Velocities act() {
return new Velocities(0.8, 0.0);
}

У лістингу 6 показано поглинання одних поводжень іншими.


Лістинг 6. Оголошення булевої матриці, яка описує попарне поглинання поводжень




private void initBehaviorBasedAgent(BehaviorBasedAgent behaviorBasedAgent) {
Sensors sensors = behaviorBasedAgent.getSensors();
Behavior[] behaviors = { new Avoidance(sensors),
new LightSeeking(sensors), new Wandering(sensors),
new StraightLine(sensors), };
boolean subsumes[][] = { { false, true, true, true },
{ false, false, true, true }, { false, false, false, true },
{ false, false, false, false } };
behaviorBasedAgent.initBehaviors(behaviors, subsumes);
}

У даному прикладі набір поводжень повністю впорядкований відповідно до пріоритетом. У загальному випадку, це необов’язково.


В якості вправи ви можете спробувати реалізувати наступні речі:


Лабіринти


“Ну, нарешті! Я так і знала, що з цього лабіринту можна вибратися, діючи за алгоритмом Трьом!” – Ліза Сімпсон

З усієї маси алгоритмів виходу з лабіринтів, два виділяються тим, що використовують об’єм пам’яті, що не залежить від розміру самого лабіринту. Вони відомі під назвами “слідування уздовж стіни” (wall-following) і алгоритм Пледжа. Останній був названий на честь Джона Пледжа (Jon Pledge) з Ексетера, який винайшов алгоритм у віці 12 років. Крім цього є ще чудовий алгоритм трьома (Tremaux algorithm) – Улюблений алгоритм Лізи Сімпсон – але з метою спрощення ми розглянемо тільки перші два.







 



Алгоритми генерації лабіринтів

Інтерес представляють не тільки алгоритми виходу з лабіринтів, але і їх генерації. Лабіринти, що розглядаються в даній статті, називаються досконалими (perfect), завдяки тому, що існує один і тільки один варіант проходу між будь-якими двома точками лабіринту. Завдяки цій умові виключаються петлі, острови, а так само ізольовані ділянки. Більшість алгоритмів, що генерують вчинені лабіринти, працюють таким чином: вони починають з простого лабіринту, що представляє собою тільки зовнішню стіну і поступово додають внутрішні ділянки. При цьому на кожному кроці необхідно виключати можливість появи петель, ізольованих секцій і т.д.


Проходження вздовж стіни


Цей алгоритм настільки простий, що багато навчаються йому ще в дитинстві. Все що потрібно для виходу – це вести лівою рукою по лівій стіні (або правою рукою по правій стіні) поки не зустрінете вихід. Нескладно бачити, що даний алгоритм працює бездоганно для лабіринтів, в яких вхід і вихід розташовані на периметрі. На жаль, алгоритм не можна застосовувати у випадку, якщо вихід розташований на острові – частини лабіринту, не з’єднаної з іншими стінами. У цій ситуації алгоритм не знайде вихід, тому що не можна перестрибнути порожній простір до острова, не відриваючи руку від стіни.


Алгоритм Пледжа


Алгоритм Пледжа більш складний, але зате здатний знаходити вихід з більшого числа лабіринтів за рахунок можливості переходів від одного острова до іншого. Ідея алгоритму полягає в тому, що треба вибрати якусь абсолютне напрям (північ, південь, захід або схід) і завжди намагатися його дотримуватися. Назвемо його кращим напрямком. У випадку якщо ви упираєтеся в стіну, ви повертаєте направо і рухаєтеся відповідно до алгоритму “слідування уздовж стіни” до тих пір, поки не виконається дві умови. Перше – це поворот в кращому напрямку, а друге – сума всіх раніше зроблених поворотів дорівнює нуля (при цьому кожен поворот проти годинникової стрілки приймається за одиницю, а за годинниковою стрілкою, відповідно, за мінус одиницю). Після цього ви продовжуєте рухатися в бажаному напрямі поки це можливо і так далі. Умова на нульову суму поворотів необхідно для уникнення різного роду пасток, наприклад, ділянок лабіринтів, що мають форму G (намалюйте її на папері і відразу зрозумієте, про що я).


Алгернон: робот, вибирається з лабіринтів


Настав час здивувати ваших друзів, створивши робота на ім’я Алгернон (Algernon), завданням якого буде вихід з лабіринтів.


Проектування робота


Для реалізації як алгоритму Пледжа, так і проходження вздовж стіни необхідно точно визначати момент, коли робот підходить до розгалуження в лабіринті, а також мати можливість вказати, який напрям вибрати.


Напевно це можна реалізувати безліччю способів, але ми будемо використовувати спеціальний сенсор – ехолокатор, розташований на лівій стороні робота. Цей сенсор буде посилати сигнали при перетині відгалужень ліворуч по ходу руху. Для того щоб визначати, що попереду глухий кут, ми додамо ще один сенсор – датчик торкання, розташований в лобовій частині робота.


Реалізація алгоритму проходження вздовж стіни


Весь код Алгернона буде розміщений в пакеті algernon.subsumption. Алгернон – це досить простий робот і його цілком можна запрограмувати в процедурному стилі. У той же час, навіть для такого простого робота, підхід, заснований на поглинанні поводжень, робить код набагато чистіше, легше для розуміння, а також сприяє кращій організації модулів.


Ми зробимо ще одне припущення з метою спрощення прикладу: будемо вважати, що всі стіни перетинаються під прямими кутами. Іншими словами, всі повороти наліво і направо здійснюються виключно на 90 градусів.


Ліворукий алгоритм проходження вздовж стіни можна декомпозировать на чотири різних поведінки:



Поведінкою необхідно присвоїти пріоритети. У даному прикладі, ми їх виберемо в тому ж порядку, в якому вони перераховані вище. У підсумку нам знадобляться чотири класи-спадкоємця Behavior:



У лістингу 7 показаний код класу GoStraight, В якому TRANSLATIONAL_VELOCITY – Це константа, рівна 0.4:


Лістинг 7. Реалізація поведінки для руху по прямій





public boolean isActive() {
return true;
}

public Velocities act() {
double rotationalVelocity = 0.0;
return new Velocities(TRANSLATIONAL_VELOCITY, rotationalVelocity);
}


Код класу TurnRight показаний в лістингу 8. Метод getRotationCount() повертає кількість тимчасових інтервалів, необхідних для повороту на 90 градусів при даній швидкості обертання.


Лістинг 8. Реалізація поведінки для повороту направоBehavior code for turning right





public boolean isActive() {
if (turningRightCount > 0) {
return true;
}
RangeSensorBelt bumpers = getSensors().getBumpers(); / / Перевірка переднього бампера.
if (bumpers.hasHit(0)) {
backingUpCount = 10;
turningRightCount = getRotationCount();
return true;
} else {
return false;
}
}

public Velocities act() {
if (backingUpCount > 0) { / / Робот уперся в стіну. Треба трохи відійти назад перед поворотом
backingUpCount–;
return new Velocities(-TRANSLATIONAL_VELOCITY, 0.0);
} else {
turningRightCount–;
return new Velocities(0.0, -Math.PI / 2);
}
}


Для повороту ліворуч, Алгернон повинен спочатку трохи просунутися вперед так, що стіна зліва від нього закінчиться. Потім він повертається ліворуч і проходить ще трохи вперед так що, на його ліву сторону знову знаходиться стіна. Код показаний в лістингу 9.


Лістинг 9. Реалізація поведінки для повороту наліво





public boolean isActive() {
if (postGoingForwardCount > 0) {
return true;
}
RangeSensorBelt sonars = getSensors().getSonars(); / / Перевірка ехолокатора зліва
if (sonars.getMeasurement(1) > 1.0) { / / Зліва коридор
preGoingForwardCount = 20;
postGoingForwardCount = 40;
turnLeftCount = getRotationCount();
return true;
} else {
return false;
}
}

public Velocities act() {
if (preGoingForwardCount > 0) {
preGoingForwardCount–;
return new Velocities(TRANSLATIONAL_VELOCITY, 0.0);
} else if (turnLeftCount > 0) {
turnLeftCount–;
return new Velocities(0.0, Math.PI / 2);
} else {
postGoingForwardCount–;
return new Velocities(TRANSLATIONAL_VELOCITY, 0.0);
}
}


Код класу ReachGoal показаний в лістингу 10.


Лістинг 10. Поведінка при виявленні виходу з лабіринту





public boolean isActive() {
RangeSensorBelt sonars = getSensors().getSonars();
/ / Попереду відкритий простір? Іншими словами, чи знайшли ми вихід з лабіринту?
double clearDistance = 1.2;
return sonars.getMeasurement(0) > clearDistance
&& sonars.getMeasurement(1) > clearDistance
&& sonars.getMeasurement(3) > clearDistance
&& sonars.getMeasurement(2) > clearDistance;
}
public Velocities act() { / / Зупинка
return new Velocities(0.0, 0.0);
}

Головний метод, який визначає поведінку Алгернона приведений в лістингу 11.


Лістинг 11. Код управління поведінками Алгернона





private void initBehaviorBasedAgent(
algernon.subsumption.BehaviorBasedAgent behaviorBasedAgent) {
algernon.subsumption.Sensors sensors = behaviorBasedAgent.getSensors();
algernon.subsumption.Behavior[] behaviors = { new ReachGoal(sensors),
new TurnLeft(sensors), new TurnRight(sensors),
new GoStraightAlways(sensors) };
boolean subsumes[][] = { { false, true, true, true },
{ false, false, true, true }, { false, false, false, true },
{ false, false, false, false } };
behaviorBasedAgent.initBehaviors(behaviors, subsumes);
}

На малюнку 1 показано, як Алгернон рухається по лабіринту.


Рисунок 1. Алгернон, що рухається по лабіринту
Algernon running a maze

Зауважимо, що робот успішно вирішує завдання виходу, незважаючи на те, що жоден з його компонентів нічого не знає не тільки про лабіринти, але навіть про стінах. Не існує ніякого центрального вузла, який виступає в ролі мозку, що прораховує шлях виходу. В цьому і полягає суть архітектури поглинання: складну поведінку, нібито спеціально спроектоване для вирішення конкретного завдання, вимальовується при взаємодії простих, нашарованих один на одного поводжень.


Висновок


В даній статті розглядалося створення простого програмного робота. Програмування реального, фізично існуючого робота являє собою значно складнішу задачу, в основному через те, що доводиться враховувати всі аспекти впливу навколишнього світу. Наприклад, в розглянутому прикладі було досить просто змусити робота рухатися прямо уздовж стіни. В реальному світі з його нерівними поверхнями, вельми непросто реалізувати рух робота таким чином, щоб він не бився об стіну і одночасно не віддалявся від неї занадто далеко. Так що, навіть якщо ви любите програмувати, не факт, що програмування роботів доставить вам задоволення, тому що часто це вимагає більше механічної, ніж творчої роботи.


Зверніть увагу на інструментарій LEGO Mindstorms, якщо ви зацікавилися проектуванням і програмуванням роботів. В якості альтернативи, можна попрацювати з роботами BEAM (Biological Electronic Aesthetics Mechanics). BEAM далі розвиває ідею поведінкової робототехніки, взагалі прибираючи програмування як таке. Глобальне поведінку робота визначається жорстко заданими сполуками поведінкових вузлів, що працюють на рефлексах. Заплативши не більше $ 30 ви зможете побудувати свого першого BEAM-робота. Також можна спроектувати робота за кресленнями, які ви знайдете в книзі Гарета Бранвіна (Gareth Branwyn) “Створення роботів для абсолютних новачків”. Ну і, нарешті, завжди можна купити Румбу і зламати його.


Один з вражаючих висновків, до якого я прийшов, почавши займатися програмуванням роботів, а також після поверхневого знайомства з кодом інших розробників, – це те, що необов’язково писати довгі програми, щоб створити робота, який володіє досить великою функціональністю. При цьому, правда, часто доводиться довго шліфувати програму і експериментувати з константами, щоб робот робив саме те, що потрібно. Використовуючи ж інструментарій LEGO Mindstorms, ви цілком зможете створити простого робота за вечір.


Робототехніка – це свого роду захоплююча субкультура, що включає в себе книги, змагання, відео і т.д. Цілком можливо, що навіть недалеко від вас є клуб або гурток любителів роботів.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*