\documentclass[a4paper, 14pt]{extarticle} \usepackage{setspace} \usepackage{ucs} \usepackage{amsmath} \usepackage[utf8x]{inputenc} % Включаем поддержку UTF8 \usepackage[english,russian]{babel} % Включаем пакет для поддержки русского языка \usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm,bindingoffset=0cm]{geometry} \usepackage[pdftex]{graphicx, color} \usepackage{subfigure} \usepackage{color} \usepackage{listings} \usepackage[nooneline]{caption} \captionsetup[table]{justification=raggedright} \captionsetup[figure]{justification=centering,labelsep=endash} \hyphenation{Ne-u-ral-Net-work}%для переноса правильного \hyphenation{we-ights}%для переноса правильного \hoffset = 5mm % чтоб отступ слева был 1 люйм = 2,54 см + 5 мм - не менее 3 см! \renewcommand{\baselinestretch}{1.5} \lstset{inputencoding=utf8x, extendedchars=false, keepspaces = true, language=c} \renewcommand{\lstlistingname}{Листинг} \begin{document} % начало документа \setcounter{tocdepth}{4} % chapter, section, subsection, subsubsection и paragraph \graphicspath{{CourseProject/Chapter1/}, {CourseProject/Chapter2/}, {CourseProject/Chapter3/}, {CourseProject/Chapter4/}, {CourseProject/Chapter5/}} \DeclareGraphicsExtensions{.png,.pdf,.jpg,.mps} \renewcommand{\contentsname}{\centering Содержание} \parindent = 0.7cm \begin{small} \begin{titlepage} % начало титульной страницы \begin{center} % включить выравнивание по центру \bigskip \textit {Государственное образовательное учреждение высшего профессионального образования}\\[10mm] \huge«Московский государственный технический университет имени Н.Э. Баумана»\\ \Large {(МГТУ им. Н.Э. Баумана)}\\[10mm] \rule[+3mm]{7.5cm}{0.80mm} \end{center} \begin{flushleft} % выровнять содержимое по левому краю \begin{tabbing} MMMMММММMМ \= \kill \large{ФАКУЛЬТЕТ} \> \large{\textit{ИНФОРМАТИКА И СИСТЕМЫ УПРАВЛЕНИЯ}} \\ \large{КАФЕДРА} \> \large{\textit{ТЕОРЕТИЧЕСКАЯ ИНФОРМАТИКА}} \\ \> \large{\textit{И КОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ}} \\[0.2cm] \end{tabbing} \end{flushleft} \begin{center} \Huge{РАСЧЕТНО-ПОЯСНИТЕЛЬНАЯ ЗАПИСКА}\\ к дипломному проекту на тему:\\ Разработка системы нейроуправления четырёхзвенным роботом\\[0.1cm] \begin{tabbing} MMMMММММMMMMMMMMMM \= \kill \Large{Студент} \> \Large{\textit{С. А. Сорокина}} \\ \Large{Руководитель дипломного проекта} \> \Large{\textit{Ю. Т. Каганов}}\\[0cm] \end{tabbing} \largeМосква, 2015 \end{center} \thispagestyle{empty} % не нумеровать страницу \end{titlepage} % конец титульной страницы \end{small} \renewcommand{\abstractname}{\Huge{Аннотация\\[1.5cm]}} \begin{abstract} Целью данного дипломного проекта является разработка системы нейроуправления четырёхзвенным последовательным манипулятором типа PUMA-560, на конце которого находится исполнительный орган. В работе приведена базовая информация о манипуляторах, способах управления роботами, нейронных сетях. Для реализации управления построена математическая модель кинематики четырёхзвенного робота. Нахождение управляющих параметров осуществляется путём решения обратной задачи кинематики манипулятора с помощью нейронных сетей. Чтобы проверить точность результата, решается также прямая задача, позволяющая при заданных управляющих параметрах узнать реальные значения координат захватного органа. Эти значения являются эталонными, с ними сравниваются значения, полученные с помощью нейронной сети. Для демонстрации работы системы нейроуправления визуализировано движение робота согласно заданным математической моделью кинематическим законам. \end{abstract} \clearpage \tableofcontents %Содержание \newpage \part*{\large \centering ВВЕДЕНИЕ} \addcontentsline{toc}{part}{ВВЕДЕНИЕ} \hspace{\parindent}В настоящий момент робототехника является неотъемлемой частью производственной и исследовательской деятельности человека во всевозможных областях. Промышленные роботы используются в основном для таких промышленных приложений, как точечная сварка, сборка, обработка материалов, окраска и др., благодаря их высокой эффективности применительно к однотипным задачам. Тем не менее, эти механизмы нельзя назвать автономными в том смысле, что для достижения поставленных задач они требуют предварительных действий, таких как калибровка или планирование движений. Управление роботами с помощью программного обеспечения позволяет обеспечить гибкость в управлении машиной и её универсальность по отношению к задачам, в которых она применима. Однако, все преимущества робота можно использовать, только если программное управление осуществляется эффективно. В общем случае процесс программирования робота состоит из двух фаз: планирование траектории и управление, в соответствии с найденной траекторией. В данной работе будет решаться вторая задача для четырёхзвенного антропоморфного манипулятора типа PUMA-560. Сами же траектории, на которых будет тестироваться точность реализованного решения, выбираются произвольно и лежат в рабочем пространстве робота.\\\indent Определение кинематики манипулятора по сути состоит в отображении вектора ориентации соединения звеньев в вектор из декартова пространства, идентифицирующий положение механизма. Это является достаточно сложной задачей, требующей больших вычислительных затрат, из-за нелинейности уравнений (тригонометрических), описывающих переход от одного вектора к другому. Существует множество различных подходов для решения данной задачи, например: тригонометрический и численный методы, метод обратных преобразований \cite{10}. Но, к сожалению, аналитическое решение не всегда возможно. К тому же при решении задачи возникает неоднозначность: для обеспечения одного и того же положения исполнительного органа существует несколько различных возможностей, то есть разные векторы ориентации соединений звеньев соответствуют одному и тому же конкретному вектору из декартова пространства, определяющему положение исполнительного устройства.\\\indent Упомянутая проблема является одной из важнейших в робототехнике и является темой многих исследований \cite{1}, \cite{2}, \cite{3}, \cite{4}, \cite{5}. Использование нейронной сети позволяет решить её путём нахождения приближённого решения с помощью обучения сети на множестве примеров. Это множество состоит из пар (вектор из декартова пространства, вектор ориентации соединения звеньев). Оно создаётся следующим образом: генерируется некий набор векторов ориентации звеньев, для каждого из которых решается прямая задача кинематики -- находится положение исполнительного устройства. Такая система помогает решить проблему неоднозначности. В данной работе обучение сети на множестве примеров осуществляется по алгоритму обратного распространения ошибки.\\\indent Чтобы наглядно представить и оценить степень точности реализованнного решения используется визуализация движения робота по заданной траектории. Также производится тестирование на примерах, не включённых в обучающее множество. \newpage \section[Обзор литературы]{\large \centering Обзор литературы} \subsection[Последовательные манипуляторы]{\large Последовательные манипуляторы} \hspace{\parindent}Последовательный манипулятор -- это разомкнутая механическая цепь, состоящая из твёрдых тел, последовательно соединённых между собой (Рис. \ref{ris:manipulator}).\\\indent \begin{figure}[h] \center{\includegraphics[width=0.6\linewidth]{mani.png}} \caption{Последовательный манипулятор} \label{ris:manipulator} \end{figure} Каждое из составляющих манипулятор твёрдых тел называется звеном, два соединённых звена -- кинематической парой, а вся цепь -- кинематической цепью \cite{template}. Механизм отличается от кинематической цепи тем, что у него одно звено полностью закреплено - оно является основанием, на другом конце расположено исполнительное устройство. Закрепленное звено теряет все шесть степеней свободы, поэтому в механизме число подвижных звеньев на 1 меньше. Таким образом, для рассматриваемого в данной дипломной работе четырёхзвенного манипулятора количество подвижных звеньев равно трём.\\\indent Звенья робота соединяются посредством вращательных шарниров, которые оставляют звеньям лишь одну степень свободы в относительном движении. Следовательно, можно задать положение одного звена относительно другого с помощью угла поворота. Для четырёхзвенного манипулятора вектором обобщённых координат называют вектор $(q_1, q_2, q_3)$, где каждая обобщённая координата $q_i$ представляет собой угол поворота $i$-го звена относительно $(i-1)$-го. Число независимых обобщённых координат, однозначно определяющее положение звеньев механизма, равняется числу $v$ -- степени подвижности механизма, которое определяется по формуле: \begin{equation} \label{math/6} v = 6n - \sum_{i=1}^{n} ip_i , \end{equation} где n -- число подвижных звеньев, $p_i$ -- число кинематических пар i-го класса. Номер класса кинематической пары равен числу S связей, накладываемых на относительное движение звеньев, соединенных в кинематическую пару. Оно находится по формуле: \begin{equation} \label{math/7} S = 6 - h, \end{equation} где h -- число степеней свободы кинематической пары.\\\indent Для рассматриваемого в данной работе манипулятора у каждой кинематической пары механизма по одной степени свободы, соответственно на движение звеньев каждой кинематической пары механизма накладывается $6-1=5$ ~(\ref{math/7}) связей. Число подвижных звеньев манипулятора равно трём, поэтому формула~(\ref{math/6}) для нахождения числа степеней подвижности кинематической цепи будет выглядеть так: \[v = 6 * 3 - 5 * 3 = 3. \] Величина $v$ показывает, скольким звеньям необходимо задать закон движения, следовательно для рассматриваемого манипулятора необходимо определить закон движения для всех трёх подвижных звеньев. Положение исполнительного устройства полностью задаётся положением всех остальных звеньев. В то же время, если рассматривать исполнительный орган как свободное твёрдое тело, его положение определяется шестью параметрами. Из этого можно сделать вывод, что существуют такие положения исполнительного устройства, которые никаким выбором задаваемых для каждого звена обобщённых координат обеспечить невозможно. \subsection[Определение положений звеньев с помощью однородных координат, векторов и преобразований]{\large Определение положений звеньев с помощью однородных координат, векторов и преобразований} \hspace{\parindent} При работе механизма все его звенья, за исключением неподвижного, перемещаются и в каждый момент времени занимают определённые положения. Чтобы вычисления были менее громоздкими, для задания положения звеньев манипулятора будут использоваться однородные координаты. Для точки с декартовыми координатами (a, b, c) однородные координаты -- это четвёрка чисел (x, y, z, w) такая, что: \[x = aw, y = bw, z = cw; \] \[x^2 + y^2 + z^2 + w^2 \ne 0. \] Таким образом, любой точке декартового пространства можно поставить в соответствие однородные координаты, но обратное неверно, если не исключить случай $w = 0$.\\\indent Однородный вектор задаётся аналогично обычному, то есть если однородные координаты точки представлены четвёркой $(a, b, c, d)$, то соответствующий однородный вектор имеет вид $p = (a, b, c, d)$. Для случае $d=0$ будем считать, что точка с такими координатами бесконечно удалена в направлении вектора (a, b, c). Покажем, как задаются стандартные операции: сложение, умножение на скаляр, скалярное и векторное умножения, вычисление длины вектора -- для однородных векторов.\\\indent Сложение и скалярное произведение: \[ v_1 = (x_1, y_1, z_1, w_1),\\\indent v_2 = (x_2, y_2, z_2, w_2),\\\indent w_1, w_2 \ne 0, \] \[ v_1 + v_2 = (\frac{x_1}{w_1}+\frac{x_2}{w_2}, \frac{y_1}{w_1}+\frac{y_2}{w_2}, \frac{z_1}{w_1}+\frac{z_2}{w_2}, 1), \] \[ (v_1, v_2) = \frac{x_1 x_2+y_1 y_2+z_1 z_2}{w_1 w_2}. \] Векторное умножение: \[ v_1 = (x_1, y_1, z_1, w_1),\\\indent v_2 = (x_2, y_2, z_2, w_2),\\\indent \] \[ v_1 \times v_2 = (y_1 z_2-z_1 y_2, z_1 x_2-x_1 z_2, x_1 y_2-y_1 x_2, w_1 w_2). \] Умножение на скаляр и вычисление длины: \[ v = (x, y, z, w),\\\indent \] \[ \lambda v = (\lambda x, \lambda y, \lambda z, w), \] \[ |v| = \frac{\sqrt{x^2+y^2+c^2}}{|w|}. \] \\\indentКаждое из звеньев манипулятора в свободном движении имеет 6 степеней свободы, поэтому их положение относительно некоторой абсолютной системы координат можно полностью задать с помощью шести параметров. Жестко свяжем с каждым из звеньев некоторую подвижную систему координат и, определив её положение относительно абсолютной системы координат, связанной с неподвижным основанием, зададим положение соответствующего звена. Требуемые шесть параметров можно интерпретировать следующим образом: три из них будут определять координаты начала конкретной подвижной системы координат относительно абсолютной, оставшиеся три -- углы, задающие ориентацию подвижной системы координат относительно абсолютной (Рис. \ref{ris:sksk}). \begin{figure}[h] \center{\includegraphics[width=0.7\linewidth]{sk2.png}} \caption{Положение звена в пространстве, заданное связанной с ним системой координат $O_1 U V W$} \label{ris:sksk} \end{figure} \\\indentВзаимное расположение некоторой подвижной системы координат $O_1 U V W$, соответствующей какому-либо звену, и абсолютной системы координат $O_0 X_0 Y_0 Z_0$ можно задать с помощью следующей матрицы: \begin{equation} \label{math/8} T = \left( \begin{array}{lcr} R & p \\ f & m \end{array} \right) = \left( \begin{array}{lccr} r_{11} & r_{12} & r_{13} & p_1 \\ r_{21} & r_{22} & r_{23} & p_2 \\ r_{31} & r_{32} & r_{33} & p_3 \\ f_1 & f_2 & f_3 & 1 \end{array}\right), \end{equation} где $R$ -- матрица поворота размерности $3\times3$, $p$ -- вектор переноса, $f$ -- вектор центрального проектирования, $m$ -- коэффициент масштабирования. Для рассматриваемых в данной работе задач выполнять центральное проектирование не потребуется, поэтому во всех соотношениях $f = (0, 0, 0)$.\\\indent С использованием однородных координат операции вращения и переноса выполняются за одно матричное умножение, в отличие от случая с декартовыми координатами, в этом и заключается основное их удобство. \subsection[Система координат Денавита-Хартенберга]{\large Система координат Денавита-Хартенберга} \hspace{\parindent} Сложность определения положения и ориентации звена сильно зависит от выбора соотнесённой со звеном системы координат. В случае обычной системы координат потребовалось бы использовать шесть параметров для определения позиции некоторого звена относительно предыдущего. Однако, с помощью системы координат Денавита-Хартенберга можно обойтись лишь четырьмя параметрами. Это достигается благодаря введению двух ограничений. Во-первых, ось $x_j$ должна быть перпендикулярна оси $z_{j-1}$. Во-вторых, ось $x_j$ пересекается с осью $z_{j-1}$. Стоит отметить, что для рассматриваемого в данной работе манипулятора построить систему координат Денавита-Хартенберга можно несколькими способами \cite{difdh}, поэтому существует несколько различных нотаций, определяющих параметры Денавита-Хартенберга немного по-разному.\\\indent Построение системы координат Денавита-Хартенберга происходит по следующему алгоритму:\\\indent 1. Построение абсолютной системы координат (СК): правая ортогональная СК, ось $Z_0$ направлена вдоль оси первого сочленения в направлении схвата.\\\indent 2. Инициализация и задание цикла — для всех звеньев выполняются шаги 3–6.\\\indent 3. Построение оси $Z_i$ - ось направлена вдоль $(i + 1)$-го узла. Если рассматривается схват, то направляем $Z_i$ вдоль оси схвата по направлению к предыдущему звену.\\\indent 4. Построение начала $i$-й СК: начало системы координат лежит в точке пересечения $Z_{i−1}$ и $Z_i$, либо, если они не пересекаются, в точке пересечения $Z_i$ и общей нормали $Z_{i−1}$ и $Z_i$.\\\indent 5. Построение оси $X_i$ : направить ось $X$ вдоль общей нормали $Z_{i−1}$ и $Z_i$.\\\indent 6. Построение оси $Y_i$ : направить ось так, чтобы получившаяся система координат была правосторонней.\\\indent 7. Для $i = 1,...,N$ выполнить шаги 8–11.\\\indent 8. Нахождение $d_i$ . Параметр равен расстоянию между точкой пересечения $(i − 1)$-й СК и точкой пересечения осей $Z_{i−1}$ и $X_i$.\\\indent 9. Нахождение $a_i$ путём вычисления расстояния от точки пересечения осей $Z_{i−1}$ и $X_i$ до начала $i$-й СК.\\\indent 10. Найти параметр $q_i$ , равный углу поворота $X_{i−1}$ вокруг $Z_i$ до совпадения $X_{i−1}$ с $X_i$. Если обрабатываемое сочленение вращательное, то $q$ - обобщённая координата.\\\indent 11. Нахождение $b_i$ , которое равно углу поворота $Z_{i−1}$ вокруг $X_i$ до её совпадения с $Z_i$.\\\indent Числа $d$, $a$, $q$ и $b$ полностью задают расположение каждого звена относительно предыдущего, причём параметр $q$ является обобщённой координатой, так как в рассматриваемом манипуляторе присутствуют только вращательные соединения. \subsection[Описание конструкции манипулятора]{\large Описание конструкции манипулятора} \hspace{\parindent} Манипулятор состоит из четырёх звеньев (Рис. \ref{ris:puma}). Первое звено -- основание -- неподвижно. Второе звено может поворачиваться в горизонтальной плоскости на угол 320°, третье -- в вертикальной плоскости на 250°, а четвёртое -- также в вертикальной плоскисти, но уже на 270° \cite{puma}. На конце четвёртого звена находится исполнительное устройство, ориентация которого в данной работе учитываться не будет ввиду сложности данной задачи. \begin{figure}[h] \center{\includegraphics[width=0.6\linewidth]{puma.png}} \caption{Манипулятор PUMA-560} \label{ris:puma} \end{figure} В соответствии с конструкцией манипулятора и построенной системой координат параметры Денавита-Хартенберга определяются таблицей \ref{tab:tab1}. \begin{table}[h] \begin{center} \caption{Параметры Денавита-Хартенберга для робота PUMA-560 \cite{8}}\label{tab:tab1} \end{center} \begin{center} \begin{tabular}{ |c|c|c|c|c|c|c| } \hline Номер звена & d, см. & a, см. & q, ° & b ° & Мин. угол, ° & Макс. угол, ° \\ \hline 1 & 0 & 0 & 90 & -90 & -160 & 160\\ \hline 2 & 14,909 & 43,18 & 0 & 0 & -215 & 35\\ \hline 3 & 0 & 2,03 & 90 & 90 & -45 & 225\\ \hline 4 & 43,307 & 0 & 0 & -90 & 0 & 0 \\ \hline \end{tabular} \end{center} \end{table} При этом параметр $q_i$ является обобщённой координатой, и в таблице для каждого $q_i$ указаны начальные значения. \hspace{\parindent} \subsection[Нейроуправление]{\large Нейроуправление} \subsubsection[Сравнение с другими видами управления]{\large Сравнение с другими видами управления} \hspace{\parindent} Одним из наиболее широко распространённых методов управления является управление с помощью пропорционально-интегрально-дифференциальных регуляторов (PID-контроллеров). В этих контроллерах существует возможнось изменять три параметра и, таким образом, влиять на качество управления. К их плюсам можно отнести простоту и надёжность, а к минусам -- необходимость тщательного контроля и перепрограммирования при изменении требований к выполнению работы, а также плохую применимость в условиях необходимости работы в режиме реального времени, так как в процессе управления требуется выполнять достаточно сложные вычисления. \\\indentАльтернативой являются интеллектуальные системы, основанные на методах экспертных систем, нечёткой логики, генетических алгоритмов или искусственных нейронных сетей. Основными преимуществами нейроуправления являются способность к обучению, возможность распараллеливания, нелинейность, распределённость и отказоустойчивость \cite{omatu}. Следует отметить, что на обучение нейронной сети тратится достаточно большое количество времени, но зато, будучи уже обученной, нейронная сеть вполне применима в системах, где необходимо управление в режиме реального времени. \\\indentИскуственная нейронная сеть -- это распределённый параллельный процессор, состоящий из элементарных единиц обработки информации (нейронов), накапливающих экспериментальные знания и предоставляющих их для последующей обработки. При этом для накопления знаний используются связи между нейронами, называемые синаптическими весами. Нейронная сеть не программируется, она обучается. Смысл обучения состоит в том, чтобы определённым образом расставить синаптические веса и таким образом обеспечить требуемую структуру взаимосвязи нейронов \cite{haikin}. \subsubsection[Принцип работы искусственных нейронных сетей]{\large Принцип работы искусственных нейронных сетей} \hspace{\parindent}Ниже представлена одна из моделей нейрона, используемых в искуственных нейронных сетях (Рис. \ref{ris:neuron}). В ней можно выделить три основных элемента: синаптические связи между нейронами, каждая из которых характеризуется определённым весом, сумматор, выполняющий сложение всех входных сигналов, умноженных на соответствующие синаптические веса, и функцию активации, которая ограничивает результат сумматора и результатом выполнения которой является выходной сигнал. Также в модели существует пороговый элемент, отвечающий за увеличение или уменьшение величины сигнала, подаваемого на вход функции активации. \begin{figure}[h] \center{\includegraphics[width=1.0\linewidth]{neuron.png}} \caption{Нелинейная модель нейрона} \label{ris:neuron} \end{figure} Для некоторого нейрона k обозначим через $x_1, x_2,..., x_m$ -- входные сигналы, $w_{k_1}, w_{k_2},..., w_{k_m}$ -- соответствующие им синаптические веса, $u_k$ -- результат сумматора (линейную комбинацию входных воздействий), $b_k$ -- пороговый элемент, $\varphi (\cdot)$ -- функцию активации и $y_k$ -- выходной сигнал. Тогда нейрон функционирует по следующим правилам: \begin{equation} \label{math/11} u_k = \sum_{j=1}^{m} w_{kj} x_j, \end{equation} \begin{equation} \label{math/12} y_k = \varphi (u_k+b_k). \end{equation} Роль функции активации могут играть различные функции. Чаще всего используются функция Хэвисайда, кусочно-линейная или сигмоидальная функции (Рис. \ref{ris:func}).\\\indent \begin{figure}[h] \center{\includegraphics[width=0.4\linewidth]{funca.png}} \center{\includegraphics[width=0.4\linewidth]{funcb.png}} \center{\includegraphics[width=0.4\linewidth]{funcc.png}} \caption{Виды активационных функций: а) функция Хэвисайда, б) кусочно-линейная, в) сигмоидальная} \label{ris:func} \end{figure} Структура сети также может быть различна. Выделяют три основных класса: однослойные сети прямого распространения, многослойные сети прямого распространения и реккурентные сети. В первом случае имеется только два слоя нейронов: входной и выходной, причём информация от первого передаётся ко второму, но не наоборот. В случае многослойных сетей прямого распространения (Рис. \ref{ris:architecture}) между входным и выходным слоями добавляется один или несколько так называемых скрытых слоёв, таким образом, появляется возможность выделять статистики высокого порядка. Если все узлы каждого слоя соединены со всеми узлами смежных слоёв, сеть называется полносвязной. \begin{figure}[h] \center{\includegraphics[width=0.4\linewidth]{architecture.png}} \caption{Полносвязная сеть прямого распространения с одним скрытым слоем} \label{ris:architecture} \end{figure} Сигналы в таких сетях передаются по очереди: от нейронов первого слоя к нейронам второго, от второго слоя к третьему и т. д. Рекуррентные сети отличаются от сетей прямого распространения существующими обратными связями. Это означает, что выходной сигнал некоторого нейрона может подаваться на вход нейронам этого же или предыдущего уровней.\\\indent Существует два типа примеров, используемых для обучения сети: маркируемые и немаркируемые. В первом случае входному сигналу соответствует желаемый отклик, а во втором - имеется лишь набор различных реализаций одного входного сигнала. Обучающей выборкой называют множество пар, состоящих из входного сигнала и соответствующего ему выходного сигнала. Информация в нейронной сети заданной архитектуры представляется с помощью синаптических весов и пороговых элементов. Вопрос представления информации достаточно сложен и неоднозначен, но есть некоторые правила. Во-первых, близкие входные сигналы должны формировать единое представление в сети. Степень близости можно определять по-разному, например, с помощью Евклидова расстояния или скалярного произведения. Во-вторых, далёкие входные сигналы должны иметь как можно более различные представления в сети. В-третьих, для представления важной информации необходимо использовать достаточно большое количество нейронов. \subsubsection[Алгоритм обучения нейронной сети]{\large Алгоритм обучения нейронной сети} \hspace{\parindent} Обучение нейронной сети во всех алгоритмах происходит по следующему принципу: из внешней среды поступают стимулы, в результате чего меняются свободные параметры сети, и после этого сеть отвечает на возбуждения уже иначе. Друг от друг алгоритмы отличаются лишь способом настройки синаптических весов. Способ связи обучаемой сети с внешним миром определяет парадигму обучения: обучение с учителем или без. Первая парадигма подразумевает использование маркируемых примеров, вторая -- немаркируемых. В работе будут использоваться маркируемые примеры, поэтому остановимся на рассмотрении первого метода. В обучении с учителем на основе маркируемых примеров изменение синаптических весов осуществляется следующим образом. Для каждого вектора входных данных нейронной сети передаётся желаемый отклик. Между ним и фактическим откликом находится разность, называемая сигналом ошибки, после чего происходит пошаговая корректировка синаптических весов, нацеленная на минимизацию разности входного и выходного сигналов (Рис. \ref{ris:teacher}). \begin{figure}[h] \center{\includegraphics[width=0.6\linewidth]{teacher.png}} \caption{Блочная диаграмма обучения с учителем} \label{ris:teacher} \end{figure} \\\indentОдним из наиболее распространённых алгоритмов для обучения многослойных сетей прямого распространения является алгоритм обратного распространения ошибки. Пронумеруем, начиная с единицы, все слои сети по направлению от входного к выходному и нейроны в каждом из них. Пусть всего слоёв $M$, а $N_s$ -- число нейронов в $s$-м слое. Обозначим через $w^{i}_{j,k} (n)$ синаптический вес ребра, соединяющего $j$-й нейрон $i$-го слоя с $k$-м нейроном $i+1$-го слоя при обработке $n$-го маркированного примера ($n = 1,...,P$, где $P$ -- общее число примеров), $O^i_j (n)$ -- фактический результат, полученный на выходе $j$-го нейрона $i$-го слоя (входные данные будем рассматривать как выходы нейронов нулевого слоя), а $t^i_j$ -- желаемый отклик. Тогда ошибка для $n$-го обучающего примера на $j$-м нейроне выходного слоя $e^{M-1}_j (n) = t^{M-1}_j - O^{M-1}_j (n)$. Мера ошибки $n$-го обучающего примера будет равна: \[ E (n) = \frac{1}{2} \sum_{j=1}^{N_M} (t^{M-1}_j - O^{M-1}_j (n))^2. \] Общая мера ошибки находится по формуле: \[ E = \sum_{n=1}^{P} E (n). \] Алгоритм строится на основе метода наискорейшего спуска и состоит в применении к синаптическому весу $w^{i}_{j,k} (n)$ коррекции по так называемому дельта-правилу: \begin{equation} \label{math/13} w^{i}_{j,k} (n+1) = w^{i}_{j,k} (n) - \eta \frac {\partial E_p}{\partial w^{i}_{j,k} (n)}, \end{equation} где $0 < \eta $ -- коэффициент скорости обучения. Чем меньше этот коэффициент, тем меньше на каждой итерации корректируются синаптические веса, тем более гладкой является траектория в пространстве весов, но процесс обучения замедляется. Если же увеличить $\eta$ для повышения скорости обучения, большие изменения синаптических весов могут привести систему в неустойчивое состояние. Таким образом, чтобы повысить скорость обучения, не теряя при этом устойчивости, используется обобщённое дельта-правило, получаемое из дельта-правила добавлением момента инерции: \[ \Delta w^{i}_{j,k} (n) = w^{i}_{j,k} (n) - w^{i}_{j,k} (n-1), \] \begin{equation} \label{math/14} \Delta w^{i}_{j,k} (n) = \alpha \Delta w^{i}_{j,k} (n-1) - \eta \frac {\partial E_p}{\partial w^{i}_{j,k} (n)}, \end{equation} где $\alpha$ - положительное значение, называемое постоянной момента. Следует отметить, что сигнал ошибки направлен противоположно функциональному сигналу, откуда и название алгоритма.\\\indent Обозначим через $S^i_k (n) = \sum_{j=1}^{N_{i-1}} w^{i}_{j, k} (n) O^{i}_k (n)$. Заметим, что: \[ \frac {\partial E (n)}{\partial w^{i}_{j,k} (n)} = \frac {\partial E (n)}{\partial S^i_k (n)} \frac {\partial S^i_k (n)}{\partial w^{i}_{i,j} (n)} = \frac {\partial E (n)}{\partial S^i_k (n)} O^{i-1}_j (n) \] Введём обозначение для локального градиента узлов сети: \[ \delta^{i}_k (n) = -\frac {1}{2} \frac {\partial E (n)}{\partial S^i_k (n)} \] Получится равенство: \[ \frac {\partial E (n)}{\partial w^{i}_{j,k} (n)} = -2 \delta^i_k (n) O^{i-1}_j (n) \] Таким образом, коррекцию синаптического веса с помощью введённых обозначений можно записать иначе: \[ w^{i}_{j,k} (n+1) = w^{i}_{j,k} (n) + 2 \delta^i_k (n) O^{i-1}_j (n) \] Для выходного и скрытых слоёв величина $\delta^i_k (n)$ рассчитывается по-разному, потому что для выходного слоя известен желаемый отклик, а для скрытого -- нет. В случае выходного слоя получается: \[ \delta^{M-1}_k (n) = -\frac {1}{2} \frac {\partial E (n)}{\partial S^{M-1}_k (n)} = e^{M-1}_k (n) f^{'} (S^{M-1}_k (n)), \] где f -- выбранная функция активации. Для скрытого же нейрона сигнал ошибки должен вычисляться на основе сигналов ошибки всех нейронов, с которыми связан. Для нейрона под номером i: \[ \delta^{i}_k (n) = f^{'} (S^{i}_k (n)) \sum_{m=1}^{N_{i+1}} \delta^{i+1}_{m} (n) w^{i+1}_{k,m} (n) \] Таким образом, алгоритм состоит из следующих стадий:\\\indent 1. Инициализация, на которой с помощью датчика равномерно распределённых чисел генерируются синаптические веса со средним значением 0.\\\indent 2. Предъявление обучающих примеров из обучающего множества, для каждого из которых последовательно выполняются прямой и обратный проходы. В общем случае сети многократно предъявляется обучающее множество, прии этом один полный цикл представления сети всех примеров называется эпохой. При этом от эпохи к эпохе случайным образом меняется порядок примеров, чтобы поиск в пространстве весов был стохастическим. Существует два режима обучения: последовательный и пакетный. В первом случае синаптические веса корректируются после подачи каждого примера, во-втором -- после подачи эпохи.\\\indent 3. Прямой проход, на котором на основе синаптических весов последовательно для всех нейронов вычисляются активационные функции и, таким образом, вычисляется фактический отклик и сигнал ошибки.\\\indent 4. Обратный проход, когда вычисляются локальные градиенты узлов сети и с их помощью по дельта-правилу корректируются синаптические веса.\\\indent 5. Все обучающие примеры предъявляются сети, пока не будет достигнут критерий останова. Критерием сходимости является достаточно малая абсолютная интенсивность изменений среднеквадратической ошибки в течение эпохи. Обычно интенсивность изменений среднеквадратической ошибки считается достаточно малой, если лежит в пределах $0,1-1 \%$ за эпоху. \clearpage \newpage \section[Разработка системы нейроуправления]{\large \centering Разработка системы нейроуправления} \hspace{\parindent} Для начала определим, каким образом будет осуществляться нейроуправление манипулятором. Смысл управления в том, чтобы согласно требуемой траектории менять значение управляющих параметров - углов сочленений - соответственно. Решить задачу управления можно следующим образом: траектория представляется в виде множества точек, и для каждой из них с помощью нейронной сети решается обратная задача кинематики. \\\indentДля того чтобы научить нейронную сеть по заданному положению исполнительного устройства находить значения управляющих параметров, необходимо предварительно проделать некоторые вспомогательные вычисления. Во-первых, нужно определить рабочую зону манипулятора, чтобы не выходить за её границы. Во-вторых, требуется для точек рабочего пространства научиться аналитически решать лишённую неоднозначности прямую задачу кинематики. Это потребуется для создания обучающего множества. В-третьих, решим также, аналитически обратную задачу, но лишь для того, чтобы иметь представление, какого рода функцию нейронная сеть будет аппроксимировать. \subsection[Рабочее пространство манипулятора]{\large Рабочее пространство манипулятора} \hspace{\parindent} Рабочее пространство манипуляционного робота — это пространство, в котором может находиться исполнительное устройство при функционировании манипулятора. Рабочее пространство манипулятора PUMA-560 имеет форму, изображённую на рисунке \ref{ris:workspace}. Оно представляет собой сферу радиуса $R = \sqrt{L_1^2 + (L_2+L_3)^2} = 865$ мм. с вырезанным цилиндром по оси $Z$ радиуса $L_1$, где $L_i$ -- длина $i$-го звена.\\\indent \begin{figure}[h] \center{\includegraphics[width=0.9\linewidth]{workspace.png}} \caption{Рабочее пространство манипулятора PUMA-560 \cite{6}} \label{ris:workspace} \end{figure} \subsection[Решение прямой задачи кинематики]{\large Решение прямой задачи кинематики} \hspace{\parindent} Прямая кинематическая задача состоит в том, чтобы по заданному вектору обобщённых координат найти положение и ориентацию исполнительного органа. Пусть $A_i, i=1, ..., N$ -- матрицы, задающие переход от системы координат i-го звена к системе кординат (i-1)-го. В таком случае матрица: \begin{equation} \label{math:9} T_N = A_1 A_2 ... A_N \end{equation} будет искомой.\\\indent Исходя из алгоритма построения системы координат Денавита-Хартенберга, матрица $A_i$ является произведением двух матриц сдвига и двух -- поворота. За поворот вокруг оси $Z_{i-1}$ на угол $q_i$ отвечает матрица: \[ \left( \begin{array}{cccr} & & & 0 \\ & R_{Z,q_i} & & 0\\ & & & 0\\ 0 & 0 & 0 & 1 \end{array} \right), \] за сдвиг вдоль оси $Z_{i-1}$ на $d_i$: \[ \left( \begin{array}{cccr} & & & 0 \\ & E & & 0\\ & & & d_i\\ 0 & 0 & 0 & 1 \end{array} \right), \] за сдвиг вдоль оси $X_{i-1}$ на $a_i$: \[ \left( \begin{array}{cccr} & & & a_i \\ & E & & 0\\ & & & 0\\ 0 & 0 & 0 & 1 \end{array} \right), \] и за поворот вокруг оси $X_{i-1}$ на угол $b_i$: \[ \left( \begin{array}{cccr} & & & 0 \\ & R_{X,b_i} & & 0\\ & & & 0\\ 0 & 0 & 0 & 1 \end{array} \right). \] Таким образом матрица $A_i$ имеет вид: \[ A_i = \left( \begin{array}{cccr} & & & 0 \\ & R_{Z,q_i} & & 0\\ & & & 0\\ 0 & 0 & 0 & 1 \end{array} \right) \left( \begin{array}{cccr} & & & 0 \\ & E & & 0\\ & & & d_i\\ 0 & 0 & 0 & 1 \end{array} \right) \left( \begin{array}{cccr} & & & a_i \\ & E & & 0\\ & & & 0\\ 0 & 0 & 0 & 1 \end{array} \right) \left( \begin{array}{cccr} & & & 0 \\ & R_{X,b_i} & & 0\\ & & & 0\\ 0 & 0 & 0 & 1 \end{array} \right). \] После перемножения матриц в правой части равенства получаем: \begin{equation} \label{math:10} A_i = \left( \begin{array}{cccr} cos(q_i) & -cos(b_i) sin(q_i) & sin(b_i) sin(q_i) & a_i cos(q_i) \\ sin(q_i) & cos(b_i) cos(q_i) & -sin(b_i) cos(q_i) & a_i sin(q_i)\\ 0 & sin(b_i) & cos(b_i) & d_i\\ 0 & 0 & 0 & 1 \end{array} \right). \end{equation} Для манипулятора была построена система координат Денавита-Хартенберга (Рис. \ref{ris:skdh}) и найдены параметры $a_i, q_i, d_i, b_i$. Для конкретных значений параметров $a, d, q, b$ получим по формуле (\ref{math:10}) матрицы $A_i$: \begin{figure}[h] \center{\includegraphics[width=0.6\linewidth]{skdh2.png}} \caption{Система координат Денавита-Хартенберга для манипулятора PUMA-560 \cite{dh}} \label{ris:skdh} \end{figure} \[ A_1= \left( \begin{array}{cccr} cos(q_1) & 0 & -sin(q_1) & 0\\ sin(q_1) & 0 & cos(q_1) &0\\ 0 & -1 & 0 & 0\\ 0 & 0 & 0 & 1 \end{array} \right), \] \[ A_2= \left( \begin{array}{cccr} cos(q_2) & -sin(q_2) & 0 & a_2 cos(q_2) \\ sin(q_2) & cos(q_2) & 0 & a_2 sin (q_2) \\ 0 & 0 & 1 & d_2\\ 0 & 0 & 0 & 1 \end{array} \right) \] \[ A_3= \left( \begin{array}{cccr} cos(q_3) & 0 & sin(q_3) & a_3 cos(q_3) \\ sin(q_3) & 0 & -cos(q_3) & a_3 sin(q_3) \\ 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 \end{array} \right), \] \[ A_4= \left( \begin{array}{cccr} cos(q_4) & 0 & -sin(q_4) & 0 \\ sin(q_4) & 0 & cos(q_4) & 0 \\ 0 & -1 & 0 & d_4\\ 0 & 0 & 0 & 1 \end{array} \right). \] Перемножив в нужном порядке матрицы $A_i$, получим по формуле (\ref{math/8}) матрицу $T_i$, определяющую положение и ориентацию выбранной кинематической пары: \[ T_1= \left( \begin{array}{cccr} cos(q_1) & 0 & -sin(q_1) & 0\\ sin(q_1) & 0 & cos(q_1) &0\\ 0 & -1 & 0 & 0\\ 0 & 0 & 0 & 1 \end{array} \right), \] \[ T_2= \left( \begin{array}{cccr} cos(q_1) cos(q_2) & -cos(q_1) sin(q_2) & -sin(q_1) & a_2 cos(q_1) cos(q_2) - d2 sin(q_2) \\ sin(q_1) cos (q_2) & -sin(q_1) sin(q_2) & cos(q_1) & a_2 sin (q_1) cos(q_2) + d2 cos(q_1)\\ -sin(q_2) & -cos(q_2) & 0 & -a2 sin(q_2)\\ 0 & 0 & 0 & 1 \end{array} \right) \] \[ T_3= \left( \begin{array}{cccr} c_1 c_{23} & -c_1 s_{23} & -s_1 & a_2 c_1 c_2 - d_3 s_1 \\ s_1 c_{23} & -s_1 s_{23} & c_1 & a_2 s_1 c_2 + d_3 c_1 \\ -s_{23} & -c_{23} & 0 & -a_2 s_2\\ 0 & 0 & 0 & 1 \end{array} \right), \] где $c_i = cos(q_i), s_i = sin(q_i), c_{ij} = cos(q_i + q_j), s_{ij} = sin(q_i + q_j)$. \subsection[Решение обратной задачи кинематики]{\large \centering Решение обратной задачи кинематики} \hspace{\parindent}Обратная задача кинематики состоит в том, чтобы по заданной траектории исполнительного устройства определять значения управляющих параметров. \subsubsection[Аналитический подход]{\large Аналитический подход} \hspace{\parindent} В введённых обозначениях формулировка обратной позиционной задачи звучит следующим образом: при заданном положении и ориентации исполнительного устройства $S=S^*$ или $T_N=T^*_N$ найти обобщенные координаты $q^* = (q^*_1, q^*_2,…,q^*_N)^T$. Обозначим $S=f_S(q)$ или $T_N(q)$, следовательно углы $q^*$ будут заданы следующим образом: $q^*=f^{-1}_S(S^*)$ или $q^* = f^{-1}_T(T^*_N)$. Таким образом, нам нужно решить нелинейную тригонометрическую систему шести уравнений с N неизвестными. Не существует общего способа решения такой системы в явном виде, но есть несколько подходов, \cite{10}:\\\indent 1. Метод обратных преобразований\\\indent 2. Тригонометрический подход\\\indent 3. Итерационный метод\\\indent Рассмотрим для начала подробнее первый метод. Матрица $T_N$ определяет положение и ориентацию исполнительного устройства и имеет вид: \[ T_N=A_1 A_2…A_{N-1} A_N, \] где $A_i=A_1(q_i)$ – матрицы перехода от $i$-й к $(i-1)$-й системе координат манипуляционного робота. Умножаем $T_N=A_1 A_2…A_{N-1} A_N$ на $A^{-1}_1$ и получаем: \[ A^{-1}_1(q_1) T_N=A_2…A_{N-1} A_N. \] Так как матрица $T_N$ известна, мы смогли разрешить $A^{-1}_1(q_1) T_N=A_2…A_{N-1} A_N$ для $q_1$. Аналогично можно найти и для $q_N$.\\\indent Теперь решим обратную задачу с помощью тригонометрического подхода, чтобы иметь представление о том, какую функцию должна будет аппроксимировать построенная нейронная сеть \cite{7}. Пусть положение исполнительного устройства определяется вектором $p = (p_x, p_y, p_z)$. Рассмотрим матрицу $T = A_1 A_2 A_3 A_4$. Её последний столбец определяет положение исполнительного устройства и равен вектору $p$. Приравняв, получим систему с тремя неизвестными $q_1, q_2, q_3$: \begin{equation} \label{math/1} \begin{split} &p_x = c_1 (a_2 c_2 + a_3 c_{23} + d_4 s_{23}) - d_2 s_1,\\ &p_y = s_1 (a_2 c_2 + a_3 c_{23} + d_4 s_{23}) + d_2 c_1,\\ &p_z = -a_2 s_2 - a_3 s_{23} + d_4 c_{23}. \end{split} \end{equation} Умножив первое уравнение на $s_1$, а второе -- на $c_1$ и просуммировав, получим: \[ -p_x s_1 + p_y c_1 = d_2. \] Данное уравнение всегда имеет решение, так как $p_x^2 + p_y^2 > d_2^2$. Решая, находим: \[ \tg{\frac{q_1}{2}} = \frac{-p_x \pm \sqrt{p_x^2 + p_y^2 + d_2^2}}{p_y + d_2}. \] Рассматривая только $-\pi \le q_1 \le \pi$, получим: \begin{equation} \label{math/2} q_1 = 2 \arctan{\frac{-p_x \pm \sqrt{p_x^2 + p_y^2 + d_2^2}}{p_y + d_2}}. \end{equation} Систему уравнений ~(\ref{math/1}) можно записать следующим образом: \begin{equation} \label{math/3} \begin{split} &a_2 c_2 + a_3 c_{23} + d_4 s_{23} = p_x c_1 + p_y s_1,\\ &-a_2 s_2 + d_4 c_{23} - s_{23} = p_z. \end{split} \end{equation} Умножим первое уравнение на $d_4$, второе -- на $d_3$ и сложим, откуда получим: \[ a_2 d_4 c_2 + a_2 a_3 s_2 + d_4^2 + a_3^2 = (p_x c_1 + p_y s_1) d_4 - p_2 a_3, \] то есть \[ a_3 s_2 + d_4 c_2 = A, \] где \[ A = \frac{1}{a^2} ((p_x c_1 + p_y s_1) d_4 - p_z d_3 - d_4^2 - a_3^2) \] известно после определения $q_1$. Откуда: \begin{equation} \label{math/4} q_2 = 2 \arctan{\frac{a_3 \pm \sqrt{a_3^2 + d_4^2 - A^2}}{A + d_4}}, -\pi \le q_2 \le \pi. \end{equation} Чтобы найти угол $q_3$, определим $s_{23}$ и $c_{23}$. Решая систему уравнений ~(\ref{math/3}) как линейную, имеем: \[ d_4 s_{23} + a_3 c_{23} = p_x c_1 + p_y s_1 - a_2 c_2, \] \[ -a_3 s_{23} + d_4 c_{23} = p_z + a_2 s_2. \] Откуда: \[ s_{23} = \frac {d_4 B - a_3 C}{d_4^2 + a_3^2}, \] \[ c_{23} = \frac {d_4 C + a_3 B}{d_4^2 + a_3^2}, \] где \[ B = p_x c_1 + p_y s_1 - a_2 c_2, \] \[ C = p_z + a_2 s_2. \] Следовательно: \begin{equation} \label{math/5} q_3 = atan2(s_{23}, c_{23}) - q_2, -\pi \le q_3 \le \pi, \end{equation} \[atan2(y, x) = \left\{ \begin{array}{ll} \arctan{\frac{y}{x}}, & \mbox{если } x > 0\\ \arctan{\frac{y}{x}} + \pi, & \mbox{если } y \ge 0, x < 0\\ \arctan{\frac{y}{x}} - \pi, & \mbox{если } y < 0, x < 0\\ +\frac{\pi}{2}, & \mbox{если } y > 0, x = 0\\ -\frac{\pi}{2}, & \mbox{если } y < 0, x = 0\\ undefined, & \mbox{если } y = 0, x = 0\\ \end{array} \right. \] Таким образом, углы $q_1, q_2, q_3$ определяются выражениями~(\ref{math/2}),~(\ref{math/3}),~(\ref{math/5}), но неоднозначно. Варьируя знаки в выражениях для нахождения $q_1$ и $q_2$ (~(\ref{math/2}) и~(\ref{math/3})) можно получить четыре различных варианта для троек углов, обеспечивающие одно и то же положение схвата: $(q_1^+, q_2^+, q_3)$, $(q_1^+, q_2^-, q_3)$, $(q_1^-, q_2^+, q_3)$, $(q_1^-, q_2^-, q_3)$. \subsubsection[Метод с использованием нейронных сетей]{\large Метод с использованием нейронных сетей} \hspace{\parindent} В данной дипломной работе не учитывается ориентация исполнительного устройства ввиду роста сложности задачи. Таким образом, задачу обратной кинематики для конкретного рассматриваемого манипулятора можно переформулировать следующим образом: по точке в декартовом пространстве с координатами $(x, y, z)$ требуется получить вектор $(q1, q2, q3)$, где $q_i$ -- это управляющий параметр $i$-го звена, то есть угол его поворота относительно начального положения.\\\indent Существует множество способов построения сети, решающей обратную кинематическую задачу. Например, на вход можно подавать 12 параметров -- первые три строки матрицы $A_i$, четыре параметра -- координаты $(x, y, z)$ и суммарный угол или, например, только 3 -- координаты $(x, y, z)$. На выходе также можно получать различные значения, например, три угла $(q1, q2, q3)$ или шесть параметров -- выдавать синус и косинус для каждого угла. Выбор представления будет влиять на производительность и точность решения. Таким образом будут рассмотрены различные конфигурации и протестированы на величину ошибки и скорость обучения.\\\indent Чтобы заставить манипулятор описать некую траекторию, эта траектория представляется в виде множества точек, каждая из которых подаётся в нейронную сеть. Сеть в ответ выдаёт список требуемых управляющих параметров для достижения исполнительным устройством данной точки. \clearpage \newpage \section[Программная реализация]{\large \centering Программная реализация} \hspace{\parindent} Всё программное обеспечение реализовано на языке Python. Чтобы оптимизировать вычисления в программе используется библиотека NumPy. \subsection[Программная реализация системы нейроуправления]{\large Программная реализация системы нейроуправления} \hspace{\parindent} Система нейроуправления включает в себя саму нейронную сеть, которая по сути определяется матрицей синаптических весов, а также функцию для её обучения. \subsubsection[Представление нейронной сети]{\large Представление нейронной сети} \hspace{\parindent}Для представления нейронной сети в программе используется класс NeuralNetwork. Конструктор класса принимает на вход четыре параметра: \begin{quote} - число нейронов во входном слое;\\ - число нейронов в скрытом слое;\\ - число нейронов в выходном слое\\ - строку, определяющую тип функции активации. \end{quote} Для тестирования с различными конфигурациями нейронной сети варьируется число нейронов во входном и выходном слоях. Число же скрытых нейронов можно варьировать, чтобы достичь оптимального обучения. Есть возможность задавать различные функции активации: \begin{quote} - линейную функцию;\\ - экспоненциальную сигмоиду;\\ - гиперболический тангенс. \end{quote} Для этого в качестве четвёртого параметра на вход конструктору необходимо передать строку 'linear', 'sigmoid' или 'tahn' соответственно. По умолчанию используется экспоненциальная сигмоида. \\\indentВ классе NeuralNetwork присутствуют поля и методы, представленные в таблицах \ref{tab:tab6} и \ref{tab:tab7}. \begin{table}[h] \begin{center} \caption{Поля класса NeuralNetwork}\label{tab:tab6} \end{center} \begin{center} \begin{tabular}{ |l|l| } \hline Поле & Описание\\ \hline act\_f & Строка, идентифицирующая функцию активации\\ \hline input\_array & Массив входных сигналов\\ \hline hidden\_array & Массив скрытых сигналов\\ \hline output\_array & Массив выходных сигналов\\ \hline input\_weights & Массив, хранящий синаптические веса входных сигналов\\ \hline output\_weights & Массив, хранящий синаптические веса выходных сигналов\\ \hline input\_change & Массив, хранящий значение коррекции для входных\\ &синаптических весов\\ \hline output\_change & Массив, хранящий значение коррекции для выходных\\ &синаптических весов\\ \hline \end{tabular} \end{center} \end{table} Для представления сети используются такие массивы, как input\_weights и output\_weights, которые хранят синаптические веса для входного и выходного слоёв соответственно. Первоначально они заполняются случайными числами из промежутка [-0.2, 0.2). \begin{table}[h] \begin{center} \caption{Методы класса NeuralNetwork}\label{tab:tab7} \end{center} \begin{center} \begin{tabular}{ |l|l| } \hline Метод & Описание\\ \hline act\_func & Возвращает функцию активации\\ \hline dact\_func & Возвращает производную функции активации\\ \hline activate & Осуществляет прямой проход алгоритма обратного\\ & распространения ошибки\\ \hline back\_propagation & Осуществляет обратный проход алгоритма обратного\\ & распространения ошибки\\ \hline train & Осуществляет обучение сети\\ \hline \end{tabular} \end{center} \end{table} Методы act\_func и dact\_func принимают на вход число и возвращают соответственно значение активационной функции и её производную в зависимости от параметра, определяющего тип функции. \\\indentПрямой проход алгоритма обратного распространения ошибки реализован в методе activate, принимающем на вход список входных сигналов и возращающем массив выходных сигналов (листинг~\ref{list:2}). { \singlespacing \lstset{tabsize = 4} \begin{lstlisting}[label=list:2, caption=Метод activate класса NeuralNetwork] def activate(self, input): for i in range(self.input_n-1): self.input_array[i] = input[i] for j in range(self.hidden_n): sum = 0. for i in range(self.input_n): sum = sum + self.input_array[i]*self.input_weights[i, j] self.hidden_array[j] = self.act_func(sum) for k in range(self.output_n): sum = 0. for j in range(self.hidden_n): sum = sum + self.hidden_array[j]*self.output_weights[j, k] self.output_array[k] = self.act_func(sum) return self.output_array \end{lstlisting} } Обратный проход алгоритма обратного распространения ошибки реализован в методе back\_propagation. Он принимает на вход список желаемых сигналов, параметры сети: eta, отвечающий за скорость обучения, постоянную момента alpha - и возращает значение ошибки (листинг~\ref{list:backprop}). { \singlespacing \lstset{tabsize = 4} \begin{lstlisting}[label=list:backprop, caption=Метод back\_propagation класса NeuralNetwork] def back_propagation(self, targets, eta, alpha): output_deltas = np.zeros(self.output_n) for i in range(self.output_n): error = targets[i]-self.output_array[i] output_deltas[i] = self.dact_func(self.output_array[i]) * error hidden_deltas = np.zeros(self.hidden_n) for j in range(self.hidden_n): error = 0. for k in range(self.output_n): error = error + output_deltas[k]*self.output_weights[j, k] hidden_deltas[j] = self.dact_func(self.hidden_array[j]) * error for j in range(self.hidden_n): for k in range(self.output_n): change = output_deltas[k]*self.hidden_array[j] self.output_weights[j, k] += eta*change + alpha*self.output_change[j, k] self.output_change[j, k] = change for i in range(self.input_n): for j in range(self.hidden_n): change = hidden_deltas[j]*self.input_array[i] self.input_weights[i, j] += eta*change + alpha*self.input_change[i, j] self.input_change[i, j] = change error = 0. for i in range(len(targets)): error = error + 0.5*(targets[i]-self.output_array[i])**2 return error \end{lstlisting} } За обучение сети отвечает метод train. Ему на вход подаётся массив обучающих примеров, требуемое число эпох и всё те же параметры сети eta и alpha. Возвращает он значение среднеквадратической ошибки. По умолчанию число эпох равно 1000, параметр eta -- 0,5, а параметр alpha -- 0,1. \subsubsection[Обучение нейронной сети]{\large Обучение нейронной сети} \hspace{\parindent} Для начала отметим, что область определения и область значений используемых активационных функций лежит в интервале [-1, 1]. Таким образом, входные сигналы и желаемые отклики нейронной сети необходимо нормализовать \cite{9}. Данные нормализуются по формуле: \[ A_{norm} = \frac{(A-A_{min})}{(A_{max}-A_{min})}, \] где $A_{min}$ и $A_{max}$ – минимально и максимально допустимые значения нормализуемого параметра $A$. Для начальной тестовой конфигурации нейронной сети в качестве входных сигналов подаются координаты исполнительного устройства $(x, y, z)$. Координаты $x$ и $y$ лежат в интервале $[-865, -149.09] \cup [149.09, 865]$, а $z$ -- в интервале $[-865, 865]$, поскольку рабочее пространство манипулятора представляет собой сферу радиуса $R = \sqrt{L_1^2 + (L_2+L_3)^2} = 865$ мм. с вырезанным цилиндром по оси $Z$ радиуса $L_1$, где $L_i$ -- длина $i$-го звена.\\\indent Создание обучающего множества осуществляется с помощью функции generate\_examples. Управляющие углы меняются в цикле с шагом в 15 градусов, и для каждой тройки $(q_1, q_2, q_3)$ решается прямая задача -- находится тройка (x, y, z) координат исполнительного устройства. Таким образом генерируется обучающее множество для нейронной сети. Уменьшение шага приводит к слишком большому времени работы алгоритма, а увеличение -- к сильному снижению точности. \subsection[Визуализация]{\large \centering Визуализация} \hspace{\parindent} Для визуализации используется библиотека Pyglet, которая поддерживает графику OpenGl. Существует множество других средств по созданию анимации, работающих в связке с Python, например PyOpenGl, но у выбранной библиотеки есть преимущество -- у неё очень понятная и подробная документация. OpenGl -- это кроссплатформенный программный интерфейс для работы с 2D и 3D графикой. По сути - это набор функций, позволяющий указать графическому процессору, что необходимо отобразить на экране. \subsubsection[Формат файла для представления модели]{\large Формат файла для представления модели} \hspace{\parindent}Для достаточно реалистичной отрисовки робота PUMA-560 разумно воспользоваться готовой моделью, а не пытаться создавать эту модель программно. За долгую долгую историю развития систем автоматизированного проектирования было разработано множество форматов файлов для представления полигональных моделей. Одним из таких форматов является открытый формат файлов описания геометрии OBJ, разработанный компанией Wavefront Technologies для анимационного пакета Advanced Visualizer. Формат файла OBJ является текстовым форматом и содержит следующие элементы: \begin{quote} - определение вершин в формате: \begin{tabbing} v\quad\=x\quad\=y\quad\= z\quad\= w \end{tabbing} - определение текстурных координат в формате: \begin{tabbing} vt\quad\=s\quad\=t\quad\=w \end{tabbing} - определение нормалей в формате: \begin{tabbing} vn\quad\=nx\quad\=ny\quad\=nz \end{tabbing} - определение граней в формате (грани задаются последовательностью вершин, для каждой из которых заданы координаты, текстурные координаты и нормаль через указание индекса в соответствующем перечислении): \begin{tabbing} f\quad\=v1/vt1/vn1\quad\=v2/vt2/vn2\quad\=v3/vt3/vn3\quad\= ... \end{tabbing} - информацию о принадлежности граней определенному объекту;\\ - информацию о неполигональных поверхностях;\\ - информацию о внешнем виде объектов (материалы), которая передается в файлах-спутниках в формате MTL (Material Library);\\ - комментарии. \end{quote} Вершины, текстурные координаты и нормали имеют сквозную нумерацию во всём файле, начиная с единицы, что необходимо учитывать при построении граней. Каждый элемент файла располагается на отдельной строке, что обеспечивает возможность просмотра и даже ручного редактирования при необходимости. \subsubsection[Представление модели]{\large Представление модели} \hspace{\parindent}Для представления геометрической модели в памяти необходима структура данных, содержащая следующие элементы: \begin{quote} - массив вершин граней полигональной сетки, каждая из вершин задаётся своими однородными координатами;\\ - массив нормалей, каждый вектор задаётся своими однородными координатами;\\ - массив граней объекта. \end{quote} Каждая грань объекта задаётся: \begin{quote} - последовательностью элементов, описывающих атрибуты вершин грани: \begin{quote} - индекс вершины в массиве вершин;\\ - индекс нормали в данной вершине; \end{quote} - нормалью к грани. \end{quote} Выбранный способ хранения геометрической модели объектов, известный также как граничное полигональное представление, индексированное по вершинам, позволяет хранить единственную копию вершины или нормали в памяти, что обеспечивает два важных преимущества по сравнению с другими вариантами. Во-первых, сокращается размер памяти, необходимый для хранения модели. Во-вторых, при выполнении преобразований вершины или нормали они также будут обрабатываться однократно, независимо от того, сколько граней используют данную вершину или нормаль. \subsubsection[Загрузка модели из файла]{\large Загрузка модели из файла} \hspace{\parindent}Используемый для представления модели формат WaveFront OBJ, с одной стороны, содержит все элементы, необходимые для выбранной формы представления геометрической модели в разрабатываемой программе. С другой стороны, рассматриваемый формат является очень простым и удобным в использовании. \\\indentДля загрузки модели из файла необходимо выполнить следующие действия: \begin{quote} - сформировать массив вершин граней полигональной сетки на основе элементов v входного файла, сохраняя порядок вершин;\\ - сформировать массив нормалей на основе элементов vn входного файла, сохраняя порядок нормалей;\\ - сформировать массив граней на основе элементов f входного файла. \end{quote} Формат файла организован таким образом, что элементы различных типов могут перемежаться между собой. Однако, каждый элемент располагается на отдельной строке, поэтому при чтении очередной строки можно определить, какой тип обработки необходим, или же данный тип элемента не используется и его необходимо пропустить. \\\indentСтоит отметить, что модели могут содержать некорректно заданные элементы, например: \begin{quote} - вырожденные рёбра, то есть рёбра с совпадающими начальной и конечной вершиной (необходимо удалять);\\ - вырожденные грани, то есть грани, заданные менее, чем тремя вершинами, которые могут присутствовать изначально, либо появляться в результате удаления вырожденных рёбер. \end{quote} Отдельно нужно сказать о нормалях. Если нормали для вершин граней заданы, то, согласно спецификации формата, это будут внешние нормали (при этом, в зависимости от модели, это могут быть как усреднённые нормали, так и нормали, совпадающие с нормалью к грани). В этом случае необходимо вычислить внешнюю нормаль к грани на основании векторного произведения любых двух последовательных рёбер, и исходя из того, что вершины грани заданы в порядке обхода лицевой стороны грани против часовой стрелки. Если нормали не заданы, то опять же необходимо вычислить внешние нормали к каждой грани, на основании которых впоследствии можно вычислить и нормали в вершинах. Также нужно учитывать, что нормали, сохраненные в файле, могут быть ненормализованы. \\\indentВерификацию, вычисление и нормализацию нормалей имеет смысл выполнять однократно сразу же после загрузки модели из файла. \subsection[Запуск программы и управление]{\large Запуск программы и управление} \hspace{\parindent}В программе поддерживается три режима визуализации, переключение между которыми осуществляется по нажатию клавиши D: в первом можно непосредственно изменять управляющие параметры манипулятора. При этом переключение между активными в данный момент звеньями и соответствующими им изменяемыми сочленениями происходит с помощью клавиш влево, вправо, а увеличение-уменьшение угла -- с помощью клавиш вверх-вниз. В этом режиме демонстрируется 3D изображение. Второй режим отличается от первого тем, что, помимо 3D изображения робота, в нём отображаются три стандартные проекции. Третий же режим лишён интерактивности. Анимация в этом режиме задаётся путём указания необходимой траектории и начинается или приостанавливается по нажатию клавиши P.\\ \indentСкриншот работы программы во втором режиме показан на рисунке \ref{ris:r2}, а в третьем - на рисунке \ref{ris:r3}.\\\indent \begin{figure}[h] \center{\includegraphics[width=1.0\linewidth]{r2.png}} \caption{Скриншот работы программы в режиме 2} \label{ris:r2} \end{figure} \begin{figure}[h] \center{\includegraphics[width=0.5\linewidth]{r1.png}} \caption{Скриншот работы программы в режиме 3} \label{ris:r3} \end{figure} \clearpage \newpage \section[Тестирование]{\large \centering Тестирование} \hspace{\parindent} %Тестирование качества обучения нейросети \subsection[Зависимость качества обучения нейронной сети от её конфигурации]{\large Зависимость качества обучения нейронной сети от её конфигурации} \subsection[Влияние параметров сети и обучающего множества на скорость и точность обучения]{\large Влияние параметров сети и обучающего множества на скорость и точность обучения} \subsection[Тестирование сети на различных траекториях]{\large Тестирование сети на различных траекториях} \hspace{\parindent} \newpage \part*{\large \centering ЗАКЛЮЧЕНИЕ} \addcontentsline{toc}{part}{ЗАКЛЮЧЕНИЕ} В данной дипломной работе разработана система нейроуправления четырёхзвенным последовательным манипулятором типа PUMA-560. Для реализации управления построена математическая модель кинематики четырёхзвенного робота. Нахождение управляющих параметров осуществляется путём решения обратной задачи кинематики манипулятора с помощью нейронных сетей. Чтобы проверить точность результата, решается также прямая задача, позволяющая при заданных управляющих параметрах узнать реальные значения координат захватного органа. Эти значения являются эталонными, с ними сравниваются значения, полученные с помощью нейронной сети. Для демонстрации работы системы нейроуправления визуализировано движение робота согласно заданным математической моделью кинематическим законам. \clearpage \newpage \bibliographystyle{utf8gost705u} %% стилевой файл для оформления по ГОСТу \begin{flushleft} \bibliography{biblio} %% имя библиографической базы (bib-файла) \end{flushleft} \end{document} % конец документа