2.1. Изучение сервиса Corobot.

advertisement
Оглавление
Введение ....................................................................................................................................................................... 2
1.Анализ технического задания ................................................................................................................................. 4
1.1.Поиск близко функциональных аналогов ....................................................................................................... 4
1.2 Анализ технический условий для проекта ...................................................................................................... 4
1.3.Область применения разработки. ..................................................................................................................... 5
1.4.Функциональные требования. .......................................................................................................................... 5
1.5.Требования к программному обеспечению. .................................................................................................... 5
2.Программная реализация описание программы .................................................................................................... 6
2.1. Изучение сервиса Corobot. ............................................................................................................................... 6
2.2. Система управления роботом ........................................................................................................................ 20
2.3. Система создания линии в симуляторе ........................................................................................................ 22
3.Руководство программиста.................................................................................................................................... 24
3.1.Характеристики программы ........................................................................................................................... 24
3.2.Обращение к программе ................................................................................................................................. 24
3.3.Входные и выходные данные ......................................................................................................................... 25
4.Методика испытаний ............................................................................................................................................. 26
Заключение. ............................................................................................................................................................... 27
Список литературы ................................................................................................................................................... 28
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
1
Введение
Роботы плотно вошли в современную жизнь. Практически любая сфера деятельности
находит применение роботам. И. М. Макаров и Ю. И. Топчеев в своей книге
«Робототехника: История и перспективы» отмечают: «Современные роботы, созданные
на базе самых последних достижений науки и техники, применяются во всех сферах
человеческой деятельности. Люди получили верного помощника, способного не только
выполнять опасные для жизни человека работы, но и освободить человечество от
однообразных рутинных операций»
Внешний вид и конструкциия современных роботов могут быть весьма разнообразными.
В настоящее время в промышленном производстве широко применяются
различные роботы, внешний вид которых (по причинам технического и экономического
характера) далёк от «человеческого». При этом робот может либо управляться
оператором, либо работать по заранее составленной программе.
Важнейшие классы роботов широкого назначения — манипуляционные и мобильные
роботы.
Манипуляционный робот — автоматическая машина (стационарная или передвижная),
состоящая из исполнительного устройства в виде манипулятора, имеющего несколько
степеней подвижности, и устройства программного управления, которая служит для
выполнения в производственном процессе двигательных и управляющих функций. Такие
роботы производятся в напольном, подвесном и портальном исполнениях. Получили
наибольшее распространение в машиностроительных и приборостроительных отраслях.
Мобильный робот — автоматическая машина, в которой имеется движущееся шасси с
автоматически управляемыми приводами. Такие роботы могут быть колёсными,
шагающими и гусеничными (существуют также ползающие, плавающие и летающие
мобильные робототехнические системы, см. ниже).
В рамках данного проекта предполагается разработка модели колёсного робота.
Первые попытки создания промышленных колесных роботов были связаны с построением
гибких производственных систем. Колесный робот должен был перевозить детали от
одного пункта к другому пункту, которые находились в одном цехе. Сейчас колесные
роботы применяются для инспектирования помещений или перемещения различных
предметов от одного пункта к другому пункту в неструктурированном, не всегда
безопасном для человека рабочем пространстве. Основными областями применения
колесных роботов являются: строительство, горное дело, атомная энергетика, космическая
техника, сельское хозяйство, погрузочно-разгрузочные работы, медицина.
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
2
Основным преимуществом колесного робота является относительная дешевизна
колесной-движущей платформы, на которую ставится необходимое оборудование. Для
разработки таких роботов применяют методы моделирования.
Прежде чем браться за создание модели, нужно четко представить каждый этап
деятельности. Стартовый пункт моделирования - прототип. Им может быть
существующий или проектируемый объект или процесс. Конечный этап - принятие
решения о возможности и целесообразности выполнения данного проекта.
Прототип
Принятие
решения
Моделирование
Рис.1. Этапы создания объекта
Разработать модель возможно в среде Visual Simulation Environment(VSE) - это ключевая
часть Microsoft Robotics Developer Studio(MRDS), которая использует 3D графику. Среда
позволяет сформировать виртуальный мир и механизм для аппроксимации
взаимодействия между объектами внутри физического мира. На первый взгляд, это
выглядит примерно как игровой движок. Однако после недолгого использования очень
быстро становится очевидным, что они сильно различаются; не смотря на то, что многие
действия и события записаны в игровой среде и то, что происходит в среде
моделирования, полностью зависит от взаимодействия и движения объектов в среде.
Модель содержит один или несколько объектов (сущностей), отображаемых внутри кадра.
Каждый кадр модели формируется динамически, и не всегда известно заранее, какие силы
будут действовать на объект внутри каждого кадра. Благодаря этому, можно наблюдать,
как робот будет взаимодействовать с окружающим миром.
MRDS предлагает несколько способов создания моделей и работы с ними. Возможно
использование редактора VSE , а также можно добавлять объекты в модель программным
способом: путем создания проекта службы DSS. MRDS предоставляет шаблон Visual
Studio, который можно использовать для создания новой службы DSS.
Таким образом, целью данной работы была «Разработка робота специального
назначения». Предполагается, что робот будет рисовать линию в симуляторе VSE и
управляться оператором с клавиатуры.
Реализация модели осуществлена на базе программы Microsoft Robotics Developer Studio.
Были поставлены следующие задачи:
1) Реализовать систему управления роботом
2) Создать систему создания линии в симуляторе
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
3
1.Анализ технического задания
1.1.Поиск близко функциональных аналогов
В книге «Professional Microsoft Robotics Developer Studio», написанной Кайлом
Джонсом и Трэвором Тэйлором описан пример модели колесного робота Corobot.
Рис. 2. Модель Corobot
Однако эта модель не полностью соответствует техническому заданию: имеются
сенсоры, которые никоим образом не имеют отношения к заданию; управление роботом
производится посредством стандартного «Джойстика», без взаимодействия с клавиатурой.
Помимо этого отсутствует функция создания линии в моделе.
1.2 Анализ технический условий для проекта
Исходя из цели курсового проекта, он должен быть реализован в Microsoft Robotics
Developer Studio. Исходный код должен быть написан на языке высокого уровня C#.
Средой для разработки была выбрана Visual Studio 2010. Т.к. при моделировании роботов
специального назначения оборудование накладывается на готовую колесно-движущую
базу, то возможно использование колесно-движущей базы проекта Corobot. Причем код
проекта распространяется свободно для некоммерческого использования. Следовательно,
проект можно разделить на три части:

Изучить код проекта Corobot

Реализовать систему управления роботом

Создать систему создания линии в симуляторе
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
4
1) Изучить код проекта Corobot
Понять назначение каждого сегмента кода и принцип работы проекта. Выделить
необходимые в дальнейшем сегменты кода и подробнее понять алгоритм их работы.
2) Реализовать систему управления роботом
Робот должен выполнять какие-либо действия, в данном случае это передвижение, по
нажатию кнопок на клавиатуре. Для терминала управления предполагается
использовать стандартную консоль.
3) Создать систему создания линии в симуляторе.
Во время перемещения робот должен оставлять за собой след в симуляторе, используя
добавление объекта(ов).
1.3.Область применения разработки.
Разработка может быть применена при изучении траектории движения роботов в
симуляторе VSE и при изучении MRDS в целом .
1.4.Функциональные требования.
Перед использованием данного продукта пользователь должен ознакомиться с
особенностями работы с продукцией (правила установки, ограничения).
1.5.Требования к программному обеспечению.
Лицензия на работу
1) Операционная система MS Windows
2) Microsoft Visual Studio 2010
3) Microsoft Robotics Developer Studio (распространяется свободно)
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
5
2.Программная реализация описание программы
2.1. Изучение сервиса Corobot.
Все компоненты в Robotics Studio представляют собой независимо исполняемые
сервисы и выступают как основополагающий элемент MRDS. Рассмотрим, как
добавляется к среде симуляции небо, землю и несколько других объектов симуляции в
проекте Corobot.
Само решение chapter6, представленное в файлах к книге «Professional Microsoft
Robotics Developer Studio» состоит из трех проектов:

Corobot – основной проект, реализующий модель робота и его колеснодвижущую часть. Также проект создает все необходимые сущности в
симуляторе.

SimulatedIR – проект, реализующий инфра-красный сенсор и его связь с
роботом.

SimulatedQuadDifferentialDrive – проект, который обеспечивает
дополнительные функции управления движением робота.
Последние два проекта не нужны для текущего задания. SimulatedIR можно
вычеркнуть из списка проектов, т.к. ИК-сенсор не используется в задании. А сервис
SimulatedQuadDifferentialDrive может управляться с помощью сервиса SimpleDashBoard и
предназначен для управления двухколёсным роботом, который является потомком класса
DifferentialDriveEntity. Однако разрабатываемая модель четырёхколёсного робота не
использует класс DifferentialDriveEntity и в задании не будет использовано управление
SimpleDashBoard, поэтому этот сервис не нужен в текущем задании.
Рассмотрим основной проект Corobot. Он содержит следующие основные файлы:
AssemblyInfo.cs - определяет сборку как DSS- службу, содержит описание собираемой dll.
Corobot.cs - основной исходный файл сервиса, содержит его реализацию (исполнение).
Corobot.manifest.xml - манифест, который будет использоваться для запуска сервиса
Corobot. VS запустит этот манифест при отладке сервиса, как и установлено в файле
Corobot.csproj.user
CorobotTypes.cs - содержит классы (или типы) используемые для взаимодействия со
службой.
Исходные файлы службы.
Подробнее рассмотрим два файла исходного кода: Corobot.cs, CorobotTypes.cs.
Файл типов CorobotTypes.cs yачинается файл так:
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
6
namespace ProMRDS.Simulation.Corobot
{
public sealed class Contract
{
public const String Identifier =
"http://www.promrds.com/contracts/2007/07/corobot.html";
}
Пространство имен основано на имени службы. Класс Contract является
неотъемлемой частью контракта, и он должен содержать строковую переменную Identifier.
Структура DSS не позволяет использовать обычное наследование, наследование может
осуществляться только через контракты. Контракт (Contract identifier) — уникальный
идентификатор, позволяющий однозначно отличать один сервис от другого. Он
определяет, каким должно быть состояние сервиса и какие операции можно с ним
произвести.
Концепция контракта проста: определяется состояние сервиса, набор типов
сообщений и операционный порт. Контракты могут использоваться для различных
моделей роботов, так как имеют общий интерфейс. Это позволяет различным
приложениям работать с большим набором роботов. Приложению даже не известно,
какому роботу передается сообщение, все они выглядят одинаково с точки зрения API.
Далее идет состояние службы с атрибутом [DataContract()]. Он необходим для того,
чтобы класс был скопирован в Proxy DLL при компиляции.
[DataContract()]
public class CorobotState
{
}
Следующий фрагмент кода описывает основной порт операций (PortSet) с
обязательным атрибутом [ServicePort()].
[ServicePort()]
public class CorobotOperations : PortSet<DsspDefaultLookup, DsspDefaultDrop, Get>
{
}
Оканчивается файл определением типов запросов операций.
public class Get : Get<GetRequestType, PortSet<CorobotState, Fault>>
{
public Get()
{
}
public Get(Microsoft.Dss.ServiceModel.Dssp.GetRequestType body) :
base(body)
{
}
public Get(Microsoft.Dss.ServiceModel.Dssp.GetRequestType body,
Microsoft.Ccr.Core.PortSet<CorobotState,W3C.Soap.Fault> responsePort) :
base(body, responsePort)
{
}
}
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
7
Стоит обратить внимание, что Get использует два обобщенных типа:
GetRequestType
для типов запросов и PortSet<CorobotState,W3C.Soap.Fault> для
ответов.
Взглянем на основной файл реализации службы (Corobot.cs). Он содержит
инициализацию и операции службы.
[DisplayName("Corobot")]
[Description("Simulates a Corobot Robot")]
[Contract(Contract.Identifier)]
Назначение всех трех атрибутов понятно из названия: отображаемое имя
(DisplayName), описание (Description), контракт (Contract).
Каждая служба обладает экземпляром своего состояния и основным портом
операций.
[ServiceState]
private CorobotState _state = new CorobotState();
[ServicePort("/corobot", AllowMultipleInstances = false)]
private CorobotOperations _mainPort = new CorobotOperations();
Затем идут конструктор класса и метод Start, который инициализирует службу при
его запуске.
public CorobotService(DsspServiceCreationPort creationPort)
: base(creationPort)
{
}
protected override void Start()
{
base.Start();
Следом идет обработчик, который помечен атрибутом [ServiceHandler()]
[ServiceHandler(ServiceHandlerBehavior.Concurrent)]
public virtual IEnumerator<ITask> GetHandler(Get get)
{
get.ResponsePort.Post(_state);
yield break;
}
Редактирование шаблона.
Сервис взаимодействует с симулятором благодаря следующим действиям:
1. Добавление using-операторов.
a) using-объявление - вводящее в данном пространстве имён (namespace) локальный
синоним для элемента другого пространства
b) using-директива - делающая доступными в данном пространстве имён
(namespace) все имена из другого пространства имён
#region Simulation namespaces
using Microsoft.Robotics.Simulation;
using Microsoft.Robotics.Simulation.Engine;
using engineproxy = Microsoft.Robotics.Simulation.Engine.Proxy;
using Microsoft.Robotics.Simulation.Physics;
using Microsoft.Robotics.PhysicalModel;
using xna = Microsoft.Xna.Framework;
using xnagrfx = Microsoft.Xna.Framework.Graphics;
#endregion
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
8
2. Добавление ссылки на другие используемые службы.
Рис.3. Ссылки на службы в проекте
Из всего перечня ссылок полезно будет узнать лишь о некоторых из них:
Microsoft.Xna.Framework
PhysicsEngine
RoboticsCommon
SimulationCommon
SimulationEngine
SimulationEngine.proxy
Microsoft.Xna.Framework.DLL -содержит весь код визуализации. Она обеспечивает
управляемый DirectX интерфейс и наконец вызывает лежащие в основе собственные
библиотеки DirectX.
PhysicsEngine.DLL - содержит описание для объектов, использующихся в среде
симуляции, которая изображает (воплощает, представляет) объекты в физическом движке.
Robotics.Common.DLL - определяет ряд общих типов и базовых контрактов,
которые могут использовать как аппаратное обеспечение, так и сервисы моделирования.
Simulation.Common.DLL - определяет типы, которые используются только в среде
моделирования. Типы, определенные для движка моделирования содержатся в
пространстве имен Microsoft.Robotics
SimulationEngine.DLL - содержит большую часть функциональности симулятора, с
точки зрения программиста, наиболее важные типы, они содержатся в пространстве имен
Microsoft.Robotics.Simulation.
SimulationEngine.Proxy.DLL - необходима для получения доступа к элементам
сервиса движка симуляции. Такие элементы как контракты и определения портов должны
всегда быть доступны из ProxyDLL.
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
9
3. Установка партнерства.
Это описано сверху класса CorobotService.
[Partner("Engine",
Contract = engineproxy.Contract.Identifier,
CreationPolicy = PartnerCreationPolicy.UseExistingOrCreate)]
private engineproxy.SimulationEnginePort _engineStub =
new engineproxy.SimulationEnginePort();
Это определяет службы SimulationEngine в качестве партнера для сервиса Corobot и
дает указания DSS запустить этот сервис, если он ещё не запущен. На этой стадии, при
запуске службы он будет запускать движок симуляции, хотя среда моделирования пуста.
4. Настройка среды моделирования производится в методе protected
Start().
override void
Первое что создается – начальный обзор MainCamera.
CameraView view = new CameraView();
view.EyePosition = new Vector3(-1.65f, 1.63f, -0.29f);
view.LookAtPoint = new Vector3(0, 0, 0);
SimulationEngine.GlobalInstancePort.Update(view);
Этот код определяет сообщение CameraView, устанавливает её EyePosition
LookAtPoint
и потом посылает его сервису SimulationEngine.
GlobalInstancePort
и
. Он
содержит статический глобальный указатель на его собственный главный порт
управления.
Далее добавляется небо к среде симуляции:
SkyDomeEntity sky = new SkyDomeEntity("skydome.dds", "sky_diff.dds");
SimulationEngine.GlobalInstancePort.Insert(sky);
Здесь создается новая сущность SkyDomeEntity и определяется внешняя
skydome.dds
текстура
и текстура освещения sky_diff.dds.
Затем - направленный свет, чтобы имитировать солнце. Без источника света,
объекты в среде симуляции освещены только внешним светом и светом сущности
SkyDomeEntity.
LightSourceEntity sun = new LightSourceEntity();
sun.State.Name = "Sun";
sun.Type = LightSourceEntityType.Directional;
sun.Color = new Vector4(0.8f, 0.8f, 0.8f, 1);
sun.Direction = new Vector3(0.5f, -.75f, 0.5f);
SimulationEngine.GlobalInstancePort.Insert(sun);
На следующем шаге добавляется сущность «Земля» (большая горизонтальная
плоскость при нулевой высоте). Если не добавить эту сущность, все другие объекты
симуляции будут бесконечно падать, как только будут вставлены в среду.
HeightFieldEntity ground = new HeightFieldEntity(
"Ground", // name
"Gravel.dds", // texture image
new MaterialProperties("ground",
0.2f, // restitution
0.5f, // dynamic friction
0.5f) // static friction
);
SimulationEngine.GlobalInstancePort.Insert(ground);
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
10
Таким образом, есть готовая, относительно пустая среда моделирования.
Рис.4. Среда моделирования
5. Добавление прочих объектов.
Задание размера объекта.
Vector3 dimensions = new Vector3(2f, 2f, 2f);
Создание перемещаемой сущности при помощи фигуры.
SingleShapeEntity box = new SingleShapeEntity(
new BoxShape(
new BoxShapeProperties(
100, // масса
new Pose(), // относительная позиция
dimensions)), // размер
new Vector3(0, 1f, 29f * 2.54f / 100f + 1f));
Задание имени объекта, имя должно быть у всех вставляемых объектов.
box.State.Name = "box";
Вставка сущности в симулятор.
SimulationEngine.GlobalInstancePort.Insert(box);
Рис.5. Сущность box в симуляторе
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
11
Определение собственного объекта - робота.
Первый шаг в создании робота в симуляторе - это определение нового класса
[DataContract]
[DataMemberConstructor]
public class CorobotEntity : VisualEntity
Атрибут [DataContract] указывает, что этот объект имеет состояние, которое
необходимо перевести в последовательность бит, когда он передается по узлам.
Атрибут [DataMemberConstructor] указывает, что конструктор не по умолчанию,
определенный в классе, должен также появиться в созданном proxy-классе.
Определение конструкторов для этого объекта. Каждый моделируемый объект
должен иметь конструктор по умолчанию, который не имеет параметров. Этот
конструктор вызывается, при восстановление начального состояния структуры данных из
битовой последовательности. Это случается когда объект вставлен в среду симуляции из
удаленного узла или из SimulationEditor, или когда целая сцена загружена в симулятор.
Конструктор Corobot:
public CorobotEntity()
{
}
public CorobotEntity(string name, Vector3 initialPos)
{
base.State.Name = name;
base.State.Pose.Position = initialPos;
_motorTorqueScaling = 10.16f;
}
Конструктор не по умолчанию дает возможность определить объекту название и
начальное положение.
Конструктор делает единственное действие - изменяет его состояние с
передаваемыми параметрами.
Коробка двигателя называется шасси, и верхний ящик, содержащий процессор,
называется платформой. Высота шасси над землей определяется chassisClearance, а
высота платформы - platformClearance. Ширина шасси рассчитывается так, чтобы быть
широкой, чтобы позволить внешним концам колес быть даже на сторонах платформы.
Положение переднего правого колеса вычислено, и положение остальных трех
получено из него. Это дает информацию, чтобы определить основные физические формы,
которые составляют физическую модель Corobot.
private static float InchesToMeters(float inches)
{
return (float)(inches * 2.54 / 100.0);
}
static float mass = 3.63f; // kg
static float chassisClearance = InchesToMeters(1.5f);
static float wheelGap = InchesToMeters(3f / 8f);
static float wheelWidth = InchesToMeters(2.2f);
static float wheelDiameter = 0.10f; // 10 cm
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
12
static float wheelMass = 0.1f; // kg
static float platformClearance = InchesToMeters(5.75f);
static Vector3 platformDimensions = new Vector3(
InchesToMeters(11.0f),
InchesToMeters(3.0f),
InchesToMeters(8.5f));
static Vector3 chassisDimensions = new Vector3(
platformDimensions.X - 2 * wheelWidth - 2 * wheelGap,
InchesToMeters(2.5f),
platformDimensions.Z);
static Vector3 wheelFRPosition = new Vector3(
chassisDimensions.X / 2.0f + wheelGap + wheelWidth / 2.0f,
wheelDiameter / 2.0f,
-InchesToMeters(5.5f - 2f));
static Vector3 wheelFLPosition = new Vector3(
-wheelFRPosition.X,
wheelFRPosition.Y,
wheelFRPosition.Z);
static Vector3 wheelRRPosition = new Vector3(
wheelFRPosition.X,
wheelFRPosition.Y,
-wheelFRPosition.Z);
static Vector3 wheelRLPosition = new Vector3(
-wheelFRPosition.X,
wheelFRPosition.Y,
-wheelFRPosition.Z);
Колеса – это больше, чем просто фигуры - это целые объекты, с их собственной
сеткой и физическими формами. Необходимо место чтобы хранить все четыре колеса,
когда они будут созданы.
RotatingWheelEntity _wheelFR;
RotatingWheelEntity _wheelFL;
RotatingWheelEntity _wheelRR;
RotatingWheelEntity _wheelRL;
[Category("Wheels")]
[DataMember]
public RotatingWheelEntity FrontRightWheel
{
get { return _wheelFR; }
set { _wheelFR = value; }
}
[Category("Wheels")]
[DataMember]
public RotatingWheelEntity FrontLeftWheel
{
get { return _wheelFL; }
set { _wheelFL = value; }
}
[Category("Wheels")]
[DataMember]
public RotatingWheelEntity RearRightWheel
{
get { return _wheelRR; }
set { _wheelRR = value; }
}
[Category("Wheels")]
[DataMember]
public RotatingWheelEntity RearLeftWheel
{
get { return _wheelRL; }
set { _wheelRL = value; }
}
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
13
Атрибут [Category("Wheels")] только собирает в группу эти свойства вместе так,
чтобы они были лучше организованы при просмотре в Simulation Editor.
Каждое свойство WheelEntity имеет атрибут [DataMember]. Этот атрибут сообщает
proxy-генератору, какое из свойств должно быть сериализовано, когда объект посылается
через удаленный узел или когда его сохраняют на диске. Только общие (public) свойства
могут быть отмечены этим атрибутом. Объекты колёс, шасси и фигуры платформы
создаются в методе Initialize.
public override void Initialize(xnagrfx.GraphicsDevice device, PhysicsEngine
physicsEngine)
{
try
{
// chassis
BoxShapeProperties chassisDesc = new BoxShapeProperties(
"chassis",
mass / 2.0f,
new Pose(new Vector3(0, chassisClearance + chassisDimensions.Y /
2.0f, 0)),
chassisDimensions);
chassisDesc.Material = new MaterialProperties("chassisMaterial", 0.0f,
0.5f, 0.5f);
BoxShape chassis = new BoxShape(chassisDesc);
chassis.State.Name = "ChassisShape";
base.State.PhysicsPrimitives.Add(chassis);
//base.State.Flags = EntitySimulationModifiers.Kinematic;
// platform
BoxShapeProperties platformDesc = new BoxShapeProperties(
"platform",
mass / 2.0f,
new Pose(new Vector3(0, platformClearance + platformDimensions.Y /
2.0f, 0)),
platformDimensions);
platformDesc.Material = chassisDesc.Material;
BoxShape platform = new BoxShape(platformDesc);
platform.State.Name = "PlatformShape";
base.State.PhysicsPrimitives.Add(platform);
Первое, что делает метод Initialize - создает два ящика, чтобы изобразить шасси и
платформу. Предполагается, что масса обоих одинакова, поэтому общая масса делится
между ними. Им задают измерения и определенное положение. Эти позиции
относительны началу координат объекта. Обеим фигурам задано схожее вещественное
описание, которое определяет реституцию нулевого и среднего уровня статического
трения. После создания каждой фигуры, добавляем к списку физических примитивов
следующее:
base.CreateAndInsertPhysicsEntity(physicsEngine);
base.PhysicsEntity.SolverIterationCount = 128;
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
14
Когда физическая сущность создана, она передает все объекты в список
физических примитивов в физическом движке, который создает его собственное
представление для них, основанное на атрибутах, определенных в BoxShape объектах.
SolverIterationCount
определяет как много итераций физического движка будет
использовано чтобы выйти из ограничений на объект, такие как точки соприкосновения
или места соединения. Чем выше число, тем точнее будет результат.
Тут определюется свойства колес
WheelShapeProperties wheelFRprop = new
WheelShapeProperties("FrontRightWheel", wheelMass, wheelDiameter / 2.0f);
WheelShapeProperties wheelFLprop = new
WheelShapeProperties("FrontLeftWheel", wheelMass, wheelDiameter / 2.0f);
WheelShapeProperties wheelRRprop = new
WheelShapeProperties("RearRightWheel", wheelMass, wheelDiameter / 2.0f);
WheelShapeProperties wheelRLprop = new
WheelShapeProperties("RearLeftWheel", wheelMass, wheelDiameter / 2.0f);
wheelFRprop.Flags
wheelFLprop.Flags
wheelRRprop.Flags
wheelRLprop.Flags
|=
|=
|=
|=
WheelShapeBehavior.OverrideAxleSpeed;
WheelShapeBehavior.OverrideAxleSpeed;
WheelShapeBehavior.OverrideAxleSpeed;
WheelShapeBehavior.OverrideAxleSpeed;
wheelFRprop.InnerRadius
wheelFLprop.InnerRadius
wheelRRprop.InnerRadius
wheelRLprop.InnerRadius
=
=
=
=
wheelFRprop.LocalPose
wheelFLprop.LocalPose
wheelRRprop.LocalPose
wheelRLprop.LocalPose
new
new
new
new
=
=
=
=
0.7f
0.7f
0.7f
0.7f
*
*
*
*
wheelDiameter
wheelDiameter
wheelDiameter
wheelDiameter
/
/
/
/
2.0f;
2.0f;
2.0f;
2.0f;
Pose(wheelFRPosition);
Pose(wheelFLPosition);
Pose(wheelRRPosition);
Pose(wheelRLPosition);
Для каждого колеса определены WheelShapeProperties. Флаг OverrideAxleSpeed
сообщает физическому движку то, что не нужно вычислять скорость оси, основанную на
вращающем моменте мотора и трении. Это оказывается лучшим способом, чтобы
смоделировать типы моторов, которыми обычно управляют колесные роботы.
LocalPose
каждой фигуры полезна, когда объект содержит множество фигур. Она
определяет позицию и ориентацию каждой фигуры относительно начала координат
объекта.
В приведенном выше коде каждое положение инициализируется с вектором
положения и часть ориентации положения по умолчанию равна 0.
_wheelFR = new RotatingWheelEntity(wheelFRprop);
_wheelFR.State.Name = base.State.Name + " FrontRightWheel";
_wheelFR.Parent = this;
_wheelFR.State.Assets.Mesh = "CorobotWheel.obj";
_wheelFR.MeshRotation = new Vector3(0, 180, 0);
// flip the wheel mesh
_wheelFR.Initialize(device, physicsEngine);
_wheelFL = new RotatingWheelEntity(wheelFLprop);
_wheelFL.State.Name = base.State.Name + " FrontLeftWheel";
_wheelFL.Parent = this;
_wheelFL.State.Assets.Mesh = "CorobotWheel.obj";
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
15
_wheelFL.MeshRotation = new Vector3(0, 180, 0);
_wheelFL.Initialize(device, physicsEngine);
// flip the wheel mesh
_wheelRR = new RotatingWheelEntity(wheelRRprop);
_wheelRR.State.Name = base.State.Name + " RearRightWheel";
_wheelRR.Parent = this;
_wheelRR.State.Assets.Mesh = "CorobotWheel.obj";
_wheelRR.MeshRotation = new Vector3(0, 180, 0);
// flip the wheel mesh
_wheelRR.Initialize(device, physicsEngine);
После
_wheelRL = new RotatingWheelEntity(wheelRLprop);
_wheelRL.State.Name = base.State.Name + " RearLeftWheel";
_wheelRL.Parent = this;
_wheelRL.State.Assets.Mesh = "CorobotWheel.obj";
_wheelRL.MeshRotation = new Vector3(0, 180, 0);
// flip the wheel mesh
_wheelRL.Initialize(device, physicsEngine);
того как WheelShapeProperties были определены, создается WheelEntity.
Каждому WheelEntity задано имя, основанное на имени родительского объекта.
Родительская ссылка каждого
WheelEntity
WheelEntity
установлена в CorobotEntity.
использует ссылку необычным способом. Вместо вызова
CreateAndInsrtPhysicsEntity, WheelEntity вызывает InsertShape его родителя PhysicsEngine.
Это добавляет фигуру WheelEntity к набору фигур, которые составляют его родителя. Что
касается физического движка, фигуры колес это только часть родительского объекта. Это
сокращает число требуемых вычислений физического движка, потому что он не
вычисляет взаимодействия между колесами, шасси и платформой. Он предполагает, что
они неподвижно соединены.
Вызывается метод Initialize для каждго WheelEntity, потому что эти объекты не
вставлены в родительский объект как потомки, использующие метод InsertEntity.
base.Initialize(device, physicsEngine);
} //окончание try
catch (Exception ex)
{
// clean up
if (PhysicsEntity != null)
PhysicsEngine.DeleteEntity(PhysicsEntity);
HasBeenInitialized = false;
InitError = ex.ToString();
}
}
Вызывается base.Initialize метод, который загружает любые сетки и текстуры связанные
с объектом. Если сетка не задана в State.Assets.Mesh, простая сетка создастся из фигур в
объекте.
После метод Initialize завершен и остается добавить объект Corobot в среду
моделирования. В методе Start за это отвечает следующий код:
CorobotEntity Corobot = new CorobotEntity("Corobot", new Vector3(0, 0, 0));
SimulationEngine.GlobalInstancePort.Insert(Corobot);
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
16
Так объект CorobotEntity с именем "Corobot" добавился в начало координат среды
моделирования. В результате получаем сформированного робота в среде.
Рис.6. Робот в среде.
Все еще нужно добавить некоторые свойства к объекту, чтобы сделать его
совместимым с DifferentialDriveEntity. MotorTorqueScaling свойство двигателя,
позволяющее моделировать передаточное число на физическом роботе. IsEnabled
свойство позволяет включить или отключить привод. В класс CorobotEntity добвалены
следующие свойства:
bool _isEnabled;
[DataMember]
[Description("True if the drive mechanism is enabled.")]
public bool IsEnabled
{
get { return _isEnabled; }
set { _isEnabled = value; }
}
float _motorTorqueScaling;
[DataMember]
[Description("Scaling factor to apply to motor torque requests.")]
public float MotorTorqueScaling
{
get { return _motorTorqueScaling; }
set { _motorTorqueScaling = value; }
}
Далее, инициализируется MotorTorqueScaling в конструкторе не по умолчанию.
Установленное там значение - произвольное.
CurrentHeading имитирует датчик компаса и возвращает направление сущности в
State.Pose:
public float CurrentHeading
{
get
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
17
{
// return the axis angle of the quaternion
xna.Vector3 euler = UIMath.QuaternionToEuler(State.Pose.Orientation);
return xna.MathHelper.ToRadians(euler.Y); // heading is the rotation
about the Y axis.
}
}
Следующие несколько методы позволяют точно управлять скоростью каждого
двигателя путем установки на левое и правое колеса определенных скоростей. Если один
из этих методов вызывается, то любые текущие DriveDistance или RotateDegrees функции
завершаются с ошибкой:
float _leftTargetVelocity;
float _rightTargetVelocity;
public void SetVelocity(float value)
{
ResetRotationAndDistance();
SetVelocity(value, value);
}
public void SetVelocity(float left, float right)
{
ResetRotationAndDistance();
if (_wheelFR == null || _wheelFL == null)
return;
left = ValidateWheelVelocity(left);
right = ValidateWheelVelocity(right);
SetAxleVelocity(left / _wheelFR.Wheel.State.Radius,
right / _wheelFL.Wheel.State.Radius);
}
private void SetAxleVelocity(float left, float right)
{
_leftTargetVelocity = left;
_rightTargetVelocity = right;
}
const float MAX_VELOCITY = 20.0f;
const float MIN_VELOCITY = -MAX_VELOCITY;
float ValidateWheelVelocity(float value)
{
if (value > MAX_VELOCITY)
return MAX_VELOCITY;
if (value < MIN_VELOCITY)
return MIN_VELOCITY;
return value;
}
Все, что остается - это DriveDistance и RotateDegrees и связанные с ними
вспомогательные функций и переменные:
Pose _startPoseForDriveDistance;
double _distanceToTravel;
SuccessFailurePort _driveDistancePort = null;
bool endDistance = false;
/// Позволяет перемещаться на определенное расстояние со скоростью заданую на все
колеса. При этом останов происходит постепенно, исходя из дистанции
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
18
public void DriveDistance(float distance, float power, SuccessFailurePort
responsePort)
{
ResetRotationAndDistance();
_driveDistancePort = responsePort;
if (distance < 0)
{
distance = -distance;
power = -power;
}
_startPoseForDriveDistance = State.Pose;
_distanceToTravel = distance;
SetAxleVelocity(power * _motorTorqueScaling, power * _motorTorqueScaling);
_startTime = DateTime.Now;
}
/// Позволяет роботу поворачиваться на заданный угол с определенной скоростью.
public void RotateDegrees(float degrees, float power, SuccessFailurePort
responsePort)
{
ResetRotationAndDistance();
_rotateDegreesPort = responsePort;
_targetRotation = xna.MathHelper.ToRadians(degrees);
_currentRotation = 0;
_previousHeading = CurrentHeading;
if (degrees < 0)
SetAxleVelocity(power * _motorTorqueScaling, -power *
_motorTorqueScaling);
else
SetAxleVelocity(-power * _motorTorqueScaling, power *
_motorTorqueScaling);
_startTime = DateTime.Now;
}
Метод Update обновляет каждый фрейм во время моделирования. Он отвечает и за
перемещение любых объектов, включая движение робота.
public override void Update(FrameUpdate update)
Основная и нужная нам часть метода здесь:
//на основе заданных заранее значений высчитывается перемещение робота в пространстве.
float left = _wheelFL.Wheel.AxleSpeed + _leftTargetVelocity;
float right = _wheelFR.Wheel.AxleSpeed + _rightTargetVelocity;
if (Math.Abs(left) > 0.1)
{
if (left > 0)
_wheelFL.Wheel.AxleSpeed -= SPEED_DELTA;
else
_wheelFL.Wheel.AxleSpeed += SPEED_DELTA;
}
if (Math.Abs(right) > 0.1)
{
if (right > 0)
_wheelFR.Wheel.AxleSpeed -= SPEED_DELTA;
else
_wheelFR.Wheel.AxleSpeed += SPEED_DELTA;
}
_wheelRL.Wheel.AxleSpeed = _wheelFL.Wheel.AxleSpeed;
_wheelRR.Wheel.AxleSpeed = _wheelFR.Wheel.AxleSpeed;
// обновление колес
_wheelFL.Update(update);
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
19
_wheelFR.Update(update);
_wheelRL.Update(update);
_wheelRR.Update(update);
// обновление всех потомков класса
base.Update(update);
}
2.2. Система управления роботом
Для возможности управления роботом с клавиатуры было решено внедрить в
созданный класс сущности Corobot примитивные функции движения, использующие
стандартные наборы команд класса.
Будем использовать функцию класса
MotorTorqueScaling.
Изучение кода показало,
что она управляет «двигателем», поэтому её использование выгоднее, чем использование
«надстроек», таких как SetVelocity и прочее.
public float MotorTorqueScaling
{
get { return _motorTorqueScaling; }
set { _motorTorqueScaling = value; }
}
Причем использование функций DriveDistance и RotateDegrees невозможно из-за их
смысла – нам необходимо, чтобы робот двигался не зная заранее когда произойдет
остановка.
Добавим 5 функций для казуального перемещения робота вперед, назад, поворота
влево, вправо и останова соответственно:
public void Forward()
{
SetMotorTorque(0.5f, 0.5f);
}
public void Backward()
{
SetMotorTorque(-0.5f, -0.5f);
}
public void RotLeft()
{
SetMotorTorque(-0.2f, 0.2f);
}
public void RotRight()
{
SetMotorTorque(0.2f, -0.2f);
}
public void Stop()
{
SetMotorTorque(0.0f, 0.0f);
}
Значение мощности было выбрано равным 0.5 на основе подбора таким образом,
что при резкой смене направления движения робот мог беспрепятственно совершить
останов или поворот. При больших значениях мощности робот опрокидывался из-за
резкого торможения. Для функции Stop(), однако, были использованы нулевые значения.
При этом робот останавливался.
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
20
Необходимо также добавить управление роботом с клавиатуры. В виде
стандартного терминала ввода подойдет стандартная консоль DSS-сервиса.
Создадим интерфейс управления роботом:
ConsoleKeyInfo choice;
char pKey = ' ';
do
{
choice = Console.ReadKey(true);
if (choice.KeyChar != pKey)
{
switch (choice.KeyChar)
{
case 'w':
Corobot.Forward();
pKey = choice.KeyChar;
break;
case 's': Corobot.Backward(); pKey = choice.KeyChar; break;
case 'a': Corobot.RotLeft(); pKey = choice.KeyChar; break;
case 'd': Corobot.RotRight(); pKey = choice.KeyChar; break;
default: Corobot.Stop(); pKey = choice.KeyChar; break;
}
}
} while (true);
В бесконечном цикле считываются нажатие клавиш с терминала таким образом,
что повторные нажатия на одну и ту же клавишу не обрабатываются. Оператор
множественного выбора switch
choice.KeyChar
()
определяет соответствие между нажатой клавишей
и действием. При нажатии выполняется функция движения объекта
Corobot, значение клавиши заноситься в переменную pKey и цикл переходит на
следующую операцию. После прочтения нажатой клавиши, её значение сравнивается со
значением перменной pKey и в зависимости от этого обрабатывается нажатие или нет.
При нажатии ‘w’ вызывается функция движения вперед, ‘s’ – назад, ‘a’ – влево, ‘d’ –
вправо. При нажатии на любую другую кнопку робот останавливается.
Рис.7. Консоль управления
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
21
2.3. Система создания линии в симуляторе
Разработаем способ создания линии при перемещении робота. Рассуждая, можно
понять, что необходимо во время всего движения робота создавать некоторые объекты в
симуляторе. Таким объектом может служить обычный Box, взяв на себя роль одной точки
линии. Однако при создании бесконечного множества таких объектов может возникнуть
проблема технического характера и симулятор по-просту не сможет обеспечивать
необходимую скорость вставки блоков для создания линии. Но в симуляторе также можно
создавать такой объект как Sprite, используя некое графическое изображение. При этом
нагрузка на движок симулятора будет невелика даже если таких объектов будет
достаточно много.
Необходимо также учесть, что не стоит создавать объекты как потомки класса
Corobot, иначе все объекты будут перемещаться по сцене вместе с роботом. А при
правильном создании объекты будут всегда на своем месте.
Чтобы определить место необходимо воспользоваться текущими координатами
робота, которые можно получить благодаря State.Pose.Position. Создадим три функции,
возвращающие координаты робота в пространстве на осях X,Y и Z соответственно:
public float fx
{
get { return base.State.Pose.Position.X; }
}
public float fy
{
get { return base.State.Pose.Position.Y; }
}
public float fz
{
get { return base.State.Pose.Position.Z; }
}
Создавать объекты нужно по мере движения робота, однако это трудоемкий
процесс, гораздо проще создавать объекты при каждом обновлении сцены (метод
Update()). Тогда объекты будут создаваться несколько раз в секунду и появляться на
текущем месте робота.
Но при таком положении объекты будут иметь одинаковые имена и симулятор не
даст создать объект. Чтобы этого избежать, достаточно при каждом создании
генерировать уникальное имя объекта, используем для этого текущие координаты робота
и случайное целое число от 1 до 100. Помимо этого запретим создание объекта, если имя
равно предыдущему имени объекта. Таким образом, вероятность возникновения ошибки
создания объекта сводится к минимуму.
Код сегмента создания линии приведен ниже:
string name = "";
Random ran = new Random();
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
22
//создание сущности. Параметры: высота, ширина, изображение, фиксирование на координатах,
координаты объекта.
SpriteEntity spriteRear = new SpriteEntity(0.01f, 0.01f,
"screen.bmp",
SpritePivotType.Fixed, new Vector3(fx, fy+0.002f, fz));
//поворот так, чтобы плоскость располагалась параллельно земле
Microsoft.Xna.Framework.Vector3 rotation = new
Microsoft.Xna.Framework.Vector3(90f, 0f, 0f);
spriteRear.Rotation = rotation;
spriteRear.Flags = VisualEntityProperties.DisableBackfaceCulling;
//генерация уникального имени
spriteRear.State.Name = "sprite" + fx + "_" + fy + "_" + fz +
ran.Next(100);
if (spriteRear.State.Name != name)
{
SimulationEngine.GlobalInstancePort.Insert(spriteRear);
name = spriteRear.State.Name;
}
Рис.8. Пример screen.bmp
Рис.9. Линия, оставляемая роботом
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
23
3.Руководство программиста
3.1.Характеристики программы
1) Совместимость
Данный продукт, совместим с системой Windows /XP/7/8
2) Минимальные системные требования
512MB оперативной памяти
8 MB свободного места на диске
3) Среда разработки
Microsoft Robotics Developer Studio, Microsoft Visual Studio 2010
4) Авторские права
Автор: Сидоренко Олег Олегович
5) Лицензия.
Данный продукт распространяется под свободной лицензией
3.2.Обращение к программе
Прежде чем приступить к запуску программы, необходимо чтобы на устройстве, были
установлены следующие программные продукты в таком порядке:
1) Microsoft Visual Studio 2010
2) Microsoft Robotics Developer Studio 4
После установки данных программных компонентов, необходимо паку Corobot
скопировать и вставить в корень Microsoft Robotics Dev Studio 4. С помощью командной
строки осуществить миграцию проекта, выполнив команду
>dssprojectmigration «путь к папке»
Далее необходимо добавить файл screen.bmp в папку по адресу:
\Microsoft Robotics Dev Studio 4\store\media
Следующий шаг запустить проект Corobot.sln. В нем выбрать Corobot.cs. Выбрать
закладку Проект-> Свойства: Corobot->Отладка
В графе “Запуск внешней программы” будет указанна ссылка. В ней нужно будет
изменить dsshost на dsshost32 в том случае если установленная 64-разрядная система, если
32-х разрядная, ничего менять не нужно.
В графе “Аргументы командной строки” нужно указать -port:50000 -tcpport:50001 manifest:"путь к манифесту ".
В графе “Рабочий каталог” изменять ничего не надо
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
24
Рис.10 Вкладка «Отладка» свойств проекта
Последним шагом надо запустить отладку программы.
После запуска на экране появится сцена со всеми объектами.
3.3.Входные и выходные данные
Для управления роботом испольуется косоль. Чтобы робот перемещался необходимо,
чтобы консоль была активна.
Непоспредственно сразу после нажатия клавиш изменяется положение робота в
симуляторе.
Рис.11. Консоль управления
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
25
4.Методика испытаний
1. Объект испытаний представляет собой проект Corobot. Данный программный
комплекс применяется при изучении траектории движения роботов в симуляторе VSE и
при изучении MRDS в целом.
2. Целью испытаний является проверка работоспособности системы и корректная
реакция на запросы пользователя
3. Требования к программе
а) Управление роботом с помощью клавиатуры
б) Прорисовка линии движения
в) Отсутствие ошибок
4. Порядок испытаний
Необходимо проверить все требования, которые были предъявлены к программе.
Была произведена видеозапись работы проекта. Файл видеозаписи располагается по
следующей ссылке: http://youtu.be/lZ--jiuHjwQ
Итог: испытание пройдено успешно, недокументированных ошибок не выявлено.
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
26
Заключение.
В результате проектирования была разработана модель колесного робота
специального назначения. Продукт готов к использованию в учебных целях и
обеспечивает обучение Microsoft Robotics Developer Studio, документирован и может быть
модифицирован.
Были рассмотрены вопросы по программированию модели робота, создания
визуальной модели, взаимодействие внутренних компонентов, разработано руководство
программиста, выявлены особенности работы.
Поставленные цели и задачи достигнуты.
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
27
Список литературы
1. Kyle Johns, Trevor Taylor. Professional Microsoft Robotics Developer Studio
2. ProMRDS Web Site. http://www.promrds.com/
КП.230101.10-В-1 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист
28
Download