Показаны сообщения с ярлыком делаем марсоход. Показать все сообщения
Показаны сообщения с ярлыком делаем марсоход. Показать все сообщения

пятница, 16 июля 2010 г.

Марсоход: выбор комплектующих

Заработал я немного лишних денег, и решил вернуться к проекту создания марсохода. Если вдруг кто не знал или забыл, вкратце освещу историю этого проекта...
Итак, когда-то давным давно СССР успешно приземлило на Марс спускаемый модуль космического аппарата Марс-3. Связь с модулем прервалась через несколько секунд, скорее всего из-за воздействия марсианской пылевой бури. Для нас важно, что в составе этого спускаемого аппарата (задолго до Spirit'а и Opportunity) на Марсе оказался также и первый в мире достигший поверхности планеты марсоход, скромно называемый ПРОП-М (ПРибор Оценки Проходимости - Марс). Собственно, примерную копию именно этого марсохода я вознамерился создать.
Изготовив корпус, приобретя КПК ("мозг" робота) и довольно хорошо спроектировав программную часть будущего марсохода, я пока еще не обзавелся, на самом деле, всеми необходимыми комплектующими. И благодаря "экстра" деньгам, мне-таки удалось эту проблему решить, по большей части. В этом сообщении я постараюсь изложить соображения, которыми я руководствовался при выборе комплектующих, а также осветить современные возможности по приобретению этих компонентов.

Расчет веса робота

Прежде всего, хочется напомнить читателям, что марсоход использует очень необычный способ передвижения - лыжно-шагающий. Лыжи движутся синхронно - в одну сторону при движении вперед/назад, в разные стороны - при разворотах. Поэтому, каждой лыже нужен отдельный мотор.

Однако, важно отметить тот факт, что благодаря необычному шасси, марсоходу придется поднимать собственный корпус на высоту около 5-10 сантиметров над землей. Поэтому, чтобы определиться с используемыми моторами, совершенно необходимо правильно рассчитать будущий максимальный вес аппарата.
Основная нагрузка марсохода - это сами моторы и аккумуляторы, необходимые для их питания. В настоящем ПРОП-М аккумуляторов не было, поскольку питание подавалось по проводам. Однако, проводной робот кажется мне не слишком интересной целью. Поэтому, в нашем проекте аккумуляторы будут.
Кроме аккумуляторов и моторов, львиную долю веса робота составляет наш самодельный корпус из оцинкованного железа. Также, нельзя забывать и об электронике - КПК и микроконтроллере, и некотором минимальном наборе дополнительных датчиков, которые нередко помогают диагностировать неисправности в таком вот, "слепом", роботе.
Общие сведения о предполагаемых (или точных, если компонент уже выбран/изготовлен) весах каждой из комплектующих будущего робота я представил в виде таблицы:
КомпонентаВес (г.)
Корпус1000
Моторы и редукторы (пока неизвестные)300-400 x 2
Аккумулятор (пока неизвестные)500-600
КПК Palm m105124
Батарейки Duracell для КПК11.5 x 2
Микроконтроллер/робоконтроллер20-50
Дополнительные датчики100
Провода, крепления, изоляторы100
Итого~2800
Как видно из таблицы, робот будет весить, максимально, около 3 кг.

Выбор моторов

Давайте попробуем рассчитать, какие минимальные параметры должны иметь моторы, чтобы беспрепятственно поднимать 3 килограмма массы? Устройство лыжно-шагающего шасси подразумевает использование рычага, т.е. точка приложения силы находится на некотором расстоянии от вала двигателя.
Если измерить это расстояние на существующем шасси, получим значение 5,5 см.
Таким образом, нам нужно выбрать моторы, суммарный крутящий момент которых больше либо равен 3*5,5 кг*см, т.е. 16,5 кг*см, по 8,25 кг*см каждый мотор. В пересчете на Н*м, получаем значение 0,81 Н*м.
Примечание: В англоязычной литературе крутящий момент обозначается как torque.
Между прочим, спасибо за подсказку по физике Виталию Клебану, ведущему блога Искусственный интеллект и робототехника, а то я сам школьный курс совершенно забыл (благо, через пару лет мои дети уже в школу пойдут). Если у вас, вдруг, тоже проблемы с физикой, загляните на сайт с учебником по физике PhysBook.
К моторам также есть несколько требований иного рода:
  • Корпус имеет высоту 4 сантиметра, поэтому выезжать за эту высоту нельзя ни мотору, ни редуктору.
  • Номинальное напряжение мотора не должно быть выше 12В, а потребляемый на холостом ходу ток - не более 0,5А, т.к. иначе довольно сложно найти приемлемый по весу, размеру и цене аккумулятор достаточной емкости.
  • Желательно, чтобы с помощью редуктора, число оборотов в минуту было снижено до 30, максимум 60-90. Иначе, подозреваю, появятся удары лыжами о грунт.
Требуемый крутящий момент очень сильно сужает круг подходящих моторчиков. Где же найти такой?
Первым делом, я тщательно исследовал интернет-магазины радиолюбителей и моделистов, и обнаружил, что большинство имеющихся изделий характеризуются крутящим моментом всего лишь 0,01-0,5 кг*см.
Единственный найденный мною приемлемый вариант - это мотор от фирмы Pololu, причем наиболее мощный (и дорогой) в линейке - Metal Gearmotor 37Dx57L mm, с редуктором 122:1, номиналом в 12В и крутящим моментом 18 кг*см. Цена такого мотора - около 990 рублей, с доставкой получается больше 2000 рублей за два мотора.
Поскольку номинал мотора совпал с номиналом напряжения автомобильного аккумулятора, отсюда несложно предугадать следующее место поиска.
Моторы от стеклоочистителя, стеклоподъемника, моторы регуляции фар, мотор насоса омывателя стекла, и др. - в автомобиле этих моторов очень много. Однако, здесь нас тоже ждет немало препятствий.
Дело в том, что большинство из этих моторов довольно специфичны. Например, моторы омывателей стекол рассчитаны на кратковременное включение (чаще всего не более 10 с., с периодичностью не менее 60 с.), и ориентированы для кручения только в одну сторону.
Последнее место, которое я посетил - это аукцион Молоток, раздел Электродвигатели. Однако, моторчики там нередко продают по одному, да и мощные минимоторы не слишком распространены.
В конечном итоге, именно на Молотке нашел подходящие мотор-редукторы, с крутящим моментом 13,5 кг*см, выдающие 60 оборотов в минуту, и имеющие номинал 12В. Купил две штуки (+ доставка по почте) за 1750 рублей.
Шли они долго, почта России как это периодически бывает - сглючила. Но наконец-то пришли:

Кстати, вес купленных мной мотор-редукторов - 96 г. каждый. А значит, из рассчетных 2800 г. веса марсоходика, можно смело вычитать аж целых 600 г...

Выбор источника питания

Выбрав используемый мотор, пора переходить к аккумуляторам. Выбор аккумулятора довольно прост:
  • лучше всего использовать литий-ионные или литий-полимерные аккумуляторы: они очень легкие и надежные, и кстати именно литий-ионные аккумуляторы используются в современных марсоходах
  • напряжение аккумулятора должно максимально соответствовать номинальному напряжению мотора, а лучше - быть немного выше: при разрядке аккумулятора, напряжение на его выводах постепенно падает
  • необходимая емкость аккумулятора рассчитывается исходя из потребления тока мотором (эта величина, как правило, указана в спецификации), и желаемого количества часов возможности непрерывного передвижения робота
Для начала вспомним, где в быту встречаются аккумуляторы желаемого типа (Li-Ion). Думаю, всем первым делом пришли на ум аккумуляторы из мобильных телефонов и коммуникаторов/КПК, ведь простенький мобильник можно купить очень дешево, а у многих дома старые телефоны бесплатно валяются...
Однако, 90% аккумуляторов от сотовых телефонов имеют выходное напряжение 3,6В, что конечно слишком мало и для марсохода не подходит.
Еще обязательно нужно обратить внимание на аккумуляторы для ноутбуков. Чаще всего они выдают 11,1-14,4В, при этом имея порядочную емкость. Жаль, но ноутбука с рабочей батарейкой у меня пока нет...
Поискав в Google фразу "аккумулятор 14.4V", я обнаружил, что подходящие аккумуляторы присутствуют также в шуруповертах. Однако, здесь имеем проблему с габаритами, в 4см высоты корпуса аккумулятор от шуруповерта явно не влезет...
В быту - сплошные неудачи! Что же, может быть, повезет в интернет-магазинах.
Но и в интернет-магазинах, аккумуляторы Li-Ion или Li-Pol с номиналом напряжения 14,4В найти непросто. Зато свинцовые, с номиналом 12В - встречаются довольно часто, к тому же стоят значительно дешевле. Думаю, для большинства робототехнических целей свинцовые аккумуляторы вполне достаточны. И несмотря на их немаленький вес, в марсоход они вполне влезают - и по габаритам, и по весу.
Кроме собственно аккумулятора, требуется еще зарядное устройство, чтобы этот аккумулятор заряжать.
Конкретные аккумулятор и зарядное устройство я решил приобрести немного попозже.
Кстати, еще один классный источник аккумуляторов - UPSы. Стоит самый простой UPS около тысячи рублей, а это на самом деле очень дешево, поскольку в нем есть и сам аккумулятор (да еще какой, как правило от 7Ач!!), и зарядное устройство к нему. Проблема у этого решения тоже, конечно, имеется. Средний аккумулятор от UPS-а весит килограмма 2, не меньше. Да подходящие габариты найти непросто, если вообще реально... А вот для каких-то других проектов, особенно на колесной базе, вполне может подойти.
Помимо аккумулятора, для него нужно запастись зарядным устройством, так что на самом деле задача немного усложняется.
В итоге, аккумулятор пока не куплен, ищу какие-то более дешевые варианты.

Выбор микроконтроллера

Еще в начале проекта, я выбрал в качестве "мозгов" будущего робота Palm КПК. Во-многом из-за того, что вдобавок к хорошим возможностям программирования, монохромные батареечные КПК Palm имеют огромный ресурс безостановочной работы - около 40 часов.

Однако, между КПК и непосредственно внешними устройствами, совершенно необходимо промежуточное звено. Дело в том, что старенький Palm оснащен ИК- и COM-портами, и более ничем. Управлять с него двигателями напрямую - просто не получится.
Довольно стандартное решение в этом случае - использование микроконтроллера, например AVR, в связке с очень популярным драйвером двигателей L293D и микросхемой MAX232, использующейся для преобразования TTL-логики к логике компьютерного COM-порта (именно компьютерный вариант используется и на КПК Palm).
Можно даже немного облегчить себе задачу, поскольку подобные связки сейчас можно найти в виде готового решения. Конечно, я имею в виду контроллеры Arduino и все совместимые с ними.
Как выяснилось, сейчас довольно легко приобрести такие контроллеры, что я и сделал, заказав на сайте Freeduino.Ru контроллер Freeduino MaxSerial (кстати он уже пришел). Его вес 30 г., габариты более чем скромные, и с помощью обычного кабеля синхронизации Palm он спокойно подключается к КПК.

Что же, с основными компонентами, похоже, успешно разобрались. Датчики я предпочел оставить "на потом", ограничившись пока лишь механическими контактными бамперами.
Основные компоненты куплены и уже доставлены, так что по-тихоньку буду доделывать механику, что для меня, конечно, довольно сложный момент, но бум стараться. В общем, до встреч!

четверг, 1 мая 2008 г.

Видео марсохода

Виталий Клебан, владелец блога Quark Mobile Robotics, о создаваемых им роботах серии Quark - опубликовал классное видео, в котором наглядно представлено движение марсохода ПрОП-М, аналог которого я пытаюсь создать.

Это видео дает очень много информации о движении оригинала. Ценность его сложно переоценить!

Кстати, вкратце - о продвижении проекта. Продвижение есть: вообще говоря, несмотря на нехватку времени, я даже умудрился собрать шасси. Все зафиксировал на фотках, все вроде бы ничего, но - шасси не получилось. Точнее получилось хлипким, болтающимся, ненадежным. Эта ситуация, меня, конечно, не устраивает, поэтому я отложил публикацию материала до создания второй версии шасси, а на это, конечно, нужно время. Впрочем, параллельно идет работа и в других направлениях, поэтому скоро что-нибудь обязательно выложу, обещаю :)

Еще в блоге Виталия есть другой материал о космических роботах - доклад с конференции о перспективах развития отечественной космической робототехники. В видео-варианте. Рекомендую посмотреть!

P.S. Этот день, кстати, принес также хорошие новости с SEO-фронта. А именно, все мои главные проекты получили в результате последнего апдейта PR гордую четверочку. Дебютант своеобразного сообщества уже сайтов, которое я представляю, сайт Роботы: новости, форумы - отхватил PR 2. Уверен, в течение 3-4 месяцев он тоже подтянется до PR 4... Список моих робототехнических проектов, и проектах, в которых я принимаю участие, выглядит теперь следующим образом:

ПроектPRтИЦ
Робототехника в России. Каталог лучших сайтов по робототехнике440
Самодельный робот на основе ноутбука - в домашних условиях430
Этот блог - Роботы и робототехника430

RoboNews - новости Hi-Tech480
Новости робототехники. Форумы о роботах210

Собственно, господа рекламодатели, напоминаю: я всегда готов выслушать любые ваши предложения :)

воскресенье, 6 апреля 2008 г.

Программирование в Palm OS

В связи с созданием программной системы управления для проекта марсохода, немножко пришлось порыться в Интернете, и нашел, собственно, несколько полезных сайтов.

Хороший обзор возможностей программирования в Palm OS представлен в статье «Операционная система PalmOS для программиста» на CitForum.

Ознакомительная статья по CodeWarrior имеется на Ладошках. Там же, в колонке справа внизу - еще много статей по Palm OS. Читаем!

Много хороших ссылок в данном направлении дано на OpenNet. В частности, оттуда узнал, что даже интерпретатор Perl пытались в свое время сделать для Palm OS. Я лично Perl обожаю - насколько это вообще можно сказать, Perl - мой любимый язык программирования. И с Linux/Unix системами знаком очень близко, однако в качестве десктопа предпочитаю все же Windows. Но, не будем отдаляться от темы...

Еще один очень полезный ресурс по Palm OS расположился на Исходниках. Что может быть лучше, нежели чем иметь перед глазами готовые примеры? Ничего! Правда, большинство представленных исходников написаны под PRC-tools (для Linux/Unix систем), но приспособить их решения под CodeWarrior - дело пяти минут. Помимо исходников, данный сайт предлагает такие очень полезные вещи, как, например, SDK для Palm-ов, Sony CLIE и др. устройств и компонентов, с которыми можно работать в Palm OS. SDK я себе скачал первым делом!

Вообще, о текущем прогрессе... Оказывается, все-таки стрелки в UML-диаграммах я расставлять правильно не умею :) В частности, использование («use») иежду классами должно быть направлено в прямо противоположную сторону. Так что, пришлось полчаса поразгребать сгенерированный на основе UML код, чтобы он скомпилировался...

Как Вы уже поняли, я занят собственно написанием кода. Есть успехи: написал весь пакет CommPort, немного кода уже есть и в RobotMain. Уже сейчас проект нормально компилируется, умеет опрашивать COM-порт, и т.д. В данный момент занимаюсь проработкой модуля DBConnect (сохранение и загрузка данных из PDB-файла). Времени все это занимает не очень много, но у меня много и нету - как всегда, работа и семья съедают это время очень проворно :)

Помимо кода, занимаюсь также подбором моторов для робота (на сегодняшний день наиболее перспективной считаю возможность применения шаговых двигателей от старых матричных принтеров, которых мне подарили аж целых 5 штук...), тестированием этих моторов, подготовкой редукторов, и т.п. Также занимаюсь механикой шасси - готова, в принципе, схема креплений лыж к телу робота, однако мне эта схема на сегодняшний момент не нравится - конструкция страдает «болтанкой». Так что, придется оси удлинять и сажать на подшипники. Позже расскажу в подробностях, и с фотографиями, в чем там дело.

И еще одна не слишком, конечно, приятная новость, состоит в том, что, судя по всему, RoboNews.info загнулся окончательно. Уже больше месяца сайт не рожает новостей, ну, что же делать... Я создателям сразу говорил, что на энтузиазме они долго не протянут.

Зато пришла заявка в каталог Robotics.Ru: Робототехника в России - просится туда сайт Roboto.Ru, на первый взгляд мне понравился, да и контент уникальный. Буду пытаться связаться с владельцами, договориться о сотрудничестве... :)

вторник, 1 апреля 2008 г.

Проектирование робота. Диаграмма классов

В рамках серии статей «Изготовление аналога марсохода ПрОП-М».

Пора заканчивать проектирование (в общих чертах, поскольку все-таки мы к нему будем возвращаться постоянно). Остался очень важный этап - создание диаграммы классов. Конечно, это будет не полная диаграмма, но от нее мы будем отталкиваться. Диаграмма классов является полной декларативной классовой моделью будущей системы. Реализация проекта скорее всего планируется на C/C++, с точки зрения этих языков диаграмма классов содержит всю информацию, необходимую для создания хедеров проекта: названия классов, связи между ними, декларации методов и свойств каждого из классов. Со смысловым содержанием диаграммы, надеюсь, все теперь понятно. Еще замечу, что эта диаграмма создается с использованием всех созданных до этого диаграмм:

  • Диаграммы прецедентов
  • Диаграммы состояний
  • Диаграммы развертывания

Вкратце пройдусь по процессу проектирования:

Общий принцип - начинаем НЕ снизу!!, а «сверху». А там, наверху, у нас один единственный класс, с одним единственным экземпляром - это сам по себе Robot (буду называть его объект Robot). Само собой, здесь должна быть инициализация и финализация - пусть это будут процедуры Initialize() и Finalize(). Также этот объект (исходя из псевдооднозадачной модели Palm) обязательно должен содержать в себе метод, реализующий главный цикл программы. Так его и назовем: MainLoop(). В этом цикле программа должна опрашивать датчики, управлять моторами, принимать команды управления. Кроме того, одним из важнейших свойств робота будет являться его состояние (свойство State). А любая система, поведение которой основано на принципе перехода между состояниями (механизм конечных автоматов, подробно я описывал их в своей статье «Роботы и искусственный интеллект»), должна содержать метод перехода в следующее состояние, в зависимости от текущего состояния и состояния внешней среды. Назовем этот метод SwitchState().

Для хранения правил перехода между состояниями, сведений о самих состояниях, а также информации о смене состояний (лог) - можно использовать базу данных. Удобно создать интерфейсы к каждой таблице нашей БД в виде отдельной связки класс + коллекция. Таким образом, получаем следующие классы "данных" (исходя из требуемых функций системы):

  1. State + StateCollection - описания состояний (в основном используется только для отображения лога)
  2. ExternalEvent + ExternalEventCollection - описания внешних событий, из-за которых может быть инициирован переход между состояниями.
  3. StateLink + StateLinkCollection - связи между состояниями (правила перехода)
  4. StateChange + StateChangeCollection - лог состояний

Также, очевидно, что все эти классы будут использовать некоторый базовый класс для работы с БД - назовем его DBConnect.

Каждый из перечисленных классов будет содержать свойства, дублирующие поля соответствующей таблицы данных (т.о. класс=строка таблицы). Коллекция будет описывать все строки таблицы. Также, коллекция должна содержать методы для заполнения себя данными из БД, для загрузки этих данных обратно в БД, и для обработки этих данных - например, поиска нужной строки по какому-либо из полей.

Для порядка, все классы для связи с базой данных поместим в отдельный пакет - DB, и проставим связи между классами, вот что получилось у меня:

Кстати, еще одну связку коллекция + класс можно создать для хранения настроек программы, но это необязательно...

В объекте Robot целесообразно разместить экземпляры всех трех описанных коллекций для быстрого доступа к ним.

Как я уже упомянул, объект верхнего уровня Robot взаимодействует в основном с датчиками и двигательной системой. Также необходимо предусмотреть связь с устройством управления (в данном случае под устройством управления я понимаю графический интерфейс Palm-приложения), имеющую право на жизнь ради тонкой быстрой настройки и тестирования.

Таким образом, необходимо создание как минимум трех классов - системы датчиков, двигательной системы, и интерфейсного класса.

Модель взаимодействия с этими классами с точки зрения объекта Robot достаточно примитивна - каждый внешний класс имеет свойство State; Robot вызывает метод Work() каждого из классов, тот по определенным правилам изменяет свое свойство State, и далее Robot использует это свойство как один из факторов, влияющих на изменение его собственного свойства State...

Экземпляры классов объявлены внутри объекта Robot. Нетрудно догадаться, что каждый из описываемых классов использует тот же самый механизм конечных автоматов, и те же самые вспомогательные классы для работы с DB.

Однако, помимо считывания состояний, классами двигательной системы и графического интерфейса можно управлять. Я не буду слишком заострять внимание на графическом интерфейсе, т.к. он по сути дела имеет право на жизнь только в рамках тестирования - а сосредоточусь на двигательной системе.

Согласно требованиям диаграммы прецедентов, двигательная система должна выполнять следующие основные функции (в скобках приведены названия соответствующих методов):

  • Движение на заданное число шагов вперед (GoForward)
  • Движение на заданное число шагов назад (GoBackward)
  • Поворот на заданный угол (Turn)
  • Поворот на заданный угол и движение вперед (TurnAndGoForward)
  • Поворот на заданный угол и движение назад (TurnAndGoBackward)
  • Остановка

Внутри класса двигательной системы есть два объекта класса Motor - и все управление происходит с помощью этих объектов. Они, кстати, тоже имеют собственное состояние (State)... Классы Motor и Sensor оба описывают внешние устройства, поэтому наследуют от абстрактного класса ExternalDevice. Единственным свойством этого класса является ExternalID - идентификатор внешнего устройства, которым управляет конкретный класс. Для реализации связи с последовательным портом имеется еще два класса - высокоуровневый (CommDispatcher) и низкоуровневый (CommDriver).

Итоговая диаграмма:

Пакет RobotMain:

Пакет CommPort:

В общем-то, на этом работа закончена. Осталось лишь упомянуть, что я использовал для разработки диаграммы инструмент Enterprise Architect 7.0 от компании Sparx Systems, и этот неплохой в принципе инструмент (30-тидневная версия доступна бесплатно) позволяет, как, впрочем, и другие среды разработки UML, генерировать заготовку кода согласно представленной диаграммы классов. Получается вот такой симпатичный списочек файлов:

А это, собственно, означает, что скоро, очень скоро, по-тихоньку будет появляться и собственно код!

Продолжение следует...

воскресенье, 30 марта 2008 г.

КПК Palm. Программирование COM-порта

Очень напряженная и загруженная (но вместе с тем плодотворная) была рабочая неделя, а в выходные развлекались так, что дух захватывало. В общем, насыщенные 7 дней наконец-то кончились, пора и вспомнить об уважаемых читателях, которыми я очень дорожу :)
Выкраивая буквально по 10-15 минут, написал-таки я статью «Palm. COM-порт (RS232). Программирование. IDE CodeWarrior» - про тестирование работы COM-порта, и программирование этого порта применительно к КПК Palm. Статья, написанная в рамках серии статей по созданию марсохода, правда, получилась слишком большая для блога, поэтому я выложил ее на еще не до конца готовом сайте моего нового проекта RobotLab.Ru.
Пара слов о RobotLab.Ru. Проект «Лаборатория робототехники» будет посвящен практике и только практике! Он будет иметь намного более общую направленность, нежели чем сайт «Самодельный робот», но в определенном отношении будет является продолжением и развитием идеи этого моего старого сайта. Кратко темы, которые я буду стараться на сайте осветить:
  • Эффективные конструкторские и электронные решения
  • Организация рабочего места робототехника
  • Где достать материалы, компоненты, платформы
  • Программирование поведения роботов
  • Описания готовых проектов, в основном в виде пошаговых руководств
  • С чего начать? Выбор направления, проектирование
Кстати, кратенько поделюсь успехами и достижениями по другим моим проектам:
  • «Самодельный робот» установил 21го марта скромный рекорд по посещаемости - 150 человек в сутки! Месячная посещаемость стремительно приближается к порогу в 3 000 уникальных посетителей.
  • Блог «Роботы и робототехника» - количество подписчиков наконец-то превысило пять десятков!
В общем и целом, такие дела!

пятница, 21 марта 2008 г.

Реализация марсохода. Диаграмма развертывания

В рамках серии статей «Изготовление аналога марсохода ПрОП-М».

Лично я, как профессиональный программист, не привык задумываться о реализации. Благо кода написал за свою жизнь не одну сотню тысяч строк, и представить абсолютно любую мысль в коде не представляется проблемой. Чаще проблемными являются задачи более высокого уровня - продуманное проектирование, согласование с заказчиком, решение бизнес-задач. Но иногда от особенностей реализации никуда не уйти.

Вот отвлеченный пример: для некой системы необходимо сделать отчеты. Это обычные отчеты, ничего примечательного, и вроде как проблема решается элементарно - создаем генератор отчетов, генерируем их столько сколько нужно, и потом по запросу клиента можем нагенерировать еще бесконечно много. И все это, поверьте, прекрасно работает! Только вот возникает одна проблема: база данных (полностью нормализованная) у системы - немаленькая. Некоторые таблицы содержат многие миллионы записей. И сгенерированные запросы к этой базе начинают банально тормозить из-за своей неоптимальности. И приходится переделывать, создавая штучные хранимые процедуры, специально проработанные именно для каждого конкретного отчета...

Это называется - зависимость от аппаратной части. В робототехнике, как несложно догадаться, эта зависимость - еще более серьезная. А особенно явно проявляется зависимость - в работах робототехников-любителей, которые не могут себе позволить выделить значительные средства на свое хобби, и заказать любые детали. Приходится довольствоваться тем, что есть, и тем, что можно откуда-нибудь выломать :)

От механическо-электронной основы робота зависят способы и возможности реализации программной части.

Именно поэтому следующей фазой проектирования я выбрал построение диаграммы развертывания (одна из стандартных диаграмм UML) - схемы, отражающей развертывание логической сущности робота на конкретных физических деталях. Пример диаграммы развертывания доступен на моем сайте «Самодельный робот».

Рассмотрим процесс построения диаграммы подробно. Сгруппировав все предыдущие наработки, мы получили наличие следующих систем в роботе:

  1. Двигательная система
  2. Система датчиков
  3. Система управления

Эти системы можно показать на диаграмме в виде «пакетов». Внутри каждого пакета следует указать вложенные элементы. Исходя из относящихся к передвижению функций робота - движение вперед, назад, и разворот на месте, принимаем решение, что двигательная система должна состоять как минимум и наиболее оптимально из двух одинаковых по характеристикам моторов, на каждую из лыж по мотору. При использовании только одного мотора повороты будут невозможны, а при использовании более одного мотора на одну лыжу встает излишняя проблема синхронизации этих моторов. Также очевидно, что и для осуществления поворотов, и для замера пройденного расстояния - необходимы датчики обратной связи для каждого из моторов. В самом минимальном варианте эти датчики могут быть представлены двумя «кнопками», отмечающими определенное, «исходное» положение лыж робота. В идеале нужны полноценные датчики, показывающие изменение положения лыж с точностью до нескольких градусов.

Система датчиков состоит только из двух датчиков переднего бампера, но потенциально может быть расширена приборами для определения других характеристик окружающей среды, например, это может быть датчик давления, термометр, фото- или видеокамера и др. Возможность расширения необходимо предусмотреть.

Система управления, напомню, должна обеспечивать следующие возможности: ведение логов состояний и выдача их по запросу, дистанционное проводное управление роботом, автономный объезд препятствий. Ограничения при выборе реализации системы управления: соблюдение заявленного общего веса марсохода в 4.5 кг, и указанных размеров - 22х25х4см. Компьютер в качестве системы управления отбрасываем сразу - слишком громоздко. Есть, правда, вариант с mini-ITX, такая карточка бы в наш корпус влезла, но карточки mini-ITX у меня нет, а я поставил задачу обойтись имеющимися средствами. Конечно, почти идеально подошел бы для описанных функций микроконтроллер. Он, помимо всего прочего, имеет больше всего шансов пережить креш-тесты. Однако, микроконтроллера у меня тоже нет. Зато, есть КПК Palm m505...

В статье «Робот на основе КПК» я рассказывал о преимуществах и недостатках использования КПК в качестве «мозгов» робота. Но, несмотря на сделанные выводы, все-таки попробую. Основная проблема, напомню - сопряжение КПК с внешними устройствами. Подсчитаем, сколько внешних устройств будет иметь система, и сколько входящих и исходящих сигналов потребуется обработать - минимум, максимум, и ожидаемо.

  • Минимум - 2 кнопки в бампере, 2 кнопки для датчиков обратной связи, итого 4 датчика (4 входящих бинарных сигнала); 2 мотора, каждый может вращаться в двух направлениях - итого 4 исходящих бинарных сигнала.
  • Максимум - 2 кнопки в бампере, 4 кнопки и две ИК-пары для датчиков обратной связи, термометр, датчик давления, 4 фотодатчика, фотокамера (управляющие исходящие сигналы на включение/выключение/съемку + сложный входящий сигнал на получение фотографии), видеокамера (аналогично фотокамере), 4 управляющих исходящих бинарных сигнала для моторов.
  • Ожидаемо - 2 кнопки в бампере, 4 кнопки для датчиков обратной связи, фотокамера, 4 управляющих исходящих бинарных сигнала для моторов.

Как видно, самый минимум - это обработка 8 обычных параллельных контактов - 4 входящих и 4 исходящих. Однако, уже на текущем этапе планируется использование фотокамеры, а для передачи фотоизображения банальными контактами не обойдешься. В общем, очевидно, что система для управления внешними устройствами и сбора данных от них должна иметь другую архитектуру, нежели чем чаще всего используемые прямые подключения к LPT-порту.

На КПК Palm, и на многих других КПК, в том числе и современных - реализован, как минимум частично, интерфейс RS232, обеспечивающий последовательную передачу данных. Программно COM-порт на Palm управляется достаточно тривиально, почти как на компьютере. Это - как раз то, что нам и нужно!

Очевидно, дело за малым - найти или спаять некоторую схему, которая бы управлялась через интерфейс RS232, позволяла бы адресовать специальными командами пространство внешних устройств, с целью передачи и считывания информации с этих устройств.

Такие схемы есть в готовом виде, например, комплект PPRK (Palm Pilot Robot Kit) использует одну из них - SV203. Но здесь важно вовремя остановиться! Наша цель - всего лишь построить диаграмму развертывания, а в детали реализации углубляться можно бесконечно...

Подытожим: робот функционально состоит из трех больших систем-пакетов, каждая из которых содержит несколько вложенных элементов, являющихся по сути некоторыми внешними устройствами. На диаграмме нужно показать наши пакеты, вложенные в них элементы, и связи между элементами и пакетами.

Вот диаграмма, которая получилась у меня:

Пакет «Система управления»:

Пакет «Двигательная система»:

Пакет «Система датчиков»:

В данном посте я постарался представить общие способы проектирования, на примере логики построения UML-диаграмм. Многие робототехники являются по большей части механиками, конструкторами, но не слишком продвинутыми программистами - поэтому часто важнейший момент создания робота - проектирование - пропускают. Благодаря построению описанной диаграммы развертывания, мне удалось выделить все физические элементы системы, с помощью которых будет реализован проект, и связи между ними. Опираясь на созданную диаграмму развертывания, можно приступать к проектированию диаграммы классов, полностью описывающую классовую модель будущего приложения. Кроме того, благодаря составлению этой диаграммы, известны компоненты, необходимые для создания робота - можно приступать к их поиску или изготовлению.

Продолжение следует...

четверг, 20 марта 2008 г.

Обоснование выбора проекта робота

В рамках серии статей «Изготовление аналога марсохода ПрОП-М».

Часто спрашивают - почему я выбрал именно марсоход ПрОП-М, как его можно будет потом использовать, и что я с ним буду делать, если он ползает со скоростью черепахи...

У человечества всегда было только два всеобъемлющих инстинкта: сохранение рода и любопытство. Любопытство, эксперименты, изобретательство, стремление познать неизведанное - это одна из важнейших целей нашей жизни. Иначе, согласитесь, жить было бы скучновато :)

Однако мною движет даже не только любопытство. Я всеми фибрами души уверен - первый в мире марсоход был сделан очень неглупыми людьми. Команда передовых ученых, создавших этот уникальный аппарат - располагала огромными мощностями и обширными знаниями, и даже спустя почти 40 лет даже самый продвинутый робототехник-любитель никоим образом не может сравниться с ними - в этом я уверен. Но поучиться у них - есть чему! Что я и попытаюсь продемонстрировать.

Очевидно, что лозунгом, под которым осуществлялось изготовление марсохода - можно смело считать словосочетание "Простота и надежность". И иначе никак, ведь за миллионы километров от Земли - любая оплошность может послужить провалом важнейших научных исследований. А чем проще система, тем по теории меньше в ней возможных ошибок.

Даже на первый взгляд, даже не зная устройства марсохода - бросаются в глаза интересные решения. Оригинальное шасси. Даже банальный бампер касания - и тот сделан весьма необычно.

Вот что пишет А.Л. Кемурджиан в книге «Планетоходы» об особенностях проектирования передвижных аппаратов для использования на иных планетах:

«самым характерным качеством планетохода является его способность перемещаться по поверхности планеты»

«Характерным для конструкции узлов планетохода является применение легких сплавов, ажурность конструкции, оптимальность форм отдельных узлов, позволяющая весь материал конструкции включить в силовую систему нагружения.»

«Свойства поверхностного слоя грунта и пониженная (повышенная) гравитация накладывают особые требования к характеристике тягового двигателя, а конструкции движителя и подвески должны обеспечить в этих условиях достаточную проходимость.»

Вот, например, какие условия рельефа могут ждать подобный аппарат на других планетах (фото с официального сайта NASA, получено в рамках экспедиции Mars PathFinder):

А вот камешек по имени Yogi в сравнении с марсоходом Sojourner (который малявки ПрОП-М-а больше во много раз):

Сроки изготовления данного робота я оцениваю примерно в 2-3 месяца. Так что сиюминутного финала не ждите, хотя информации буду выкладывать предостаточно, и далеко не только теоретической. Наработки уже есть, и много :) Весь собранный материал в конечном итоге выложу на отдельный сайт.

Кстати, после изготовления работоспособного аналога марсохода я планирую провести с ним все возможные эксперименты: движение по пересеченной местности, падения с обрывов, перевороты, движение по дну водоема, по тонкой пленке льда, по различным типам грунта, попадание под завал и др. Проверим на практике, на что способно изобретение 70х годов прошлого века, и как его можно усовершенствовать.

В планах, вообще говоря, много чего. И поведенческую функцию хочется усложнить (благо я все-таки программист), и дать возможность роботу двигаться автономно - без проводов - тоже. Но, не хочу загадывать. Лучше всегда начинать с простого.

Между прочим, ПрОП-М и привлек меня именно своей простотой, ведь марсоходов разных моделей - очень много. И PathFinder, и наш Марс-96 - очень интересные проекты, полные оригинальных решений и прекрасных идей. Но на их реализацию, боюсь, лично у меня не хватит ни времени, ни сил.

Наконец, по поводу полезности и практической применимости робота: очень интересная тема есть на РобоФоруме, где как раз все очень подробно описано. Ну а от себя могу сказать, что все коммерческие проекты все равно пошли от проектов любительских :)

понедельник, 17 марта 2008 г.

Создание аналога марсохода ПрОП-М. Изготовление корпуса

В рамках серии статей «Изготовление аналога марсохода ПрОП-М».

Во-первых, хочу обратиться к читателям данного блога: присоединяйтесь! Параллельные поделки очень интересны сами по себе и имеют больше шансов на успех. Пишите в комментарии, пишите мне в ICQ и на e-mail - обязательно подскажу, обсудим любые моменты по реализации. Я сам любитель, и любой совет, любое мнение - имеют для меня большую ценность.

Начнем. Самое простое в реализации аппаратной части робота - сделать его корпус. Благо представлять он из себя будет простенькую железную коробку с приделанными к ней лыжами. Но, просто - да не слишком. Особенно - если Вы - программист (как я), никогда даже не державший в руках ножниц по металлу...

Первым делом необходимо достать где-нибудь листового железа. Оно потребуется для изготовления лыж и корпуса будущего робота. Размер требуемого листа - 75х30 см. Листовое железо продается в строительных и хозяйственных магазинах. Мне повезло - один мой родственник занимается ремонтом, и у него нашелся для меня лист оцинкованного железа требуемого размера бесплатно.

Также вам потребуются ножницы по металлу (примерная стоимость - 300-500 рублей), рулетка, карандаш, линейка, молоток, гвоздь, саморезы, дрель с тонким сверлом по металлу, отвертка, плоскогубцы, и немного холодной сварки (я купил колбаску холодной сварки со стальным наполнителем в хозяйственном магазине за 38 рублей). Также, некоторые типы холодной сварки требуют использования перчаток, резиновые перчатки можно купить в аптеке за 5 рублей.

Хочу заметить: почти все материалы и инструменты - заменяемы. Если у Вас чего-то нет - не отчаивайтесь, ничего страшного. Даже если корпус Вашего робота будет деревянным, а в качестве лыж будут, например, обычные снегоступы - все равно уникальность передвижения робота сохраняется. Но я лично решил делать максимально приближенный к оригиналу вариант марсохода, поэтому - делаю все именно так, как делаю :)...

Вернемся к нашему листу железа. Общие приемы обработки металла описаны, например, на сайтах Гараж Авто и Сам себе мастер. Очень полезно почитать перед началом работы.

Итак, приступим. Первым делом - изготовим железную коробку. Для этого нужно отрезать соответствующий кусок листового железа с помощью ножниц по металлу, согнуть его, и замазать края получившейся коробки холодной сваркой. Заготовка, которую потребуется вырезать, изображена на рисунке:

Размеры здесь аналогичны размерам марсохода - 22х25х4 см. Вырезать заготовку не составит труда. Результат будет примерно таким:

Теперь заготовку нужно согнуть. С первыми тремя загибами (по краям) справиться достаточно легко, это делается примерно так: лист зажимаем между двумя брусками, загибаем сначала руками, затем подбиваем молотком.

Последние два загиба мне дались не так легко, т.к. мешали предыдущие. В крайнем случае, если у Вас не будет получаться загнуть заготовку, просто выпилите брусок, который заполнил бы внутреннее пространство создаваемой коробки (т.е. 22х25х4 см) - тогда задача решится очень просто.

Вот что получилось у меня в итоге:

Верхнюю крышку загибать до конца не требуется - нам все равно еще придется размещать внутри моторы, устройство управления и т.д.

Принимаемся за лыжи, беря самый большой обрезок. Вырежьте две заготовки, как показано на рисунке (они обязательно должны быть зеркальными, не ошибитесь!):

Размер одной лыжи - 8.5х30 см. После вырезки загните каждую лыжу. Работать с лыжами гораздо легче, они маленькие, и загибать их можно плоскогубцами. У вас должно получиться что-то, похожее на лыжу оригинального марсохода:

Вторая лыжа изготовляется по той же заготовке, отраженной зеркально по горизонтали. Вот какая лыжа получилась у меня:

Вернемся к корпусу. Давайте закрепим его и замажем щели. Лично я сделал вот что: вырезал из обрезков нашей заготовки импровизированные уголки размером 4х3 см каждый, согнул их вдвое под углом в 90 градусов, далее накернил гвоздем и просверлил дырки в заготовке и в уголках, ну и наконец скрутил уголки с заготовкой короткими саморезами - по 4 самореза на каждый уголок. Если дрели под рукой нет - то дырки можно даже не сверлить, а просто пробить гвоздем.

Скрепленный таким образом корпус все-таки еще изобилует дырками :) - которые я собственно и замазал холодной сваркой. Вот что получилось в итоге:

Продолжение следует...

суббота, 15 марта 2008 г.

Создание аналога марсохода ПрОП-М. Проектирование

В рамках серии статей «Изготовление аналога марсохода ПрОП-М».

Самое важное перед началом любого действия - немного подумать. Как раз для этого нужно проектирование! Здесь я кратко приведу описание этого очень полезного процесса.

Итак, конечной целью всех моих будущих действий в рамках проекта создания аналога марсохода ПрОП-М будет являться создание достаточно простого робота, передвигающегося лыжно-шагающим методом, и умеющим объезжать препятствия по схеме - отъезд назад, поворот на 45 градусов, движение вперед. Этот робот будет максимально похож на свой прототип - первый марсоход в мире, ПрОП-М (Прибор оценки проходимости - Марс). Подробно сам марсоход ПрОП-М я уже описывал.

Отличия создаваемого робота от оригинала следующие:

  1. Наш робот не будет нести на себе никакой научной аппаратуры.
  2. Надежность сборки и качество материалов робота отличается от оригинала, т.к. робот будет изготовлен в домашних условиях.

Прежде всего, рассмотрим, кто и что будет взаимодействовать с роботом, и как это взаимодействие будет происходить. Для описания функций системы используется стандартная диаграмма UML (так называемых прецедентов, или use cases):

Отсюда понятны основные функции и возможности робота:

  1. Движение по командам оператора: Стоп, Назад, Вправо, Влево, Вперед
  2. Ведение лога состояний, и передача оператору списка своих состояний, начиная с заданного шага
  3. Обратите внимание! Возможность замены прошивки робота. Важный пункт, реализуемый почти на всех космических аппаратах и планетоходах
  4. В процессе движения - объезд препятствий, определенных с помощью тактильного бампера
  5. Включение/выключение с помощью проводного пульта дистанционного управления
  6. Подача питания по проводу

Исходя из функций и возможностей, определяем, что потребуется для физической сборки робота:

  1. Корпус, лыжи, крепления лыж.
  2. Два мотора с понижающими редукторами, способные поднять вес робота.
  3. Передний бампер с двумя датчиками касания.
  4. Устройство размотки провода и 15 метров провода.
  5. Устройство управления, реализующее алгоритм объезда препятствий, и возможность дистанционного управления.
  6. Пульт дистанционного управления по проводу.
  7. Блок питания, обеспечивающий подачу нужного напряжения для питания робота по проводу.

Как видно, система разделилась на две основных части - сам робот, и проводная система управления для него.

В свою очередь, робот состоит из аппаратной и программной частей.

Что касается программной части, то поведение нашего робота можно описать простеньким конечным автоматом (о конечных автоматах я писал, например, в статье «Робот и искусственный интеллект»). Для описания конечных автоматов существует специальная диаграмма UML - диаграмма состояний. Я создал такую диаграмму для нашего робота:

В процессе проектирования также обычно рисуют еще две важных UML-диаграммы - диаграмму классов (для описания программной части) и диаграмму развертывания (для описания развертывания робота на конкретных физических деталях). Я намерен в дальнейшем вести параллельно две серии сообщений - по созданию программной части, и по созданию «железа», в которых уже приведу эти диаграммы. Кстати, любые диаграммы, созданные в процессе проектирования - всегда многократно уточняются при реализации проекта.

вторник, 11 марта 2008 г.

Первый марсоход (ПрОП-М). Устройство шасси

В прошлом своем сообщении о космических роботах я писал об экспедициях аппаратов Марс-2 и Марс-3, и о первых в мире марсоходах, достигших красной планеты - хотя и не передавших, к сожалению, никаких данных на Землю.

Я затронул эту тему, но она оказалась еще более интересной, чем на первый взгляд. Во-первых, на сайте Space-Ru.Com я нашел детальное описание аппарата Марс-2, особенно хорошо описан состав научных приборов и сведения, собранные КА Марс-2 во время полета. Во-вторых, сайт Austronaut.ru предоставил очень хорошее описание спускаемого модуля аппаратов Марс-2 и Марс-3, вместе с его подробной схемой. Между прочим, в прошлом сообщении я совершил досадную ошибку, о чем уже написал в комментарии - ведь спускаемый модуль Марса-3 на самом деле все-таки достиг поверхности Марса, успешно приземлился, и даже начал передавать оттуда картинку (с очень хорошего сайта Teddy Stryk'а) - но через 20 секунд вышел из строя, предположительно, из-за сильной пылевой бури.

Марсоходы ПрОП-М

А вообще, все это в принципе к роботам отношения имеет мало, и самым интересным моментом для меня было, бесспорно, обнаружить сведения о марсоходах. Напомню, на борту каждого из аппаратов находились миниатюрные, весом всего 4.5 кг, устройства, называемые ПрОП-М (Прибор оценки проходимости - Марс), и предназначенные для исследования грунта Марса в непосредственной близости от поверхности. Приборы связывались с посадочной ступенью информационным кабелем, поэтому способны были удаляться не более чем на 15 метров от места посадки.

Здесь я натолкнулся на ряд проблем. А конкретно - не смог найти четкой схемы ПрОП-М. Только несколько не самых детализированных изображений и немножечко информации... Отправил запрос во «ВНИИтрансмаш», где были разработаны эти марсоходы - но ответа пока не получил. Но, все по порядку - и вы поймете, почему я так заинтересовался этими марсоходами!

История

Как сообщает сайт Института истории естествознания и техники РАН, во время подготовки аппарата Марс-3, ведущий специалист «ВНИИтрансмаш» В.В. Громов предложил заменить балансировочный груз на прибор оценки проходимости. Эта идея была поддержана, и достаточно быстро реализована, хотя и потребовала дополнительных усилий: реализации самого марсохода, его наземной отработки, реализации устройства выноса марсохода на поверхность, обеспечения его электропитания и связи с посадочным модулем, и т.п.

Вот фотография устройства для спуска аппарата ПрОП-М:

Именно из-за того, что марсоход заменил балансировочный груз - его масса согласно техническим требованиям не должна была превышать 5 кг. Поэтому сам марсоход получился очень простым и, кстати сказать, вполне реализуемым в домашних условиях (к чему я собственно и веду!!).

После завершения миссий КА Марс-2 и Марс-3, когда два марсохода были безвозвратно потеряны, неожиданно нашли третий - на Земле. Ведь стоили эти аппараты не так много, и произвести третий экземпляр для каких-либо проверочных нужд не представляло труда. Этот самый, третий экземпляр - находится поныне в музее ГДЛ Петропавловской Крепости в Санкт-Петербурге. Так что, кто будет в Питере - не забудьте заглянуть в этот музей, и полюбоваться на аппарат собственными глазами, потом мне расскажите :)

Устройство шасси

Крайне интересен способ перемещения первых в мире марсоходов — лыжно-шагающий. Как можно увидеть на рисунке, каждый аппарат представлял из себя небольшой ящичек с лыжами по обеим сторонам. Движение осуществлялось следующим образом: опираясь на лыжи, переносился вперед корпус, аппарат садился на днище и лыжи перемещались на следующий шаг вперед. Поворот осуществлялся перемещением лыж в разные стороны. В случае, если аппарат встречал препятствие (касание двухконтактного бампера спереди), он автономно осуществлял объезд согласно следующему алгоритму: отход назад, поворот на некоторый угол, движение вперед.

В книге Александра Леоновича Кемурджиана «Планетоходы» я нашел пару слов о преимуществах данного вида шасси (с. 318-319, доступна для скачивания, например, с AstroLib.Ru): «лыжно-шагающий движитель обеспечивает высокие тягово-сцепные свойства на сыпучих грунтах». Также, я подозреваю, подобный аппарат может ползти по очень тонкому льду и не проваливаться. Главный недостаток аппарата - бесспорно, малая скорость.

В любом случае, честно признаюсь, загорелся я реализовать это устройство в домашних условиях! Разве ж не интересно? - собрать дома прототип первого марсохода... К сожалению, четкой схемы устройства нет (все еще надеюсь получить ответ от «ВНИИтрансмаш»), но она, как я предполагаю, крайне простая. Далее идут мои предположения:

В самом «черном ящике» располагались, помимо научных приборов для собственно оценки проходимости грунта - следующие компоненты:

  • Микроконтроллер
  • Приемник устройства связи для управления марсоходом (связь производилась по кабелю спускаемого аппарата)
  • Приемник блока питания (тоже по кабелю) - питание шло как минимум на три схемы: схему управления и 2 схемы двигателей
  • Двигатели - по одному на каждую лыжу, причем, как видно на рисунке - лыжа крепилась к корпусу в трех местах. Я думаю, что только к двум передним креплениям были подведены редукторы двигателя, а заднее крепление было «холостым». Также хочу отметить, что моторчики должны были быть достаточно мощными, чтобы приподнимать и переносить всю массу марсохода.

Микроконтроллер был настроен на объезд препятствий и плюс выполнение команд либо последовательностей команд оператора. А вот как я представляю крепление лыжи и механизм ее присоединения к мотору:

Напоследок приведу ссылку на сайт NASA: там у них есть список электронных компонентов, которые вообще используются в космических аппаратах - по сути, список наиболее качественных и надежных (и дорогих) компонентов.