Программа, вычисляющая все конфигурации манипуляционного робота, в которых схват захватывает объект

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

КУРСОВОЙ ПРОЕКТ ПО ДИСЦИПЛИНЕ «ЯЗЫКИ ПРОГРАММИРОВАНИЯ»

Тема: Программа, вычисляющая все конфигурации манипуляционного робота, в которых схват захватывает объект

Введение

В курсовом проекте по дисциплине «ЯЗЫКИ ПРОГРАММИРОВАНИЯ» рассматриваются вопросы алгоритмической постановки и программной реализации интеллектуальной обработки данных. В ходе выполнения курсового проектирования студенты приобретают углубленные знания о методах построения систем интеллектуальной обработки данных, об алгоритмах функционирования приложений для интеллектуальной обработки данных, приобретают навыки самостоятельной работы.

Основными целями курсового проекта по дисциплине «ЯЗЫКИ ПРОГРАММИРОВАНИЯ» являются:

— систематизация, закрепление и расширение теоретических знаний по специальности и применение их для решения задач интеллектуальной обработки данных;

— ознакомление с математическими методами и моделями обработки данных;

— изучение алгоритмов, пакетов анализа данных, программирования приложений для интеллектуальной обработки данных;

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

Основной задачей курсового проектирования является углубление подготовки по дисциплине «ЯЗЫКИ ПРОГРАММИРОВАНИЯ».

1. Постановка задачи

1. 1 Анализ предметной области

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

Исследования, посвященные способам планирования траекторий движения робототехнических систем различных классов, можно найти в работах отечественных и зарубежных ученых (Ю.Г. Козырева, П. Д. Крутько, Ф. М. Кулакова, А. В. Тимофеева, С. Ф. Бурдаков, Б. Г. Ильясов, В. И. Васильев, P. Bohner, S. Cameron, К. Fu, S. Ma, A. McLean, I. Kobayashi, U. Rembold, H. Woern, F. Bmwen, E. Cheung, Y. Konishi, С. Lm, Y. Nakamura и других). В них получены алгоритмы, обеспечивающие планирование траекторий для относительно небольшого числа звеньев (не более 10) Улучшение методов решения задачи планирования траекторий, расширение условий применимости алгоритмов планирования траекторий создает предпосылки для построения более эффективных систем управления многозвенными манипуляторами

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

Для определения конфигурации манипулятора необходимо рассчитать тем или иным способом собственные переменные каждого звена манипулятора, а также учесть ограничения, связанные с физической структурой манипулятора, При большом числе звеньев, растет число управляемых объектов, еще большим становится объем вычислений, необходимых для расчета траектории движения манипулятора, т.к. в линейной алгебре доказано, что сложность решения резко возрастает при превышении в системе уравнений числа переменных свыше сложность рабочего пространства Манипуляторы рассматриваемого класса предназначены, как правило, для выполнения работы в пространствах с большим количеством препятствий.

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

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

1.2 Описание математической модели

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

На пространство конфигураций налагается сетка (см. рис. 1.2. 1).

Рисунок 1.2. 1

Далее рассматриваем только точки, лежащие на узлах сетки. Берем очередную точку (например, А), ее координаты равны qА = (q1, q2,…, qn). Подставляем их в последние две из формул (1) и получаем координаты точки Pn в конфигурации qА. Если

x0Pn = x0Obj

y0Pn = y0Obj,

то объект может быть захвачен в конфигурации qА. Затем берем точку B и повторяем процесс.

Ограничения на обобщенные координаты:

0°?qi< 360°, i=1,…, n

В пространстве обобщенных координат каждая конфигурация МР предстает в виде точки q=(q1, q2,…, qn). Для расчета координат точек Pi, i=1,…, n использовать формулы:

Принять li=l, i=1,…, n.

1.3 Алгоритмическая постановка задачи

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

Скорость перебора положений манипулятора зависит от указанной пользователем размерности шага перемещения звеньев манипулятора.

1.4 Анализ существующего программного обеспечения и технических систем

eM-Workplace — среда цифрового 3D-моделирования роботизированных ячеек.

eM-Workplace PC (ROBCAD) предназначен для разработки, симуляции, оптимизации, анализа и off-line программирования роботизированных и автоматизированных технологических процессов. Инструмент предоставляет платформу для оптимизации процессов и расчета времени цикла. С помощью eM-Workplace Вы сможете разрабатывать реалистичные, полнофункциональные модели производственных ячеек в трехмерной среде.

Продукт eM-Workplace (ранее Robcad) является масштабируемым приложением, в котором интегрированы мощное графическое ядро и набор специализированных приложений для широкого спектра технологических процессов, в том числе точечная и дуговая сварка, лазерная и водяная резка, нанесение клея, сверление и клёпка, ручные операции. eM-Workplace является промышленным стандартом де-факто, инженерами по всему миру используются более 4000 установленных рабочих мест для оптимизации технологических процессов — уменьшения стоимости, улучшения качества и сокращения времени вывода продукта на рынок.

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

Возможности:

— Трехмерная планировка ячеек

— Определение трехмерных траекторией, проверка достижимости и столкновений и оптимизация времени цикла

— Симуляция движения и синхронизация нескольких роботов и механизмов

— Моделирование и оптимизация всего технологического процесса с помощью модуля SOP (последовательность операций)

— Обмен данными с распространенными САПР

— Библиотеки роботов, инструмента, оборудования

— Моделирование элементов со сложной кинематикой, в том числе человека

— Модуль OLP (программирование off-line)

* Загрузка оптимизированных программ в контроллеры манипуляторов

* Загрузка программ из контроллера для оптимизации в пакете

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

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

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

Tecnomatix Robcad является приложением, в котором интегрированы графическое ядро и набор специализированных приложений для широкого спектра технологических процессов.

Robcad предназначен для разработки, симуляции, оптимизации, анализа и off-line программирования роботизированных и автоматизированных технологических процессов. Графическое ядро продукта включает ключевые элементы, необходимые для моделирования. В дополнение к возможностям 3D-визуализации, ядро вводит в модель ячейки измерение времени, в котором протекает технологический процесс.

Исходные данные для моделирования (геометрия изделия, оснастки, оборудования) обеспечиваются САПР. Для этого продукт имеет возможность импорта данных из основных промышленных САПР, в том числе Catia, NX, Pro/Engineer, а также трансляции данных из нейтральных форматов, таких как IGES, DXF, VDAFS, SET, SLT, STEP, JT.

Robcad имеет открытую архитектуру и API, предоставляя пользователю возможность разработки дополнительных приложений. Программный интерфейс обеспечивает доступ к функциям и алгоритмам ядра, включая геометрию, кинематику, планирование траекторий движения и графику.

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

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

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

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

2. Программная часть

2.1 Структура программного продукта

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

Условно программный продукт можно разделить на 3 модуля:

— модуль ввода данных;

— модуль расчета;

— модуль вывода результата.

2.2 Руководство программиста

Программное обеспечение имеет оконный интерфейс и работает под управлением операционной системы Windows XP.

Программное обеспечение предназначено для расчета положений звеньев манипулятора для захвата объекта с учетом положения препятствий. Ввод данных в программу осуществляется черед поля ввода данных.

Особых требований к производительности компьютера нет.

Входные данные:

— количество звеньев манипулятора

— координаты (х и у) объекта для захвата

— ограничения на положения звеньев манипулятора

— шаг поворота звена манипулятора

Ход выполнения работы программы выводится в окно лога программы.

2.3 Руководство оператора

Программное обеспечение имеет оконный интерфейс и работает под управлением операционной системы Windows XP.

Программное обеспечение предназначено для расчета положений звеньев манипулятора для захвата объекта с учетом положения препятствий. Ввод данных в программу осуществляется черед поля ввода данных.

Особых требований к производительности компьютера нет.

Входные данные:

— количество звеньев манипулятора

— координаты (х и у) объекта для захвата

— ограничения на положения звеньев манипулятора

— шаг поворота звена манипулятора

Также необходимо указать задержку между обновлениями изображения ситуаций захвата объекта и точность положения манипулятора для выполнения захвата объекта.

Ход выполнения работы программы (время запуска, количество найденных ситуаций захвата объекта, время останова, длительность расчета) выводится в окно лога программы, изображения ситуаций захвата объекта прорисовывается в правой части окна.

программный обеспечение tecnomatix robcad

2.4 Выполнение анализа на тестируемой выборке данных

Выполним тестирование программного обеспечения. Заполним таблицу в соответствии с заданием.

Тестирование выполним со следующими исходными данными:

1. постоянные данные

— координаты объекта (20; 20);

— точность захвата 0,25 точки;

— ограничения на звенья манипулятора (-180; 180) градусов;

— задержка перед прорисовкой 50 мсек.

2. переменные данные

— количество звеньев от 2 до 7

— шаг поворота звена 1,2,5 или 10.

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

Дискретность конфигурационного пространства, градусов

Число звеньев робота

Время, секунд

1

2

менее 1 сек.

2

2

менее 1 сек.

5

2

менее 1 сек.

10

2

менее 1 сек.

1

3

184

2

3

23

5

3

3

10

3

менее 1 сек.

1

4

189 356

2

4

14 375

5

4

368

10

4

23

1

5

более 4 часов

2

5

более 4 часов

5

5

13 472

10

5

421

1

6

более 4 часов

2

6

более 4 часов

5

6

476 928

10

6

7 452

1

7

более 4 часов

2

7

более 4 часов

5

7

более 4 часов

10

7

134 136

2.5 Принятие решения об использовании результатов

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

Выводы

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

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

Библиографический список

1. Вукобратович М., Стокич Д., Кирчански Н. Неадаптивное и адаптивное управление манипуляционными роботами. — М.: Мир, 1989.

2. Попов Е. П. Управление роботами-манипуляторами. Изв. АН СССР, Техн. киберн., 1974, N 6, с. 51−56.

3. Попов Е. П., Верещагин А. Ф., Зенкевич С. Л. Манипуляционные роботы: динамика и алгоритмы.- М.: Наука, 1980.

4. Зенкевич С. Л., Ющенко А. С. Основы управления манипуляционными роботами.- М.: Изд-во МГТУ им. Н. Э. Баумана, 2004.- 480 с.

5. «Специальный справочник С++» Борис Карпов, Татьяна Баранова (издательство Питер).

6. Borland C++ Builder 5. Энциклопедия программиста. Калверт Ч., Рейсдорф К., «ДиаСофт» — 2001, 944 с.

Приложение

Листинг программного продукта с комментариями

1. Unit_handler. h

//---------------------------------------------------------------------------

#ifndef Unit_handlerH

#define Unit_handlerH

//---------------------------------------------------------------------------

#include < Classes. hpp>

#include < Controls. hpp>

#include < StdCtrls. hpp>

#include < Forms. hpp>

#include «CSPIN. h»

#include < ExtCtrls. hpp>

#include «CGAUGES. h»

//---------------------------------------------------------------------------

class TForm1: public TForm

{

__published: // IDE-managed Components

TLabel *Label1;

TCSpinEdit *CSpinEdit1;

TLabel *Label2;

TCSpinEdit *CSpinEdit2;

TCSpinEdit *CSpinEdit3;

TLabel *Label3;

TLabel *Label4;

TEdit *Edit1;

TLabel *Label5;

TMemo *Memo1;

TLabel *Label6;

TLabel *Label8;

TLabel *Label9;

TLabel *Label10;

TCSpinEdit *CSpinEdit5;

TCSpinEdit *CSpinEdit6;

TLabel *Label11;

TLabel *Label12;

TLabel *Label13;

TLabel *Label15;

TLabel *Label16;

TButton *Button1;

TLabel *Label7;

TLabel *Label14;

TCSpinEdit *CSpinEdit4;

TImage *Image1;

TLabel *Label17;

TCGauge *CGauge1;

TLabel *Label18;

TCSpinEdit *CSpinEdit7;

TLabel *Label19;

void __fastcall Button1Click (TObject *Sender);

void __fastcall Edit1KeyPress (TObject *Sender, char & Key);

void __fastcall recalc (void);

int __fastcall barrier (int link);

void __fastcall paint (void);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

2. Unit_handler. cpp

//---------------------------------------------------------------------------

#include < vcl. h>

#pragma hdrstop

#include «Unit_handler. h»

#include < math. h>

#include < stdio. h>

#include < conio. h>

//---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma link «CSPIN»

#pragma link «CGAUGES»

#pragma resource «*. dfm»

#define Ei 25. 0

#define M 2

#define PI 3. 1 415 936 535 897 932 410 613 227 585 536

// определяем сложное препятствие

#define Ex -40

#define Ey 30

#define Fx -40

#define Fy 130

#define Gx -20

#define Gy 130

#define Hx 20

#define Hy 130

#define Kx 40

#define Ky 130

#define Lx 40

#define Ly 30

#define Px 20

#define Py 30

#define Rx 20

#define Ry 70

// определяем простое препятствие

#define N1x -60

#define N1y -1

#define N2x 60

#define N2y -1

#define N3x -60

#define N3y -10

#define N4x 60

#define N4y -10

int n; /* количество звеньев */

int corner[100]={0}; /* углы звеньев манипулятора */

float link_x[100]={0}, link_y[100]={0}; /* координаты вершин манипулятора */

int number = 0; /* количество нвайденных ситуаций */

float x, y; /* координаты объекта */

/* линии, составляющие препятствие */

int lines[12][5]= {{N1x, N1y, N2x, N2y, 1},

{N2x, N2y, N3x, N3y, 0},

{N3x, N3y, N4x, N4y, 1},

{N4x, N4y, N1x, N1y, 0},

{Ex, Gy, Lx, Gy, 1},

{Lx, Gy, Lx, Ly, 0},

{Lx, Ly, Hx, Ly, 1},

{Hx, Ly, Rx, Ry, 0},

{Rx, Ry, Gx, Ry, 1},

{Gx, Ry, Gx, Ey, 0},

{Gx, Ey, Ex, Ey, 1},

{Ex, Ey, Ex, Gy, 0}};

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1: :TForm1(TComponent* Owner)

: TForm (Owner)

{

}

//---------------------------------------------------------------------------

/* перерасчет координат звеньев */

void __fastcall TForm1: :recalc (void)

{ int i, j;

float sum_e_cos[100]={0. 0}, sum_e_sin[100]={0. 0};

float sum_corner=0. 0;

char buf[256];

for (i=0; i< n; i++)

{

sum_corner = 0. 0;

for (j=0; j< =i; j++)

{sum_corner += corner[j];

sum_e_cos[i] = Ei*cos (sum_corner*(PI/180. 0));

sum_e_sin[i] = Ei*sin (sum_corner*(PI/180. 0));

sprintf (buf,"%. 3f", sum_e_cos[i]);

sscanf (buf,"%f", & (sum_e_cos[i]));

sprintf (buf,"%. 3f", sum_e_sin[i]);

sscanf (buf,"%f", & (sum_e_sin[i]));

}

link_x[i] = 0. 0;

link_y[i] = 0. 0;

for (j=0; j< =i; j++)

{link_x[i] += sum_e_cos[j];

link_y[i] += sum_e_sin[j];

}

}

}

//---------------------------------------------------------------------------

/* функция проверки попадания звена манипулятора в преграду */

int __fastcall TForm1: :barrier (int link)

{int status = 1, i;

float A1, B1,C1, A2, B2,C2, xx, yy;

A1=link_y[link]-link_y[link+1];

B1=link_x[link+1]-link_x[link];

C1=link_x[link]*link_y[link+1]-link_x[link+1]*link_y[link];

for (i=0; i< 12; i++)

{A2=lines[i][1]-lines[i][3];

B2=lines[i][2]-lines[i][0];

C2=lines[i][0]*lines[i][3]-lines[i][2]*lines[i][1];

if (A1*B2-A2*B1 == 0.0 || B1 == 0.0 || B2 == 0. 0)

{status++; status--; }

else

{

xx = (C2*B1-C1*B2)/(A1*B2-A2*B1);

yy = -((A1*xx+C1)/B1);

yy = -((A2*xx+C2)/B2);

if ((lines[i][4] == 0) & & (xx == lines[i][0]) & &

((yy >= lines[i][1] & & yy <= lines[i][3]) ||

(yy >= lines[i][3] & & yy <= lines[i][1])) & &

((yy >= link_y[link] & & yy <= link_y[link+1])||

(yy >= link_y[link+1] & & yy <= link_y[link]))

) {status = 0; }

if ((lines[i][4] == 1) & & (yy == lines[i][1]) & &

((xx >= lines[i][0] & & xx <= lines[i][2]) ||

(xx >= lines[i][2] & & xx <= lines[i][0])) & &

((xx >= link_x[link] & & xx <= link_x[link+1])||

(xx >= link_x[link+1] & & xx <= link_x[link]))

) {status = 0; }

}

}

return status;

}

//---------------------------------------------------------------------------

/* прорисовка ситуации */

void __fastcall TForm1: :paint (void)

{ int i, px, py;

char buf[256];

/* очистка холста для рисования */

Image1-> Canvas->Brush->Color = clWhite;

Image1-> Canvas->FillRect (Image1->Canvas->ClipRect);

/* препятствия */

Image1-> Canvas->Brush->Color = clGray;

Image1-> Canvas->Pen->Color = clGray;

Image1-> Canvas->Rectangle (N1x*M+320,240-N1y*M, N4x*M+320,240-N4y*M);

Image1-> Canvas->Rectangle (Ex*M+320, 240-Gy*M, Gx*M+320, 240-Ey*M);

Image1-> Canvas->Rectangle (Gx*M+320, 240-Gy*M, Rx*M+320, 240-Ry*M);

Image1-> Canvas->Rectangle (Hx*M+320, 240-Hy*M, Lx*M+320, 240-Ly*M);

/* оси постороения */

Image1-> Canvas->Brush->Color = clBlack;

Image1-> Canvas->Pen->Color = clBlack;

Image1-> Canvas->MoveTo (0,240);

Image1-> Canvas->LineTo (640,240);

Image1-> Canvas->LineTo (630,238);

Image1-> Canvas->LineTo (630,242);

Image1-> Canvas->LineTo (640,240);

Image1-> Canvas->MoveTo (320,480);

Image1-> Canvas->LineTo (320,0);

Image1-> Canvas->LineTo (318,10);

Image1-> Canvas->LineTo (322,10);

Image1-> Canvas->LineTo (320,0);

/* построение положений манипулятора */

Image1-> Canvas->MoveTo (320,240);

Image1-> Canvas->Brush->Color = clBlue;

Image1-> Canvas->Pen->Color = clBlue;

for (i=0; i< n; i++)

{

px =(int)(link_x[i]*M+320. 0);

py =(int)(240. 0-link_y[i]*M);

Image1-> Canvas->LineTo (px, py);

}

/* рисуем объект для захвата */

Image1-> Canvas->Brush->Color = clGreen;

Image1-> Canvas->Pen->Color = clGreen;

Image1-> Canvas->Ellipse (x*M+319,239-y*M, x*M+321,241-y*M);

Image1-> Canvas->Ellipse (x*M+318,238-y*M, x*M+322,242-y*M);

/* рисуем точки соединения звеньев */

Image1-> Canvas->Brush->Color = clRed;

Image1-> Canvas->Pen->Color = clRed;

for (i=0; i< n; i++)

{

px =(int)(link_x[i]*M+320. 0);

py =(int)(240. 0-link_y[i]*M);

Image1-> Canvas->Ellipse (px-1,py-1,px+1,py+1);

Image1-> Canvas->Ellipse (px-2,py-2,px+2,py+2);

}

/* рисуем опорную точку манипулятора */

Image1-> Canvas->Brush->Color = clYellow;

Image1-> Canvas->Pen->Color = clYellow;

Image1-> Canvas->Ellipse (319,239,321,241);

Image1-> Canvas->Ellipse (318,238,322,242);

Image1-> Canvas->Ellipse (317,237,323,243);

/* подписываем график */

number++;

Image1-> Canvas->Brush->Color = clWhite;

Image1-> Canvas->Pen->Color = clBlack;

sprintf (buf,"Ситуация №%d", number);

Image1-> Canvas->TextOutA (15,10,buf);

for (i=0; i< n; i++)

{

sprintf (buf,"Corner %d: %d", i+1, corner[i]);

Image1-> Canvas->TextOutA (2,18*(i+1)+10,buf);

}

/* прорисовка изменений */

if (CSpinEdit7-> Value ≠ 0)

Sleep (CSpinEdit7-> Value);

Application-> ProcessMessages ();

}

//---------------------------------------------------------------------------

void __fastcall TForm1: :Button1Click (TObject *Sender)

{

float prec; /* величина возм. отклонения */

int start, end; /* ограничение на обобщение коорд. */

int i, j;

int status;

bool done;

FILE *f;

TDateTime t1, t2, t3;

/* определение начала расчетов */

t1 = Time ();

/* очистка холста для рисования */

Image1-> Canvas->Brush->Color = clWhite;

Image1-> Canvas->FillRect (Image1->Canvas->ClipRect);

Application-> ProcessMessages ();

/* получение данных о количестве звеньев */

n = CSpinEdit1-> Value;

/* получение данных о координатах объекта */

x = CSpinEdit2-> Value;

y = CSpinEdit3-> Value;

/* получение даннных о возможном отклонении */

prec = StrToFloat (Edit1-> Text);

/* получение данных на ограчение на обобщение координаты */

start = CSpinEdit5-> Value;

end = CSpinEdit6-> Value;

/* логи… */

Memo1-> Lines->Add («-------------------------------------»);

Memo1-> Lines->Add («Начало выполнения «+TimeToStr (t1));

/* первоначальная инициализация массивов данных */

for (i=0; i<n; i++)

{corner[i] = start; }

for (i=n; i< 100; i++)

{corner[i] = end; }

number = 0;

/* сброс прогресса */

CGauge1-> MaxValue = end — start;

CGauge1-> Progress = 0;

/* открытие файла */

f = fopen («file_out. txt», «w»);

/* цикл расчета координат звеньев манипулятора */

done = false;

while (!done)

{/* рассчитываем координаты звеньев */

recalc ();

/* проверяем на пересечение с преградой */

status = 1;

for (i=0; i< n;i++)

{status = status*barrier (i); }

/* сравнение координат расчетных и исходных */

if (fabs (link_x[n-1]-x)< prec & & fabs (link_y[n-1]-y)< prec & & status ≠ 0)

{/* вывод на экран если совпало (в пределах точности) */

paint ();

/* вывод данных в файл */

fprintf (f,"N %d: «, number);

for (i=0; i< n; i++)

{fprintf (f,"%d «, corner[i]); }

fprintf (f,"n");

}

/* меняем угол */

corner[n-1] += CSpinEdit4-> Value;

/* поворачиваем следующее звено */

for (i=n-1; i> =0; i--)

{if (corner[i]> end)

{if (i> 0)

{corner[i-1] += CSpinEdit4-> Value;

if (corner[i-1] > end & & i == 1)

{done = true; }

}

else

break;

corner[i] = start;

}

}

CGauge1-> Progress = corner[0] - start;

}

t2 = Time ();

t3 = t2-t1;

/* логи… */

Memo1-> Lines->Add («Найдено „+IntToStr (number)+“ ситуаций захвата»);

Memo1-> Lines->Add («Окончание выполнения «+TimeToStr (t2));

Memo1-> Lines->Add («Длительность выполнения «+TimeToStr (t3));

}

//---------------------------------------------------------------------------

void __fastcall TForm1: :Edit1KeyPress (TObject *Sender, char & Key)

{

if ((Key >= '0') & & (Key <= '9')) {} // цифры

else if (Key == 8) {} // < -

else if ((Key == '. ') || (Key == ',')) // запятая

{

if (((TEdit*)Sender)-> Text. Pos (DecimalSeparator)≠0) // если запятая уже есть

Key = 0;

else // если ещё нет

Key = DecimalSeparator;

}

else Key = 0; // не цифра

}

//---------------------------------------------------------------------------

ПоказатьСвернуть
Заполнить форму текущей работой