Coding4Fun Cannon: обзор проекта

Опубликовано 16 марта 2010 г. 14:20 | Coding4Fun

Как мне кажется, лучший способ описать этот проект — рассказать о том, почему я вообще им занялся. Играя на Xbox 360, в 19:52 я получил легендарное сообщение по электронной почте:

Клинт,

Скотт Гатри очень хотел бы, чтобы на конференции MIX в этом году на сцене стояла пушка, которая выстреливала бы в аудиторию фирменные футболки. […] Мы подумали, что это как раз то, что вы могли бы сделать, учитывая, какие интересные вещи вы уже делали раньше. […] Как вы считаете, смогли бы вы создать нечто в таком духе? Есть ли у вас время для работы над этой задумкой для MIX?

Итак, команда Coding4Fun должна за две недели создать пару роботов, способных двигаться, целиться и стрелять футболками во время основного доклада на MIX10 в процессе демонстрации еще не выпущенного программного обеспечения? Да запросто.

Следующая информация поможет прояснить предысторию проекта и понять его структуру.

Автор: Клинт Руткас (Clint Rutkas),
Microsoft Coding4Fun Ninja
Channel 9
Исходный код: загрузить
Сложность: средняя (ПО), повышенная (аппаратное обеспечение)
Необходимое время: 2 недели
ПО: Visual C# 2010 Express, Visual Studio Phone Developer Express
Оборудование: привод поворота Servo City, набор боевых ботов от Robot Marketplace, релейная панель Phidget 0/0/4, расширенный контроллер сервомоторов Phidget, пушки, стреляющие футболками, всякие детали, поликарбонат и очень много кофе или газировки.

clip_image002

Снимок сделан Веталой Хокинс (Vetala Hawkins) на Filmateria Digital.

В этой серии статей мы обсудим:

  1. Обзор проекта.
  2. Разработка приложения для Windows Phone.
  3. Разработка серверного ПО.
  4. Создание робота.
  5. Создание пользовательского интерфейса Windows Phone.
  6. Повышение скорости работы.

Скажи «привет» моему маленькому другу

В середине февраля нас попросили создать робота, стреляющего футболками, для конференции MIX, которая должна была состояться 15 марта 2010 г. Это требовало от нас энергичных действий, в том числе исследований, создания, тестирования и поставки нашего проекта, — и на все про все примерно три недели. После того как Скотт Гатри (Scott Guthrie) одобрил наш демонстрационный вариант SketchFlow, у нас оставалось всего две недели на то, чтобы сконструировать физический робот, а также создать серверное ПО и программы для Windows Phone (далее просто Phone). И вдобавок, так как мы использовали незаконченный продукт, нужно было продумать запасные варианты.

Распределение задач

Всю работу мы поделили на логические разделы.

  • Сервер и робот (кодовое название « Betty ») : ответственный Клинт Руткас (Clint Rutkas).
  • Phone (кодовое название «Frank»): ответственный Дэн Фернандез (Dan Fernandez).
  • Пользовательский интерфейс Phone : его нам взялась подготовить 352 Media.
  • Камера и поток MJPEG: Брайен Пик (Brian Peek) обновил свой код, чтобы он мог работать практически на любой платформе.

Но постойте-ка, если это был суперсекретный проект, как же в нем участвовали Брайен и 352 Media? А мы сказали им, что работаем над Silverlight-проектом, к которому будут обращаться приложения-браузеры! Мы не сообщили, что это предназначено для Phone! Вот такие мы хитрые.

clip_image004

Фрэнк и Бетти сидели на трубе…

Так зачем же мы использовали кодовые названия? Дэн и я немного путались, когда приходилось ссылаться на определенные детали, а благодаря кодовым названиям мы могли говорить о проекте и при посторонних, потому что все это звучало так, будто мы перемываем косточки двум людям, хоть и в крайне странных словах и уж очень горячимся. Если мне не изменяет память, я хотел назвать робота Фрэнком в честь персонажа Frank the Take из кинофильма «Старая закалка»[1] , но Дэн по какой-то причине уже шутливо называл робота Бетти, и вот так к роботу приклеились оба имени. Во время разработки Бетти и Фрэнк частенько не ладили друг с другом и даже выказывали некоторые проблемы во взаимодействии — ну прям как реальная парочка. Упоминания Фрэнка и Бетти вы увидите в исходном коде и в серии статей, посвященных этому проекту. Просто помните, что Фрэнк — это Phone, а Бетти — робот.

Проектировочныерешения

На конференции наподобие MIX или PDC в одно помещение набиваются тысячи людей, создавая своими мобильными устройствами интенсивные помехи для беспроводной связи. Учитывая это при изучении коммуникационного аспекта проекта, мы решили, что Бетти будет делать вызовы по HTTP с физическим подключением к сети. А для этого в роботе нужен какой-то веб-сервер. Если бы у меня было достаточно времени, абсолютно уверен, что смог бы сделать так, чтобы у робота не было на борту компьютера или чтобы он на 100% управлялся Phone. Но нам требовалась гарантия, что никакие помехи не повлияют на взаимодействие с роботом, поэтому беспроводная связь была сразу же исключена.

Кроме того, из-за крайне сжатых сроков многие решения по компонентам принимались на основе моего опыта работы над предыдущими проектами. Мы искали сетевые камеры, передающие в стандартах H.264, MPEG4 и MJPEG, а также хотели непрерывно получать с сервера на борту робота поток данных. В общем и целом, наличие компьютера у Бетти давало нам больше возможных вариантов на случай, если что-то начнет работать не так.

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

На протяжении всей разработки Дэн и я первым делом каждое утро устраивали SCRUM-митинги[2] , чтобы определить, что мы должны сделать в этот день, и обсудить любые назревающие проблемы. Вот как выглядела белая доска у Дэна после одного из заключительных митингов (перед нашим отлетом на конференцию):

clip_image006

Бетти , тыможешьстатьнастоящимроботом

Бетти должна была выполнять три задачи: ездить, целиться и выстреливать футболками. Для управления мы использовали лэптоп HP Envy 13", а ниже приведен список оборудования для решения каждой задачи.

· Прицеливание

o Прицеливание осуществлялось с помощью привода поворота Servo City и расширенного контроллера сервомоторов Phidget.

· Стрельба

o Для этого применялась комбинация релейного контроллера Phidget 0/0/4, монтажной платы от Drinktendr (бармена-автомата) и пушек, стреляющих футболками.

· Перемещения

o Для этого мы взяли шасси боевых ботов из Robot Marketplace, на котором использовался контроллер двигателя Ampflow. Этот контроллер я, кстати, применял в своем проекте самобалансирующегося скейтборда и обнаружил, что на деле это контроллер двигателя Roboteq. Для конфигурирования и обновления прошивки настоятельно советую использовать программное обеспечение именно от Roboteq.

А вот Скотт впервые заставил робота двигаться и сделал несколько пробных выстрелов, управляя им с устройства Phone.

clip_image008

Нет, серьезно, вы сделали робота за две недели?

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

clip_image010

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

Фрэнк одевает смокинг на выпускной вечер

В Silverlight и WPF для дизайнерской стороны приложения используется XAML. Поскольку XAML отлично позволяет разделять задачи, он дает широкие возможности в создании приложения как проектировщику, так и разработчику. Дэн сообщил 352 Media (отличная команда, кстати!), какие элементы управления мы будем использовать, и их конечный продукт на основе Silverlight 3 был включен прямо в наш проект с минимальными изменениями. В статьях по пользовательскому интерфейсу и Phone мы расскажем об этих аспектах подробнее.

Что было:
clip_image012

и что стало:

clip_image014

Какнасчеткода ?

Вместо того чтобы рисковать своим кодом, мы покажем вам самое главное во всей его красе. Дэн и я знаем, что код нуждается в чистке. Мы первые готовы согласиться с этим. Мы пытались скормить Silverlight устройству Phone, и, конечно же, полезли проблемы. Так как мы решили их, некоторые части нашего кода могут быть весьма интересны.

Для коммуникаций, как вы заметите, использовался код, похожий на WCF-сервис (Windows Communication Foundation), и это в определенной мере так и есть. Нам понравилась идея, заложенная в WCF, так как у нас появлялась возможность «запереть» сервис и не допускать, чтобы кто-то посторонний мог передавать роботу команды. Это также позволило нам создать изолированные сервисы, взаимодействующие только с нужным нам сервисом. Для каждой задачи (прицеливания, перемещения, настройки и стрельбы) был создан свой сервис, и если бы мы захотели добавить еще один, это было бы крайне просто.

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

Вот список основных проектов.

  • Coding4Fun.Cannon.Phone: приложение Phone.
  • Coding4Fun.Cannon.Robot: обработка прямого взаимодействия с аппаратным обеспечением.
  • Coding4Fun.Cannon.WCF: этот проект будет абстрагирован и вынесен в новый проект, не основанный на WCF. Он создает упрощенные команды от Phone и веб-сервера. Пример такой абстракции — код, управляющий сервомоторами. Сервомоторы ожидают получения некоего значения, не являющегося углом. При такой абстракции устройство Phone может посылать значение в виде угла, а код, управляющий сервомоторами, преобразует его в значение, имеющее смысл для сервомоторов.
    Еще одна важная вещь, которую нужно добавить в это пространство имен, захват и отправка снимков с веб-сервера. Прямо сейчас эта логика целиком содержится в Coding4Fun.Cannon.Web.
  • Coding4Fun.Cannon.Web: обработка всех запросов от Phone; это элементарный сайт на основе ASP.NET.
  • Coding4Fun.Cannon.MVC: на случай, если вы предпочитаете маршруты (routes) параметрам строки запроса.

Стабилизаторы позволяют машине ездить быстрее, да?

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

Заключение

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


[1] В кинофильме Old School (Старая закалка, 2003) не было персонажа Frank the Take, а был Frank The Tank. Но в российском варианте Frank The Tank был просто Фрэнком.- Прим. переводчика

[2] Это одна из гибких методологий разработки ПО, где упор делается не на качественно определенный, а на качественно контролируемый процесс разработки.- Прим. переводчика