записка

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
\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} % конец документа