Рис. 8.110. Примеры лабиринтов. Робот для лабиринта Каковы характеристики робота? Поскольку приходится иметь дело с замкнутым пространством, робот не должен быть быстрым. В «пря- моугольном мире» поворот на 90 градусов должен осуществляться с высокой точностью, как и проезд одной ячейки вперед. Соприкоснове- ние со стеной для робота нежелательно, но не должно вызывать немед- ленного выхода его из строя. Кроме того, стоит предусмотреть способ- ность двигаться вдоль стены при непрерывном касании. Датчики ульт- развука, которые помогут определять расстояние до стен, следует располагать не на самом краю корпуса, чтобы соблюсти минимальное расстояние видимости ультразвукового датчика 5 см. Исходя из перечисленных условий, оптимальным будет выбор кон- струкции компактного гусеничного робота. Построить его можно на основе одного конструктора 8547 или конструктора 9797 с добавлением двух гусениц из ресурсного набора 9695. Модель подобного робота предлагается в наборе 8547 в качестве одного из примеров. В нашей версии постараемся сделать робота более компактным за счет извлече- ния третьего мотора (рис. 8.111—8.117). Самую важную часть — гусе- ницы — следует закрепить наиболее прочно, по возможности с пре- дельным натяжением. 274 Рис. 8.111. Крепление моторов с помощью 11-модульной балки и угловых со- единительных штифтов. Рис. 8.112. Дополнительные уголки размером 3 ´ 5 для крепления блока NXT. Рис. 8.113. Для крепления колесных дисков используются 8-модульные оси в задней части робота.
275 Рис. 8.114. Вертикальные балки для крепления NXT спереди могут быть лю- бой длины. В оранжевые диски моторов вставляются 10-модульные оси. Рис. 8.115. Колесные диски прижимаются к желтым втулкам. Рис. 8.116. Гусеницы можно закрепить 16-модульными балками с выступами.
276 Рис. 8.117. Первая версия тележки готова. Направление движения робота — вперед оранжевыми дисками мо- торов, подключенный на порты B (левый) и C (правый). Протестируйте работоспособность модели на примере программ из NXT Program. Известный лабиринт Первое, что научится выполнять наш робот, — точные перемеще- ния. Для начала их будет всего три вида: проезд одной клетки вперед, поворот направо на 90 градусов, поворот налево на 90 градусов. Выде- лим их в три отдельных набора команд (рис. 8.118). Строго говоря, ко- манды такого типа являются высокоуровневыми, т. е. содержат внутри себя какие-то сложные действия, исполняемые операционной системой, которые программисту не видны. В системах с виртуальным исполни- телем «Робот» так и происходит. Для реализации этого в физическом мире необходимо научиться управлять роботом на «низком уровне», т. е. все команды управления роботом указывать достаточно подробно. Моторы B, C впередЖди 1000 наэнкодере B МоторыстопРис. 8.118. Реализация трех базовых команд для лабиринта на языке Robolab. 277 Конструкция гусеничного робота такова, что проезд ячейки длиной 30 см требует поворота моторов примерно на 1000 градусов. А поворот на 90 градусов на месте выполяняется при повороте одного мотора на 500 градусов вперед, а другого на –500 градусов назад. Пример на языке Robolab показывает прохождение первых трех ячеек лабиринта (рис. 8.119). Программа составлена из трех блоков ко- манд, повторяющихся в разном порядке. Рис. 8.119. Пример программы прохождения трех ячеек лабиринта. Первые запуски, скорее всего, приведут к тому, что робот начнет зацепляться за неровности в стенах лабиринта своими бортами. Для защиты от зацепов существует элементарное решение, уже использо- ванное в шагающем роботе для NXT 2.0. Это горизонтальные свободно вращающиеся колесики (рис. 8.120). Рис. 8.120. Горизонтальные колесики устанавливаются на гладкие штифты или оси в круглые отверстия на изогнутых балках. После установки колесиков в передней части робота можно до- биться выравнивания при движении вдоль стен лабиринта даже при не- достаточно точных поворотах. Возвращаясь к программированию, придется признать, что дейст- вуя по предложенному выше алгоритму, можно составить программу прохождения лабиринта размером 5 ´ 5, которая уже не уместится в один экран Robolab. Копирование блоков сильно удлиняет программу,
278 что увеличивает вероятность возикновения ошибок, а при смене струк- туры лабиринта делает редактирование затруднительным. Опытный программист сразу догадается, что можно использовать подпрограммы! Для ясности управления следует представить робота как классиче- ского исполнителя с тремя базовыми командами: «Вперед», «Налево», «Направо». Каждая из них является высокоуровневой и с точки зрения реального исполнителя — довольно сложной. Команда «Вперед» — это проезд одной клетки лабиринта с последующей остановкой. Команды «Налево» и «Направо» — это повороты на 90 градусов с максимально возможной точностью. Недостатки исполнения команд, связанные с люфтом и трением, придется компенсировать конструктивно. По принципу нумерования верхних кнопок контроллера NXT три процедуры получат соответствующие номера: 3 — «Вперед», 2 — «На- лево», 1 — «Направо». В процедуры стоит включить необязательные, но полезные действия, которые позволят лучше контролировать выпол- нение отдельных команд: остановки, задержки и звуковые сигналы. Используя отдельные вызовы процедур, составьте программу про- хождения некоторой части лабиринта (рис. 8.121). Обратите внимание, что для каждой конструкции робота значения градусов энкодера будут свои, даже при внешне одинаковых моделях они будут зависеть от множества незаметных факторов. Рис. 8.121. Три базовых действия в процедурах и начало программы прохож-дения лабиринта. 281 void left() // Поворот налево { motor[motorB]=-100; motor[motorC]=100; nMotorEncoder[motorC]=0; while(nMotorEncoder[motorC]<500); motor[motorB]=motor[motorC]=0; PlaySound(soundUpwardTones); wait1Msec(1000); } task main() // Основной алгоритм { while(true) { if(SensorValue[S1]>30) { // Если справа проем right(); forward(); } else if(SensorValue[S2]>30) // Если спереди свободно forward(); else left(); } } Следующим этапом может стать защита от застреваний. Поскольку повороты физической модели неидеальны, на любом из них робот мо- жет зацепиться за угол стены. Пусть читатель самостоятельно построит защиту от застреваний, аналогичную предложенной для робота, путе- шествующего по комнате. Удаленное управление Передача данных Контроллер NXT оснащен устройством беспроводной передачи данных Bluetooth второго класса. Это значит, что бесперебойная связь гарантирована на расстоянии до 10 м. Но качество и скорость обмена данными во многом будут зависеть от команд и алгоритмов, которые используются при программировании. Соединить можно как два кон- троллера между собой, так и контролер с компьютером или мобильным телефоном, оснащенным Bluetooth. Существует специальное программ- ное обеспечение, которое с компьютера или мобильного телефона по- зволяет передавать на NXT команды управления подключенными к не-
282 му устройствами: моторами, датчиками и пр. В этом случае нет необхо- димости запускать какую-либо программу на NXT-приемнике, доста- точно установить соединение. Если же необходимо передавать данные, то на приемнике и получателе запускаются разные программы, которые отправляют и обрабатывают полученные данные. Обмен информацией следует разделить на четыре составляющих: 1) установка соединения, 2) передача данных или управляющих команд, 3) прием данных или выполнение управляющих команд, 4) завершение соединения. Bluetooth-устройство, которое инициирует подключение, называет- ся ведущим (master). Устройство, которое принимает подключение, на- зывается ведомым (slave). К одному «мастеру» может быть подключены до трех ведомых NXT, по одному на каждый виртуальный порт (соот- ветственно на 1-й, 2-й и 3-й). Соединение можно устанавливать вручную, а можно и программ- но, эта функция реализована в RobotC. При первом соединении двух устройств запрашивается числовой пароль, который нужно ввести на каждом из них. Впоследствии он не требуется. Подключаемые устройства узнают друг друга по имени (по- этому все имена должны быть уникальными) и способны обмениваться данными. Рассмотрим порядок действий при установке соединения вручную. 1. Включить два NXT и убедиться, что у них уникальные имена. 2. На обоих контроллерах включить Bluetooth, вследствие чего в левом верхнем углу экрана должен появиться фирменный значок. 3. На ведомом контроллере включить опцию «Виден всем» (Visi- bility → Visible). 4. На ведущем контроллере включить режим поиска соседних устройств (Search). 5. Из списка найденных устройств выбрать ведомый и подклю- читься к нему. 6. При первом подключении потребуется ввести числовой код (по умолчанию «1234») и нажать «галочку». При последующих подключениях нужный контроллер можно будет найти по ин- мени в разделе My Contacts. 7. Выбрать любой порт: 1, 2 или 3. 8. При успешном соединении ведомый издаст звуковой сигнал (если включен звук) и на экране каждого из контроллеров ря- дом со значком Bluetooth появится ромбик «<>». Если подклю- чения нет, то останется значок «<», т. е. левая половинка ром- бика. 283 После того, как подключение состоялось, можно передавать файлы или запускать программы, поддерживающие обмен данными. При этом оба контроллера, и master, и slave на равных правах могут посылать и получать информацию. Со времен инфракрасной связи в RCX по «почте» передавался 1 байт, а в NXT допускаются большие числа: от –2 15 до 2 15 – 1, т.е. в диа- пазоне –32768...32767. Ноль в «почтовом ящике» означает, что ничего не было принято, поэтому отправлять его не имеет смысла. На NXT-приемник и NXT-передатчик загружаются разные про- граммы (рис. 8.125). Рис. 8.125. Передача числа 5 по нажатию датчика (слева) и ответный звуко-вой сигнал (справа). В общем случае перед приемом данных необходимо изначально инициализировать (т. е. обнулить) почтовый ящик, чтобы очистить его от писем, которые могли остаться от предыдущих сеансов. Команда «Жди письма» (Wait for mail) сама обнуляет его и ждет очередного письма с заданным значением. Если конкретное число не задано, ожи- дается письмо с ненулевым значением. Теперь рассмотрим пример с передачей двух различных чисел (рис. 8.126). Рис. 8.126. Передача чисел 4 или 5 по нажатию соответствующего датчика и ответные звуковые сигналы. На передатчике две параллельные задачи осуществляют отправку значений 4 или 5 в зависимости от того, какой из двух датчиков касания был нажат. Для повторного срабатывания после нажатия требуется от- пустить датчик. На приемнике также две параллельные задачи «загля- дывают» в почтовый ящик и вызывают соответствующий звуковой сиг- нал. При этом вызовы сигналов могут «наслаиваться» друг на друга, 284 поскольку письма с разными значениями могут приходить довольно часто. Передача данных является довольно медленной операцией, на га- рантированную доставку одного сообщения тратится 0.03 — 0.05 с. Можно, конечно, отправлять сообщения слишком часто, не заботясь о том, будут ли они приняты. В некоторых случаях работает и такой под- ход. Мы будем стремиться к устранению потерь пакетов при передаче. В двух приведенных выше примерах естественную задержку перед от- правкой письма создает сам человек, нажимая на датчик с некоторыми перерывами. Теперь рассмотрим пример удаленного управления мотором, в ко- тором задержки задаются программно (рис. 8.127). Чтобы увидеть его в действии, необходимо на приемник и передатчик прикрепить по мото- ру, подключив каждый к порту A (8.128). Рис. 8.127. Передача значения энкодера и управление скоростью удаленного мотора. Для передачи значения энкодера мотора A используется соответст- вующий модификатор (Value of Encoder A из палитры NXT Commands), значение которого отправляется в виде письма с задержкой 0.05 с на доставку пакета. На приемнике после обнуления почты используется модификатор (Value of Mail из палитры Modifiers), который несет в себе значение полученного письма (т. е. содержимое почтового ящика). Это значение подается в качестве скорости управляемого мотора A. Рис. 8.128. Приемник вращает колесо со скоростью, заданной на передатчике поворотом балки.
285 Рис. 8.129. Отображение принимаемого значения: слева — в виде числа, спра-ва — в виде диаграммы. Усовершенствуем приемник, добавив отображение принимаемого значения на экране в виде числа или даже диаграммы (рис. 8.130). На рис. 8.129 слева показано, что одновременно с управлением скоростью мотора на экране приемника отображается принимаемое значение. Задержка отсутствует, поскольку вывод на экран сам по себе является довольно существенной задержкой. На рис. 8.129 справа принимаемое значение в нижней части экрана отображается в виде изменяющегося прямоугольника, а в центральной — в виде числа. Поскольку максимальная ширина прямоугольника на экране 100 точек, что в 2 раза меньше диапазона скоростей мотора –100...100, то полученное по почте значение m смещается в неотрица- тельный диапазон и сокращается вдвое. Координата X одной пары вер- шин отображаемого прямоугольника находится в позиции 50 (визуаль- ная точка отсчета), а координата противоположной пары (значение красного контейнера) колеблется в диапазоне 0...100. Рис. 8.130. Диаграмма на экране NXT. Читатель может добавить в программу управление скоростью мо- тора, показанное на рис. 8.129, самостоятельно. Теперь рассмотрим удаленное управление положением мотора (рис. 8.131). Такая возможность полезна при взаимодействии с робо- том-манипулятором, который находится на удалении от оператора. Рис. 8.131. Управление положением удаленного мотора. 292 Дополнительный режим джойстика Пальцев на руке пять, а для удержания джойстика требуется два или три. Таким образом, для повы- шения эффективности управления мы можем ввести дополнительные датчики, которые будут отвечать, например, за изменение скорости («турбо-режим») или за удар по мячу с помощью третьего мотора. Рас- смотрим вариант с датчиком каса- ния, закрепленным на верхнем мото- ре (рис. 8.143). На кнопку удобно нажимать большим пальцем. Алгоритм управления следует несколько изменить. До сих пор мы тратили на каждый двигатель по 8 бит информации, что при имеющейся точности движений является из- быточным. Займем 1 бит для передачи показания датчика касания, у которого вариантов всего два: 0 (отпущен) и 1 (нажат). Заменив млад- ший бит четности, мы потеряем в точности управления в 2 раза, что бу- дет практически незаметно (рис. 8.144). { 4 4 4 4 8 4 4 4 4 7 6 43 42 1 43 42 1 65535 0 1 2 2 / ) 128 1 ( , 7 255 0 128 1 ... диапазоне в значение нное Закодирова S e значение бит ... диапазоне в e значение байт, старший 1 1001001 00110100 × + + Рис. 8.144. Замена бита четности на показания датчика касания S1. Чтобы избавиться от младшего бита, достаточно выполнить неза- тейливую процедуру: увеличенные показания энкодера разделить на 2 и умножить на 2. Поскольку деление происходит в целых числах, млад- ший бит неизбежно будет обнулен, а его место займет значение S1: L = (e1 + 128) ∙ 256 + (e2 + 128) / 2 ∙ 2 + S1 – 32 768. На принимающей стороне несколько изменится анализ младшего байта, а старшего останется прежним: Рис. 8.143. Датчик касания на джойстике.
293 v = ( m + 32 768) / 256 – 128, u = ( m + 32 768) % 256 / 2 ∙ 2 – 128, k = ( m + 32 768) % 2, v = v ∙ ( k + 1), u = u ∙ (2 – k) / 2. В переменную k будет записано переданное значение S1. Исполь- зуя ее, смоделируем режим «турбо», т. е. увеличение скорости v и по- нижение чувствительности к управлению u (рис. 8.145). Выбрав курс робота в обычном режиме, можно включить «турбо» нажатием кнопки, и робот выполнит рывок в нужном направлении. Рис. 8.145. Режим «турбо» включается датчиком касания на передатчике. Другой пример использования дополнительного бита — это нане- сение удара по мячу с помощью третьего мотора. По правилам игры в управляемый футбол, которая с 2011 г. проводится на Математико- механическом факультете Санкт-Петербургского государственного университета (СПбГУ), размер робота в момент удара по мячу не дол- жен превышать цилиндра диаметром 22 см и высотой 22 см. Для того, чтобы запрограммировать удар, необходимо логически отделить первый полученный сигнал к удару от всех последующих до тех пор, пока «клюшка» не будет приведена в исходное положение. В пылу игры человек может несколько раз нажать на кнопку и продер- жать ее в нажатом состоянии существенно дольше, чем это необходимо. Задача робота по требованию спокойно от начала до конца выполнить очередной удар и приступить к следующему только в том случае, если после завершения продолжает поступать соответствующий сигнал. Ал- горитм приемника приведен на рис. 8.146. Для передатчика подойдет программа из предыдущего примера (рис. 8.145). |