Розробка програмного забезпечення для моделювання мобільного робота NXT MindStorms

Тривимірна модель мобільного робота. Алгоритмізація моделі та її програмної реалізації з використанням бібліотек MFC та OpenGL. Розробка програмного забезпечення. Середовище розробки проекту Microsoft Visual Studio 2010. Керування рухами маніпулятора.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 03.04.2014
Размер файла 462,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ

Факультет: Автоматики і комп'ютеризованих технологій

Кафедра: Технології та автоматизації виробництва РЕЗ та ЕОЗ

Курсова робота

з дисципліни: «Технології програмування гнучких комп'ютеризованих систем»

ПОЯСНЮВАЛЬНА ЗАПИСКА

Розробка програмного забезпечення для моделювання мобільного робота NXT MindStorms

Студент: СІ-10-2 Прокошин Е.Е.

Керівник: к. т. н, доц. каф. Цимбал О.М.

Харків 2013

Зміст

Вступ

1. Аналіз технічного завдання

1.1 Постановка задачі

2. Алгоритмізація моделі та її програмної реалізації

2.1 Бібліотека MFC

2.2 Бібліотека OpenGL

3. Розробка програмного забезпечення

3.1 Середовище розробки проекту

3.2 Порядок виконання роботи

3.3 Опис контрольного прикладу

Висновки

Перелік посилань

Додаток А. Опис програми

Реферат

Курсова робота: пояснювальна записка: 11 рис., 1 табл., 1 додаток,

8 джерел, текст програми на CD-диску.

Об'єкт дослідження - робот NXT MindStorms.

Мета роботи - розробка програмного забезпечення для моделювання робота NXT MindStorms.

Розробка здійснювалось із використанням пакету програм Microsoft Visual Studio 2010 на IBM-сумісному персональному комп'ютері (тактова частота процесора 2,2 ГГц, обсяг оперативної пам'яті - 2 Гб, жорсткого диска - 500 Гб).

Робота має навчальний характер. Розробка програмного забезпечення для моделювання робота NXT MindStorms. Розмір програми - 6 Мб.

MICROSOFT VISUAL STUDIO, NXT MINDSTORMS, MFC, МОДЕЛЮВАННЯ РОБОТА NXT MINDSTORMS

Abstract

Coursework: explanatory note 28 pages, 11 pictures, 1 table, 1 application, 8 sources, code on CD- ROM.

Object of study - robot NXT MindStorms.

Purpose - to develop software for the simulation of robot NXT MindStorms.

Development was carried out using the software package Microsoft Visual Studio 2010 for IBM - compatible personal computer (CPU clock speed of 2.2 GHz, RAM - 2 GB Hard Drive - 500 GB).

The work is educational in nature. Software development for simulation of robot NXT MindStorms. The amount of programs - 6 MB.

MICROSOFT VISUAL STUDIO, NXT MINDSTORMS, ROBOTS, MFC, MODELING ROBOT NXT MINDSTORMS

Вступ

Розробка робототехнічних систем різного роду призначення представляє значну зацікавленість не тільки з промислової точки зору, але і наукової. Сучасний робот є багатоцільовою машиною, що задовольняє сучасним вимогам створення гнучко переналаштовуваного автоматизованого виробництва. З іншого боку будь-який робот, як виконуючий пристрій, є платформою для широкого кола експериментів, пов'язаних з практичною реалізацією методів штучного інтелекту.

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

Першочерговим етапом проектування роботів є створення комп'ютерних моделей функціонування маніпуляторів роботів у робочому просторі, моделей мобільних робототехнічних систем.

Промисловий робот - автономний пристрій, що складається з механічного маніпулятора та системи керування, який використовується для переміщення об'єктів у просторі та для виконання різних промислових процесів. ПР можуть виконувати основні технологічні операції (збірка, фарбування, сварка) та допоміжні операції (завантаження/розвантаження технологічного обладнання, транспортні та інші). При використанні змінного технологічного оснащення виконувані операції можуть виконуватися одним роботом.

Метою курсової роботи є розробка програмного забезпечення для моделювання автоматизованої роботи робота NXT MindStorms. Для досягнення мети необхідно розглянути наступні питання:

– проаналізувати завдання;

– виявити особливості програмного забезпечення;

– переглянути список рекомендованої літератури;

– розробити алгоритм роботи програми;

– написати програму для моделювання NXT MindStorms.

1. Аналiз технiчного завдання

1.1 Постановка задачі

Розробка програмного забезпечення для моделювання робота NXT MindStorms (Рис. 1.1). Необхідно розробити тривимірну модель робота, що відображає вигляд реального. Розробка буде проводитись мовою С++ у середовище Microsoft Visual Studio 2010 за допомогою бібліотек MFC та OpenGL.

Рисунок 1.1 - Робот NXT MindStorms

2. Розробка програмного забезпечення для моделювання робота NXT mindStorms

2.1 Бібліотека MFC

Розробка програмного забезпечення з нуля є доволі складною та тривалою задачею. Тому більшість програм створюється шляхом розвитку якоїсь базової програми, типової заготовки або шаблону. Для створення професійного програмного забезпечення необхідно чітко уявляти внутрішню структуру та логіку роботи засобів, що використовуються. Особливо це відноситься до засобів створення програмних продуктів. Розглянемо бібліотеку базових класів Microsoft (Microsoft Foundation Classes, MFС) саме як інструмент, що повинен взяти на себе більшу частину чорнової роботи з створення програмного забезпечення. Тільки знання всіх нюансів побудови, функціонування та можливостей бібліотеки дозволить легко створювати програми різної складності.

Перед розробниками бібліотеки стояла задача розробки об'єктно-орієнтованого інтерфейсу для роботи в середовищі Windows, який би задовольняв наступним цілям проектування програмних продуктів:

– значне зменшення зусиль при створенні програмних продуктів;

– швидкість виконання програм, написаних з використанням бібліотеки, повинна відповідати швидкості виконання програм, що написані на мові С з використанням Win32 API;

– розмір допоміжного коду повинен бути мінімальним;

– здатність прямо викликати довільну С - функцію Win32 API;

– легкість використання Win32 API в С++ повинна бути такою ж як при використанні традиційної мови С.

Варто відзначити, що поставлені задачі розробниками бібліотеки були вирішені професійно.

За короткий відрізок часу корпорацією Microsoft було розроблено декілька версій бібліотеки MFC, яка ставала все далі потужнішою та зручнішою. Версія 4.3 бібліотеки MFC не є останньою і швидше за все невдовзі на ринку з'явиться наступна версія. До того ж підтримка іншими компаніями та їх компіляторами і засобами розробки програмного забезпечення саме бібліотеки MFC, а не OWL фірми Borland International чи власних продуктів дозволяє концентрувати увагу саме на MFC. Навіть фірма Borland International, що є конкурентом Microsoft в створенні компіляторів для персональних комп'ютерів придбала ліцензію на використання в своїх продуктах MFC.

2.2 Бібліотека OpenGL

OpenGL -- (Open Graphics Library -- відкрита графічна бібліотека, яка реалізує 2D та 3D комп'ютерну графіку. Ця бібліотека містить понад 250 функцій, які можуть використовуватися для малювання складних тривимірних сцен з простих примітивів. Широко застосовується індустрією комп'ютерних ігор і віртуальної реальності, у графічних інтерфейсах, при візуалізації наукових даних, в системах автоматизованого проектування.

OpenGL орієнтується на такі два завдання:

– сховати складності адаптації різних 3D-прискорювачів, надаючи розробнику єдиний API.

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

Основним принципом роботи OpenGL є отримання наборів векторних графічних примітивів у вигляді точок, ліній та багатокутників з наступною математичною обробкою отриманих даних та побудовою растрової картинки на екрані і/або в пам'яті. Векторні трансформації та растеризація виконуються графічним конвеєром (graphics pipeline), який власне являє собою дискретний автомат. Абсолютна більшість команд OpenGL потрапляють в одну з двох груп: або вони додають графічні примітиви на вхід в конвеєр, або конфігурують конвеєр на різне виконання трансформацій. OpenGL є низькорівневим процедурним API, що змушує програміста диктувати точну послідовність кроків, щоб побудувати результуючу растрову графіку (імперативний підхід). Це є основною відмінністю від дескрипторних підходів, коли вся сцена передається у вигляді структури даних (найчастіше дерева), яка обробляється і будується на екрані. З одного боку, імперативний підхід вимагає від програміста глибокого знання законів тривимірної графіки та математичних моделей, з іншого боку -- дає свободу впровадження різних інновацій.

Характерними особливостями OpenGL, які забезпечили розповсюдження та розвиток цього графічного стандарту, є:

§ Стабільність. Доповнення та змінення в стандарті реалізуються таким чином, щоб зберегти сумісність з раніше розробленими програмним забезпеченням.

§ Надійність та переносимість. Програми, що використовують OpenGL, гарантують однаковий візуальний результат не залежачи від типу використовуємої ОС та організації відображення інформації. Крім того, ці програми можуть виконуватися як на ПК так і на робочих станціях і суперкомп'ютерів.

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

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

Функції OpenGL можна розділити на п'ять категорій:

§ Функції опису примітивів визначають об'єкти низького рівня ієрархії (примітиви), які здатна відображати графічна підсистема. В OpenGL в якості примітивів виступають точки, лінії, многокутники і т.д.

§ Функції опису джерел світла служать для опису положення та параметрів джерел світла, розміщених у трьохмірній сцені.

§ Функції надання атрибутів. За допомогою задання атрибутів програміст визначає як будуть виглядати об'єкті на екрані. Іншими словами, якщо за допомогою примітивів визначається що відображатиметься на екрані, то атрибути визначають способи виведення на екран. В якості атрибутів OpenGL дозволяє задати колір, характеристики матеріала, текстури, параметры освіщення.

§ Функції візуалізації дозволяють задати положення глядача у віртуальному просторі, параметри об'єктива камери. Знаючи ці параметри, система зможе не тільки правильно побудувати зображення, але і відсікти об'єкти, що опинилися за полем зору.

§ Набір функцій геометричних перетворень дозволяють програмісту виконувати різноманітні перетворення об'єктів - оберт, перенос, масштабування.

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

3. Розробка програмного забезпечення

3.1 Середовище розробки проекту

Розробка програмного забезпечення виконувалась у середовищі Microsoft Visual Studio 2010.

Microsoft Visual Studio - це лінійка продуктів компанії Microsoft, що включають інтегроване середовище, розробки програмного забезпечення та ряду інших інструментальних засобів. Цей продукт дозволяє створювати як консольні програми, так і програми з графічним інтерфейсом, у тому числі технології з підтримкою Windows Forms, а також веб-сайти, веб-додатки, веб-служби для всіх платформ, які підтримують Microsoft Windows, Windows Mobile, Windows CE,.NET Framework, Xbox, Windows Phone,.NET Compact Framework, Microsoft Silverlight.

3.2 Порядок виконання роботи

Проаналізувавши завдання і виділивши цілі, що потрібно реалізувати, переходимо до написання програми.

Створили вікно нашої програми, заповнили параметри формату пікселя (рис 3.1). Формат пікселя Windows не завжди узгоджується з OpenGL. У процесі ініціалізації OpenGL ці формати необхідно узгодити.

CMainWin::CMainWin() {

maxX=GetSystemMetrics(SM_CXSCREEN);

maxY=GetSystemMetrics(SM_CYSCREEN);

Create(NULL,"Курсовая работа. Прокошин Э. Э. Робот NXT MindStorms", WS_OVERLAPPEDWINDOW|WS_VSCROLL| WS_HSCROLL,CRect(0,0,maxX,maxY));

PIXELFORMATDESCRIPTOR pfd;

memset(&pfd,0, sizeof(PIXELFORMATDESCRIPTOR));

pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24;

pfd.cDepthBits = 32;

pfd.iLayerType = PFD_MAIN_PLANE;

CClientDC dc(this);

int nPixelFormat = ChoosePixelFormat(dc.m_hDC, &pfd);

BOOL bResult = SetPixelFormat(dc.m_hDC, nPixelFormat, &pfd);

m_hrc = wglCreateContext(dc.m_hDC);

wglMakeCurrent(dc.m_hDC,m_hrc);

CreateRGBPalette(dc.m_hDC);

m_pPal = NULL;

}

Рисунок 3.1 - Конструктор головного вікна

Виклик функції ініціалізації OpenGL відбувається за допомогою функції GLInit() (Рис 3.2).

void CMainWin::GLInit() {

glClearColor(1.0,1.0,1.0,1.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslated(0.0, 1.0, -1.5);

glScaled(1.0,1.0,0.0);

Рисунок 3.2 - Ініціалізація OpenGL

Далі нам необхідно зробити оновлення головного вікна, що відбувається за допомогою функції OnPaint (Рис 3.3).

void CMainWin::OnPaint() {

CPaintDC pDC(this);

CPalette* ppalOld = NULL;

if (m_pPal) {

ppalOld = pDC.SelectPalette(m_pPal, 0);

pDC.RealizePalette();

}

BOOL bResult = wglMakeCurrent(pDC.m_hDC, m_hrc);

GLInit();

OnOpenGLFirst();

SwapBuffers(pDC.m_hDC);

if (ppalOld) pDC.SelectPalette(ppalOld, 0);

wglMakeCurrent(NULL, NULL);

}

Рисунок 3.3 - Функція OnPaint

Рух робота реалізований внаслідок натискання клавіш клавіатури.

void CMainWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch(nChar) {

case 38: move_z -= 0.1; break; //клавіша Стрілка вгору

case 40: move_z += 0.1; break; //клавіша Стрілка вниз

case 37: turn += 2.0; break; // Стрелка влево

case 39: turn += -2.0; break; // Стрелка влево

case 87: scale += 0.1; break; // CTRL + W

case 83: scale -= 0.1; break; // CTRL + S

}

Invalidate(NULL);

}

Рисунок 3.4 - Функція OnKeyDown()

Побудував головну частину робота (рис. 3.5).

// Верх, основа

glPushMatrix();

glColor3f(.7,.7,.7);

glTranslated(0.0, 3.6, move_z);

glRotated(-10.0,1.0,0.0,0.0);

auxWireBox(2.5,1.4,4.0);

glPopMatrix();

//glColor3f(.7,.7,.7);

glRotated(-90.0,1.0,0.0,0.0);

glRotated(90.0,0.0,0.0,1.0);

glTranslated(-.5 - move_z, -0.2, 1.5);

auxWireCylinder(0.6,1.6);

Рисунок 3.5 - Побудова головної частини робота

Наступним кроком стала побудова 2-х коліс робота (рис.3.6).

// левок колесо

glPushMatrix();

glColor3f(0.0, 0.0, 0.0);

glTranslated(2.5, 1.0, -1.0);

glRotated(-move_z * 50,0.0,1.0,0.0);

auxWireCylinder(0.5, 0.6);

glPopMatrix();

// Правое колесо

glPushMatrix();

glTranslated(2.5, -2.0, -1.0);

glRotated(-move_z * 50,0.0,1.0,0.0);

auxWireCylinder(0.5, 0.6);

glPopMatrix();

Рисунок 3.6 - Праве та ліве колесо робота

Далі створив інщі менш об'ємні елементи робота (рис.3.7).

// Элемент, соединяющий колеса с корпусом

glPushMatrix();

glColor3f(.7,.7,.7);

glTranslated(1.2, 0.2, -0.98);

auxWireBox(2.8,2.4,0.7);

glPopMatrix();

// Элемент, соединяющий верх с нижним цилиндром

glPushMatrix();

glTranslated(0.0, 0.2, 1.05);

auxWireBox(.3,.6,0.75);

// Элемент, выезжающий немного вперед, на который крепится балка с камерой

glRotated(90, 0.0, 1.0, 0.0);

glTranslated(1.5, 0.0, 2.7);

auxWireBox(.3,.6,1.7);

// балка для камеры

glRotated(-60, 0.0, 1.0, 0.0);

glTranslated(.8, 0.0, 1.2);

auxWireBox(.3,.6,1.7);

// Камера

glRotated(60, 0.0, 1.0, 0.0);

glTranslated(-.6, 0.0,.6);

auxWireBox(.4, 1.2,.6);

// задняя балка

glPopMatrix();

glRotated(-30, 0.0, 1.0, 0.0);

glTranslated(0.0, 0.2, 3.5);

auxWireBox(.2,.8,1.7);

// задняя камера

glRotated(30, 0.0, 1.0, 0.0);

glTranslated(0.0, 0.0, 0.5);

//glColor3f(.95,.95,.95);

auxWireBox(1.0, 1.4,.5);

Рис.3.7 - Інші, менш об'ємні елементи робота

3.3 Опис контрольного прикладу

3.3.1 Призначення

Розроблена програма призначається для моделювання роботи робота NXT MindStorms.

3.3.2 Результати виконання роботи

Результат виконання роботи - це імітація роботи робота NXT MindStorms, його рухів, характеристик, зовнішнього вигляду (рис 3.8).

Рисунок 3.8 - 3D модель робота NXT MindStorms

Для керування рухами маніпулятора використовуються клавіши, що перераховані у таблиці 3.1.

моделювання мобільний робот програмний

Таблиця 3.1 - Дії робота

Рухи робота

Кнопки на клавіатурі

Рух вперед

^

Рух назад

v

Поворот вправо

>

Поворот вліво

<

Зменшення масштабу

S

Збільшення масштабу

W

Висновки

В результаті виконання даної курсової було розроблено програмне забезпечення для моделювання робота NXT MindStorms. Курсова робота наглядно демонструє можливості API OpenGL у сфері графічної візуалізації. Розробка курсової роботи відбувалась на мові програмування С++ у середовищі Microsoft Visual Studio. В результаті роботи була розроблена модель робота, реалізована рухомість, що відповідає характеристикам реального робота.

OpenGL - була розроблена компанією Silicon Graphics. Її мета - це надання доступу до можливостей графічної апаратури на максимально низькому рівні, який, тим не менш, припускає апаратну незалежність. Вона розроблена у вигляді вельми низькорівневого інтерфейсу доступу до графічної апаратури. OpenGL була реалізована для роботи в різних операційних середовищах, в які входять PC, Mac і UNIX -системи. Вона підтримувалася на безлічі апаратних середовищ, починаючи з систем, що виконують крім самого буфера кадру мінімальне апаратне прискорення, і закінчуючи системами, які виконують практично всі дії апаратно.

Курсова робота виконана відповідно до вимог стандартів [7,8].

Перелік посилань

1. Цимбал О.М. Технології програмування: Visual C++. - Харків: ХНУРЕ, 2006. - 336 с.

2. ГОСТ 27.204-83. Технологические системы. Технические требования к методам оценки надежности по параметрам производительности.

3. Шилдт Герберт. MFC: основы программирования. - К.: Издательская группа BHV, 1997. - 560 с.

4. Олафсен Ю., Скрайбнер К., Уайт К.Д. MFC и Visual C++ 6. Энциклопедия программиста. - СПб.: ООО „ДиаСофтЮП”, 2004. - 992 с.

5. OpenGL. Официальное руководство программиста: Пер. с англ. / Мейсон Ву, Джеки Нейдер, Том Девис, Дейв Шрайнер. - СПб: ООО «ДиаСофтЮП», 2002. - 592 с.

6. Тихомиров Ю.В. OpenGL. Программирование трехмерной графики.- СПб.: БХВ-Петербург, 2002. - 304 с.

7. ДСТУ 3008-95. Документація. Звіти в сфері науки і техніки. Структура і правила оформлення [Текст]. - К.: Держстандарт України, 1995. - 36 с.

8. ГОСТ 7.1-2003. Бібліографічний запис. Бібліографічний опис. Загальні відомості та правила складання [Текст]. - К.: Держспоживстандарт України, 2007. - 47 с.

Додаток А

Текст програми - файл «CApp.cpp» наведено на (Рис. А.1)

#include <afxwin.h>

#include "gl/gl.h"

#include "gl/glu.h"

#include "CApp.h"

#include "math.h"

#include "GLAUX.h"

#pragma comment(lib, "GLAUX.lib")

#pragma comment(lib, "opengl32.lib")

#pragma comment(lib, "glu32.lib")

HGLRC hRC=NULL; // Постоянный контекст рендеринга

HDC hDC=NULL; //

Приватный контекст устройства GDI

HWND hWnd=NULL; // Здесь будет хранится дескриптор окна

HINSTANCE hInstance; // Здесь будет хранится дескриптор приложения

double move_z = 0.0, turn = 0.0, scale = 1.0;

int maxX, maxY, vspos, hspos;

CMainWin::CMainWin() {

maxX=GetSystemMetrics(SM_CXSCREEN);

maxY=GetSystemMetrics(SM_CYSCREEN);

Create(NULL,"Курсовая работа. Прокошин Э. Э. Робот NXT MindStorms", WS_OVERLAPPEDWINDOW|WS_VSCROLL| WS_HSCROLL,CRect(0,0,maxX,maxY));

PIXELFORMATDESCRIPTOR pfd;

memset(&pfd,0, sizeof(PIXELFORMATDESCRIPTOR));

pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24;

pfd.cDepthBits = 32;

pfd.iLayerType = PFD_MAIN_PLANE;

CClientDC dc(this);

int nPixelFormat = ChoosePixelFormat(dc.m_hDC, &pfd);

BOOL bResult = SetPixelFormat(dc.m_hDC, nPixelFormat, &pfd);

m_hrc = wglCreateContext(dc.m_hDC);

wglMakeCurrent(dc.m_hDC,m_hrc);

CreateRGBPalette(dc.m_hDC);

m_pPal = NULL;

}

BOOL CMainWin::CreateRGBPalette(HDC hDC) {

PIXELFORMATDESCRIPTOR pfd;

int n = GetPixelFormat(hDC);

DescribePixelFormat(hDC, n, sizeof(PIXELFORMATDESCRIPTOR), &pfd);

if (!(pfd.dwFlags & PFD_NEED_PALETTE)) return FALSE;

LOGPALETTE* pPal = (LOGPALETTE*) malloc(sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY));

if (!pPal){

TRACE("Out of memory for logpal");

return FALSE;

}

pPal->palNumEntries = 256;

BOOL bResult = m_pPal->CreatePalette(pPal);

free (pPal);

return bResult;

}

BEGIN_MESSAGE_MAP(CMainWin,CFrameWnd)

ON_WM_PAINT()

ON_WM_SIZE()

ON_WM_VSCROLL()

ON_WM_HSCROLL()

ON_WM_TIMER()

ON_WM_KEYDOWN()

END_MESSAGE_MAP()

CApp App;

void CMainWin::OnPaint() {

CPaintDC pDC(this);

CPalette* ppalOld = NULL;

if (m_pPal) {

ppalOld = pDC.SelectPalette(m_pPal, 0);

pDC.RealizePalette();

}

BOOL bResult = wglMakeCurrent(pDC.m_hDC, m_hrc);

GLInit();

OnOpenGLFirst();

SwapBuffers(pDC.m_hDC);

if (ppalOld) pDC.SelectPalette(ppalOld, 0);

wglMakeCurrent(NULL, NULL);

}

void CMainWin::OnSize(UINT nType, int cx, int cy) {

CClientDC dc(this);

BOOL bResult = wglMakeCurrent(dc.m_hDC, m_hrc);

GLdouble gldAspect = (GLdouble) cx/ (GLdouble) cy;

glMatrixMode(GL_PROJECTION);// OutputGlError("MatrixMode");

glLoadIdentity();

gluPerspective(160.0, gldAspect, 1.0, 10.0);

glViewport(20, 30, cx-20, cy-20);

wglMakeCurrent(NULL, NULL);

}

void CMainWin::OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB) {

switch(SBCode) {

case SB_LINEDOWN: vspos++;break;

case SB_LINEUP: vspos--;break;

case SB_PAGEDOWN: vspos+=5;break;

case SB_PAGEUP: vspos-=5;break;

case SB_THUMBTRACK: vspos=Pos;break;

case SB_THUMBPOSITION: vspos=Pos;break;

}

Invalidate();

SetScrollPos(SB_VERT,vspos);

}

void CMainWin::OnHScroll(UINT SBCode, UINT Pos, CScrollBar *SB) {

switch(SBCode) {

case SB_LINERIGHT: hspos++;break;

case SB_LINELEFT: hspos--;break;

case SB_PAGERIGHT: hspos+=5;break;

case SB_PAGELEFT: hspos-=5;break;

case SB_THUMBTRACK: hspos=Pos;break;

case SB_THUMBPOSITION: hspos=Pos;break; }

Invalidate();

SetScrollPos(SB_HORZ,hspos);

}

void CMainWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch(nChar) {

case 38: move_z -= 0.1; break; //клавіша Стрілка вгору

case 40: move_z += 0.1; break; //клавіша Стрілка вниз

case 37: turn += 2.0; break; // Стрелка влево

case 39: turn += -2.0; break; // Стрелка влево

case 87: scale += 0.1; break; // CTRL + W

case 83: scale -= 0.1; break; // CTRL + S

}

Invalidate(NULL);

}

void CMainWin::GLInit() {

glClearColor(1.0,1.0,1.0,1.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslated(0.0, 1.0, -1.5);

glScaled(1.0,1.0,0.0);

}

void CMainWin::OnOpenGLFirst() {

glRotated(360.0*hspos/100,0,1,0); // 3D-scrolling around y

glRotated(360.0*vspos/100,1,0,0); // 3D-scrolling around x

// Устанавливаем камеру

glRotated(30,1,0,0);

glRotated(40,0,1,0);

glLineWidth(2.0);

glScaled(scale, scale, scale);

glBegin(GL_LINES); // Оси координат

glColor3f(1.0,0.0,0.0); // Ось X - красного цвета

glVertex3d(-3.0f,0.0f,0.0f); glVertex3d(25.0f,0.0f,0.0f);

glColor3f(0.0,1.0,0.0); // Ось Y - зеленого цвета

glVertex3d(0.0f,-3.0f,0.0f); glVertex3d(0.0f,25.0f,0.0f);

glColor3f(0.0,0.0,1.0); // Ось Z - синего цвета

glVertex3d(0.0f,0.0f,-3.0f); glVertex3d(0.0f,0.0f,25.0f);

glEnd();

glRotated(turn, 0.0, 1.0, 0.0);

// Верх, основа

glPushMatrix();

glColor3f(.7,.7,.7);

glTranslated(0.0, 3.6, move_z);

glRotated(-10.0,1.0,0.0,0.0);

auxWireBox(2.5,1.4,4.0);

glPopMatrix();

//glColor3f(.7,.7,.7);

glRotated(-90.0,1.0,0.0,0.0);

glRotated(90.0,0.0,0.0,1.0);

glTranslated(-.5 - move_z, -0.2, 1.5);

auxWireCylinder(0.6,1.6);

// левок колесо

glPushMatrix();

glColor3f(0.0, 0.0, 0.0);

glTranslated(2.5, 1.0, -1.0);

glRotated(-move_z * 50,0.0,1.0,0.0);

auxWireCylinder(0.5, 0.6);

glPopMatrix();

// Правое колесо

glPushMatrix();

glTranslated(2.5, -2.0, -1.0);

glRotated(-move_z * 50,0.0,1.0,0.0);

auxWireCylinder(0.5, 0.6);

glPopMatrix();

// Элемент, соединяющий колеса с корпусом

glPushMatrix();

glColor3f(.7,.7,.7);

glTranslated(1.2, 0.2, -0.98);

auxWireBox(2.8,2.4,0.7);

glPopMatrix();

// Элемент, соединяющий верх с нижним цилиндром

glPushMatrix();

glTranslated(0.0, 0.2, 1.05);

auxWireBox(.3,.6,0.75);

// Элемент, выезжающий немного вперед, на который крепится балка с камерой

glRotated(90, 0.0, 1.0, 0.0);

glTranslated(1.5, 0.0, 2.7);

auxWireBox(.3,.6,1.7);

// балка для камеры

glRotated(-60, 0.0, 1.0, 0.0);

glTranslated(.8, 0.0, 1.2);

auxWireBox(.3,.6,1.7);

// Камера

glRotated(60, 0.0, 1.0, 0.0);

glTranslated(-.6, 0.0,.6);

auxWireBox(.4, 1.2,.6);

// задняя балка

glPopMatrix();

glRotated(-30, 0.0, 1.0, 0.0);

glTranslated(0.0, 0.2, 3.5);

auxWireBox(.2,.8,1.7);

// задняя камера

glRotated(30, 0.0, 1.0, 0.0);

glTranslated(0.0, 0.0, 0.5);

//glColor3f(.95,.95,.95);

auxWireBox(1.0, 1.4,.5);

}

BOOL CApp::InitInstance() {

m_pMainWnd = new CMainWin;

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

Рисунок А.1 - Текст програми - файл «CApp.cpp»

Текст програми - файл «CApp.h» наведено на (Рис. А.2).

class CApp:public CWinApp {

public:BOOL InitInstance();

};

class CMainWin:public CFrameWnd

{

CPalette *m_pPal;

HGLRC m_hrc;

public: void GLInit();

void OnOpenGLFirst();

void OnSize(UINT nType, int cx, int cy);

void OnPaint();

void OnSize();

void OnVScroll(UINT SBCode,UINT Pos,CScrollBar *SB);

void OnHScroll(UINT SBCode,UINT Pos,CScrollBar *SB);

void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

void OnChar(UINT Ch, UINT Count, UINT Flags);

BOOL CreateRGBPalette(HDC hDC);

CBrush CreateSolidBrush;

CMainWin();

DECLARE_MESSAGE_MAP()

};

Рисунок А.2 - Текст програми - файл «CApp.h»

А.2 ЗАГАЛЬНІ ВІДОМОСТІ

Програма «Робот NXT MindStorms» складається з двох файлів. Для повноцінного функціонування програми необхідно мати налаштовану операційну систему Windows XP/7/8, а для запуску встановити пакет програм Microsoft Visual Studio 2010 або новіша.

А.3 ФУНКЦІОНАЛЬНЕ ПРИЗНАЧЕННЯ

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

А.4 ВИКОРИСТОВУВАНІ ТЕХНІЧНІ ЗАСОБИ

Для запуску програми необхідно мати IBM-сумісний персональний комп'ютер із встановленим на ньому програмним забезпеченням, що перераховано у розділі А.2. Комп'ютер повинен мати стандартні пристрої для введення-виведення інформації (клавіатура, миша, відеокарта, дисплей), 6 мб вільного місця на жорсткому диску, 32 Мб вільної оперативної пам'яті, процесор з тактовою частотою не нижче 500 МГц.

А.5 ВИКЛИК І ЗАВАНТАЖЕННЯ

Для виклику програми необхідний ярлик Prokoshin_NXT_MindStorms.exe. Програма використовую 6 Мб вільного місця на жорсткому диску й 32 Мб оперативної пам'яті.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.