Uploaded by Cinokoc

Kursovaya-2

advertisement
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Ижевский государственный технический университет имени М.Т.
Калашникова»
Институт «СТМАиМ»
Кафедра «Мехатронные системы»
Работа защищена с оценкой
«
»
Дата
Подпись
/
КУРСОВАЯ РАБОТА
по дисциплине «ОВТиОСвМиР3»
на тему «Разработка трехмерной модели манипулятора в MASM32»
Выполнил
Студент гр. Б20-311-1
Кислицин Р.В.
Руководитель
Доцент, к.ф.-м.н.
Лекомцев П.В.
Рецензия:
степень достижения поставленной цели
работы
полнота разработки
темы
уровень самостоятельности работы
обучающегося
недостатки
работы
Ижевск, 2022
Содержание
Задание ............................................................................................................. 3
Введение........................................................................................................... 4
1.
Разработка алгоритма. ............................................................................. 5
1.1
Разработка математического алгоритма. ........................................... 5
1.2
Обратная задача .................................................................................... 7
1.3
Движение по траектории ..................................................................... 8
2.
Разработка схемы алгоритма. ................................................................. 9
2.1 Схемы алгоритмов процессов программы ........................................... 10
3.
Разработка программы. ......................................................................... 12
4.
Вычислительный эксперимент. ............................................................ 23
Заключение .................................................................................................... 24
Список литературы ....................................................................................... 25
Приложение А. Руководство пользователя ................................................ 26
2
Задание
Разработать алгоритм и программу, осуществляющую построение
трехмерной модели трёхзвенного манипулятора на языке программирования
ассемблер. В модели и программе предусмотреть:
1)
2)
Язык программирования – ассемблер
Управление звеньями манипулятора;
3)
Изменение точки наблюдения;
4)
Масштабирование модели;
5)
Движение выходного звена по заданной траектории;
6)
Возможность одновременного выполнения п.3,4,5 путем внесения
задач в отдельные вычислительные потоки;
7)
Справку о программе и клавишах управления.
Схема манипулятора представлена на рисунке 1. Формы звеньев
произвольные.
Форма траектории: Синусоида
Рисунок 1 – Схема манипулятора.
3
Введение
В ходе выполнения курсовой работы разработаны: алгоритм и
программа создания модели робота-манипулятора. Разработанная программа
выполнена в виде оконного приложения в среде программирования
ассемблер.
В данной работе представлены схемы алгоритмов, математические
алгоритмы
перемещения
манипулятора,
текст
программы
создания
трехмерной модели робота-манипулятора.
4
1. Разработка алгоритма.
Представим манипулятор в локальной системе координат в начальном
положении в виде массива точек на концах стрежней проволочной модели.
1.1 Разработка математического алгоритма.
Для определения положения манипулятора в пространстве необходимы
углы поворотов первого, второго и третьего звеньев. Математический
алгоритм преобразования взаимного положения звеньев представляет собой
преобразование координат с помощью матриц поворота и переноса – видового
преобразования. Далее происходит переход от мировых координат к камере
при помощи матрицы перехода. Затем осуществляется перспективное
искажение с помощью проекционной матрицы и получение экранных
координат. Преобразования координат происходят в однородной системе
координат.
Составим конечные матрицы видового преобразования для каждого
точки модели:
5
где, TL1, TL1+L2, TL1+L2+L3 – матрицы переноса с соответствующими длинами
звеньев, My – матрица поворота вокруг оси Y, MZ1, MZ2 – матрицы поворота
вокруг оси Z.
Матрица перехода от мировых координат к камерным выглядит
следующим образом:
View = Tdist ⋅ My ⋅ MX
(7)
где Tdist – матрица переноса с дистанцией до точки наблюдения, MY, MX
– матрицы поворота вокруг осей X, Y с соответствующими углами поворота
камеры.
Матрица проекции представлена в формуле (8):
6
1.2 Обратная задача
Конечные формулы для нахождения двух углов манипулятора
представлены на рисунке 2.
Рисунок 2 - Формулы для нахождения углов манипулятора
Обозначения: a – длина второго звена, c – длина третьего звена, b —
расстояние между началом второго звена и заданной точкой в пространстве;
Cx, Cy — координаты точки начала второго звена; AY, AX – координаты
заданной точки в пространстве.
7
1.3 Движение по траектории
Согласно индивидуальному заданию требуется перемещать выходную
точку конечного звена манипулятора по траектории синусоида. Внешний вид
синусоиды представлен на рисунке 3.
Синусоида – это плоская кривая, задаваемая в прямоугольных
координатах уравнением:
(9)
где a,b,с,d — постоянные.




a характеризует сдвиг графика по оси Oy. Чем больше a, тем выше
поднимается график;
b характеризует растяжение графика по оси Oy. Чем больше
увеличивается b, тем сильнее возрастает амплитуда колебаний;
с характеризует растяжение графика по оси Ox. При увеличении c частота
колебаний повышается ;
d характеризует сдвиг графика по оси Ox. При увеличении d график
двигается в отрицательном направлении оси абсцисс.
Рисунок 2 — Внешний вид синусоиды
8
Исходя
из
2. Разработка схемы алгоритма.
математического анализа, была составлена
математического
алгоритм
для
на
Рисунке
3,
блок-схема
описывающая
последовательность действий, согласно всем условиям.
Рисунок 3 – Схема алгоритма программы
9
2.1 Схема алгоритма процесса программы
Исходя из задачи, была составлена блок-схема на Рисунке 4,
описывающая последовательность действий, согласно которой выполняются
все требования.
Рисунок 4 – Схема алгоритма программы
10
Рисунок 5 – Продолжение
11
Разработка программы.
Текст программы, представлен на рисунках 6 - 15
.686:
.xmm
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc
include \masm32\include\gdi32.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
.data
AppName db "Манипулятор-ВПП", 0
sz_Wind dd 1024, 720
sz_Obj dd 100.0, 20.0, 5.0, 2.0
Platforma dd 0.0, 0.0, -20.0, 1.0
Zv_1 dd 'Z', 0.0, 0.0, 200.0, 1.0, 0.0
Zv_2 dd 'z', -60.0, 0.0, 60.0, 1.0, 0.0
Zv_3 dd 'x', -180.0, 0.0, 0.0, 1.0, 0.0
Lim_Zv_1 dd -1800.0, 1800.0, 2.0, -2.0
Lim_Zv_2 dd -160.0, 0.0, 2.0, -2.0
Lim_Zv_3 dd 0.0, 140.0, 2.0, -2.0
Lim_Zoom dd 10.0, 5.0, 20.0, 1.0, -1.0
Art_IK dd -180.0, 0.0, 200.0, 1.0
A dd 1.0
B dd 5.0
XY0 dd 512, 480
ReCalMesh dd 1
RePaint dd 0
AnimIK dd -1
Radius dd 50.0
DEG dd 0
DEG_90 dd 90.0
DEG_PI dd 180.0
Rxyz dd 6, 10, 9, 5, 0, \
8, 10, 2, 0, 5, \
1, 5, 4, 0, 10
Matr_View dd -1.0, 0.0, 0.0, 0.0, \
0.0, 0.0, 1.0, 0.0, \
0.0, -1.0, 0.0, 0.0, \
0.0, 0.0, 0.0, 1.0
StepRot dd 2.0, -2.0
Mesh0 dd 32 dup(?)
Mesh1 dd 32 dup(?)
Mesh2 dd 32 dup(?)
Mesh3 dd 32 dup(?)
Dot_0 dd 4 dup(?)
Dot_IK dd 4 dup(?)
WindowClass db "Window", 0
ButtonClass db "Button", 0
ButtonText db "Инв. кин.", 0
TextH db "Помощь(H)", 0
Рисунок 6 – Текст программы
12
TextHelp db "W/A/S/D - Вращение вида", 13, 10, \
"Q/E - Масштабирование вида", 13, 10, \
"U/J - Управление 1-ым звеном", 13, 10, \
"I/K - Управление 2-ым звеном", 13, 10, \
"O/L - Управление 3-им звеном", 13, 10, 0
hInstance HINSTANCE ?
CommandLine LPSTR ?
hButton HWND ?
.const
X0 equ 320
Y0 equ 240
.code
start:
finit
fldpi
fdiv DEG_PI
fstp DEG_PI
invoke GetModuleHandle, 0
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, 0, CommandLine, 1
invoke ExitProcess, 0
Mul_Matr proc lp_M:DWORD, lp_V:DWORD, lp_RS:DWORD
pushad
mov ecx, 40h
mov esi, lp_V
movups XMM0, [esi]
mov esi, lp_M
xorps XMM3, XMM3
m0: movups XMM1, XMM0
shufps XMM1, XMM1, 0FFh
movups XMM2, [esi+ecx-10h]
mulps XMM1, XMM2
addps XMM3, XMM1
shufps XMM0, XMM0, 093h
sub ecx, 10h
jnz m0
mov esi, lp_RS
movups [esi], XMM3
popad
ret
Mul_Matr endp
Rot_Matr proc axis:DWORD, angle:DWORD, lp_RS:DWORD
pushad
mov ecx, axis
sub ecx, 'X'
lea ecx, [ecx*4+ecx]
lea esi, [Rxyz+ecx*4]
mov edi, lp_RS
xorps XMM0, XMM0
mov ecx, 40h
m0: movups [edi+ecx-10h], XMM0
sub ecx, 10h
jnz m0
fld angle
; Mul_Matr = (Матр*Вект)
; Rot_Matr = (Матр Вращ)
Рисунок 7 – Продолжение
13
fmul DEG_PI
fsincos
fld st(1)
fchs
fld st(1)
fld1
fst dword ptr[edi+60]
mov ecx, 5
m1: mov ebx, dword ptr[esi+ecx*4-4]
fstp dword ptr[edi+ebx*4]
loop m1
popad
ret
Rot_Matr endp
Add_Vect proc lp_V1:DWORD, lp_V2:DWORD, lp_RS:DWORD
pushad
mov esi, lp_V1
movups XMM0, [esi]
mov esi, lp_V2
movups XMM1, [esi]
addps XMM0, XMM1
mov esi, lp_RS
movups [esi], XMM0
fld1
fstp dword ptr[esi+12]
popad
ret
Add_Vect endp
Shf_Vect proc axis:DWORD, dist:DWORD, lp_RS:DWORD
pushad
mov esi, lp_RS
xorps XMM0, XMM0
movups [esi], XMM0
fld dist
mov ecx, axis
sub ecx, 'x'
fstp dword ptr[esi+ecx*4]
fld1
fstp dword ptr[esi+12]
popad
ret
Shf_Vect endp
Dot_Mesh proc axis:DWORD, dist:DWORD, lp_RS:DWORD
pushad
mov esi, lp_RS
xorps XMM0, XMM0
movups [esi], XMM0
sub esp, 10h
mov esi, esp
mov ebx, axis
sub ebx, 'W'
mov axis, 'z'
mov ecx, 3
m0: cmp ebx, ecx
je m1
invoke Shf_Vect, axis, dist, esi
; Add_Vect = (Вект+Вект)
; Shf_Vect = (Вект Смещ)
; Dot_Mesh = (Точк Меша)
Рисунок 8 – Продолжение
14
invoke Add_Vect, esi, lp_RS, lp_RS
m1: dec axis
loop m0
add esp, 10h
popad
ret
Dot_Mesh endp
Lin_Mesh proc axis:DWORD, lp_V:DWORD, lp_RS:DWORD
pushad
mov esi, lp_V
mov edi, lp_RS
movups XMM0, [esi]
movups [edi], XMM0
sub esp, 40h
mov esi, esp
invoke Rot_Matr, axis, DEG_90, esi
mov ecx, 3
m0: invoke Mul_Matr, esi, edi, addr [edi+10h]
add edi, 10h
loop m0
add esp, 40h
popad
ret
Lin_Mesh endp
Shf_Mesh proc lp_LN:DWORD, lp_V:DWORD, lp_RS:DWORD
pushad
mov edi, lp_RS
mov esi, lp_V
push dword ptr [esi+12]
mov dword ptr [esi+12], 0
movups XMM0, [esi]
pop dword ptr [esi+12]
mov esi, lp_LN
mov ecx, 4
xor ebx, ebx
m0: movups XMM1, [esi+ebx]
addps XMM1, XMM0
movups [edi+ebx], XMM1
add ebx, 10h
loop m0
popad
ret
Shf_Mesh endp
Reg_Mesh proc axis:DWORD, value:DWORD, lp_LN:DWORD
pushad
sub esp, 40h
mov esi, esp
mov edi, lp_LN
mov ecx, 8
cmp axis, 'x'
jge m0
invoke Rot_Matr, axis, value, esi
m1: invoke Mul_Matr, esi, edi, edi
add edi, 10h
loop m1
jmp m3
; Lin_Mesh = (Квад Меша)
; Shf_Mesh = (Смещ Меша)
; Reg_Mesh = (Отнс Меша)
Рисунок 9 - Продолжение
15
m0: invoke Shf_Vect, axis, value, esi
m2: invoke Add_Vect, esi, edi, edi
add edi, 10h
loop m2
m3: add esp, 40h
popad
ret
Reg_Mesh endp
Cal_Mesh proc num:DWORD
; Cal_Mesh = (Расч Меша)
cmp num, 3
jg m4
je m3
cmp num, 1
jg m2
jl m0
invoke Dot_Mesh, 'Z', sz_Obj, addr Mesh0
invoke Lin_Mesh, 'Z', addr Mesh0, addr Mesh0
invoke Dot_Mesh, 'Z', sz_Obj, addr Mesh0+40h
invoke Lin_Mesh, 'Z', addr Mesh0+40h, addr Mesh0+40h
invoke Shf_Mesh, addr Mesh0+40h, addr Platforma, addr Mesh0+40h
m2: invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh1
invoke Lin_Mesh, 'Z', addr Mesh1, addr Mesh1
invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh1+40h
invoke Lin_Mesh, 'Z', addr Mesh1+40h, addr Mesh1+40h
invoke Shf_Mesh, addr Mesh1+40h, addr Zv_1+4, addr Mesh1+40h
invoke Reg_Mesh, Zv_1, Zv_1+20, addr Mesh1
m3: invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh2
invoke Lin_Mesh, 'Z', addr Mesh2, addr Mesh2
invoke Dot_Mesh, 'Z', sz_Obj+4, addr Mesh2+40h
invoke Lin_Mesh, 'Z', addr Mesh2+40h, addr Mesh2+40h
invoke Shf_Mesh, addr Mesh2+40h, addr Zv_2+4, addr Mesh2+40h
invoke Reg_Mesh, Zv_2, Zv_2+20, addr Mesh2
invoke Shf_Mesh, addr Mesh2, addr Zv_1+4, addr Mesh2
invoke Shf_Mesh, addr Mesh2+40h, addr Zv_1+4, addr Mesh2+40h
invoke Reg_Mesh, Zv_1, Zv_1+20, addr Mesh2
m4: invoke Dot_Mesh, 'X', sz_Obj+8, addr Mesh3
invoke Lin_Mesh, 'X', addr Mesh3, addr Mesh3
invoke Dot_Mesh, 'X', sz_Obj+8, addr Mesh3+40h
invoke Lin_Mesh, 'X', addr Mesh3+40h, addr Mesh3+40h
invoke Shf_Mesh, addr Mesh3+40h, addr Zv_3+4, addr Mesh3+40h
invoke Reg_Mesh, Zv_3, Zv_3+20, addr Mesh3
invoke Shf_Mesh, addr Mesh3, addr Zv_2+4, addr Mesh3
invoke Shf_Mesh, addr Mesh3+40h, addr Zv_2+4, addr Mesh3+40h
invoke Reg_Mesh, Zv_2, Zv_2+20, addr Mesh3
invoke Shf_Mesh, addr Mesh3, addr Zv_1+4, addr Mesh3
invoke Shf_Mesh, addr Mesh3+40h, addr Zv_1+4, addr Mesh3+40h
invoke Reg_Mesh, Zv_1, Zv_1+20, addr Mesh3
movups XMM0, Mesh3+40h
movups XMM1, Mesh3+60h
addps XMM0, XMM1
movups XMM1, sz_Obj
shufps XMM1, XMM1, 0FFh
divps XMM0, XMM1
movups Dot_0, XMM0
m0: ret
Cal_Mesh endp
Dot_Draw proc hdc:DWORD, lp_M:DWORD, lp_V:DWORD, lp_XY:DWORD
Точк)
; Dot_Draw = (Рисн
Рисунок 10 - Продолжение
16
pushad
sub esp, 10h
mov esi, esp
invoke Mul_Matr, lp_M, lp_V, esi
mov edi, lp_XY
mov ecx, 2
m0: fld dword ptr[esi+ecx*4-4]
fmul Lim_Zoom
fidiv Rxyz+4
fiadd dword ptr[edi+ecx*4-4]
fistp dword ptr[esi+ecx*4-4]
loop m0
invoke MoveToEx, hdc, [esi], [esi+4], 0
invoke LineTo, hdc, [esi], [esi+4]
add esp, 10h
popad
ret
Dot_Draw endp
Lin_Draw proc hdc:DWORD, lp_M:DWORD, lp_V1:DWORD, lp_V2:DWORD, lp_XY:DWORD
(Рисн Лини)
pushad
sub esp, 20h
mov esi, esp
invoke Mul_Matr, lp_M, lp_V1, esi
invoke Mul_Matr, lp_M, lp_V2, addr [esi+10h]
mov edi, lp_XY
push esi
mov ecx, 2
m1: push ecx
mov ecx, 2
m0: fld dword ptr[esi+ecx*4-4]
fmul Lim_Zoom
fidiv Rxyz+4
fiadd dword ptr[edi+ecx*4-4]
fistp dword ptr[esi+ecx*4-4]
loop m0
add esi, 10h
pop ecx
loop m1
pop esi
invoke MoveToEx, hdc, [esi], [esi+4], 0
invoke LineTo, hdc, [esi+10h], [esi+14h]
add esp, 20h
popad
ret
Lin_Draw endp
Box_Draw proc hdc:DWORD, lp_M:DWORD, lp_B:DWORD, lp_XY:DWORD
Ящик)
pushad
mov esi, lp_B
mov ecx, 3
m0: invoke Lin_Draw, hdc, lp_M, esi, addr [esi+10h], lp_XY
invoke Lin_Draw, hdc, lp_M, esi, addr [esi+40h], lp_XY
invoke Lin_Draw, hdc, lp_M, addr [esi+40h], addr [esi+50h], lp_XY
add esi, 10h
loop m0
invoke Lin_Draw, hdc, lp_M, esi, addr [esi-30h], lp_XY
invoke Lin_Draw, hdc, lp_M, esi, addr [esi+40h], lp_XY
; Lin_Draw =
; Box_Draw = (Рисн
Рисунок 11 - Продолжение
17
invoke Lin_Draw, hdc, lp_M, addr [esi+10h], addr [esi+40h], lp_XY
popad
ret
Box_Draw endp
Rot_View proc axis:DWORD, angle:DWORD, lp_M:DWORD
pushad
sub esp, 40h
mov esi, esp
invoke Rot_Matr, axis, angle, esi
mov ecx, 4
m0: invoke Mul_Matr, esi, lp_M, lp_M
add lp_M, 10h
loop m0
add esp, 40h
popad
ret
Rot_View endp
; Rot_View = (Вращ Вида)
Lim_Actn proc lp_D:DWORD, lp_V:DWORD, step:DWORD
sub esp, 8
mov esi, lp_V
mov edi, lp_D
mov ecx, step
fld dword ptr[esi+ecx*4+8]
fadd dword ptr[edi]
fist dword ptr[edi]
mov ecx, dword ptr[edi]
fld dword ptr[esi]
fistp dword ptr[esp]
fld dword ptr[esi+4]
fistp dword ptr[esp+4]
cmp ecx, dword ptr[esp]
jge m0
fstp dword ptr[edi]
fld dword ptr[esi]
jmp m1
m0: cmp ecx, dword ptr[esp+4]
jle m1
fstp dword ptr[edi]
fld dword ptr[esi+4]
m1: fstp dword ptr[edi]
ret
Lim_Actn endp
; Lim_Actn = (Огрн Движ)
Inv_Kinm proc
cmp DEG, 360
jne m0
mov DEG, 0
m0: xorps XMM0, XMM0
movups Dot_IK, XMM0
shl DEG, 3
fild DEG
fmul A
fmul DEG_PI
fsin
fmul Radius
fstp Dot_IK+8
fldz
fstp Dot_IK+4
; Inv_Kinm = (Инвр Кинм)
Рисунок 12 - Продолжение
18
shr DEG, 3
invoke Add_Vect, addr Art_IK, addr Dot_IK, addr Dot_IK
fild DEG
fstp Zv_1+20
fld Dot_IK+8
fsub Zv_1+12
fsub Zv_2+12
fstp Zv_2+20
fld Dot_IK
fmul st(0), st(0)
fld Dot_IK+4
fmul st(0), st(0)
faddp st(1), st(0)
fsqrt
fadd Zv_2+4
fadd Zv_3+4
fchs
fstp Zv_3+20
sub esp, 40h
mov esi, esp
invoke Rot_Matr, 'Z', Zv_1+20, esi
invoke Mul_Matr, esi, addr Dot_IK, addr Dot_IK
add esp, 40h
inc DEG
ret
Inv_Kinm endp
Art_Kinm proc hdc:DWORD, lp_M:DWORD, lp_V:DWORD, lp_XY:DWORD
Кинм)
pushad
sub esp, 10h
mov esi, esp
xorps XMM0, XMM0
mov ecx, 360
m0: push ecx
shl dword ptr[esp], 3
movups [esi], XMM0
fild dword ptr[esp]
fmul A
fmul DEG_PI
fsin
fmul Radius
fstp dword ptr[esi+8]
fldz
fstp dword ptr[esi+4]
mov dword ptr[esp], ecx
fild dword ptr[esp]
fstp dword ptr[esp]
pop eax
invoke Add_Vect, lp_V, esi, esi
sub esp, 40h
mov edi, esp
invoke Rot_Matr, 'Z', eax, edi
invoke Mul_Matr, edi, esi, esi
add esp, 40h
invoke Dot_Draw, hdc, lp_M, esi, lp_XY
loop m0
add esp, 10h
popad
; Art_Kinm = (Рисн
Рисунок 13 - Продолжение
19
ret
Art_Kinm endp
Controls proc key:DWORD
; Controls = (Управлени)
cmp key, VK_W
jne m0
invoke Rot_View, 'X', StepRot, addr Matr_View
m0: cmp key, VK_A
jne m1
invoke Rot_View, 'Y', StepRot, addr Matr_View
m1: cmp key, VK_S
jne m2
invoke Rot_View, 'X', StepRot+4, addr Matr_View
m2: cmp key, VK_D
jne m3
invoke Rot_View, 'Y', StepRot+4, addr Matr_View
m3: cmp key, VK_U
jne m4
invoke Lim_Actn, addr Zv_1+20, addr Lim_Zv_1, 0
mov ReCalMesh, 2
m4: cmp key, VK_J
jne m5
invoke Lim_Actn, addr Zv_1+20, addr Lim_Zv_1, 1
mov ReCalMesh, 2
m5: cmp key, VK_I
jne m6
invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 0
mov ReCalMesh, 3
m6: cmp key, VK_K
jne m7
invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 1
mov ReCalMesh, 3
m7: cmp key, VK_O
jne m8
invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 0
mov ReCalMesh, 4
m8: cmp key, VK_L
jne m9
invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 1
mov ReCalMesh, 4
m9: cmp key, VK_Q
jne mA
invoke Lim_Actn, addr Lim_Zoom, addr Lim_Zoom+4, 0
mA: cmp key, VK_E
jne mB
invoke Lim_Actn, addr Lim_Zoom, addr Lim_Zoom+4, 1
mB: cmp key, VK_H
jne mC
invoke MessageBox, 0, addr TextHelp, addr TextH, MB_OK
mC: ret
Controls endp
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
Рисунок 14 - Продолжение
20
mov wc.cbClsExtra, 0
mov wc.cbWndExtra, 0
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszClassName, OFFSET WindowClass
invoke LoadIcon, 0, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, 0, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx, 0, addr WindowClass, addr AppName, WS_SYSMENU, \
CW_USEDEFAULT, CW_USEDEFAULT, sz_Wind, sz_Wind+4, 0, 0, hInst, 0
mov hwnd,eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, addr msg, 0, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL pen:HBRUSH
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, 0
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx, 0, addr ButtonClass, addr ButtonText, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, \
10, 10, 160, 30, hWnd, 1, hInstance, 0
mov hButton, eax
invoke Cal_Mesh, 1
.ELSEIF uMsg==WM_COMMAND
mov eax, wParam
.IF lParam==0
.IF ax==1
not AnimIK
invoke SetFocus, hWnd
.ELSE
invoke DestroyWindow, hWnd
.ENDIF
.ELSE
.IF ax==1
shr eax, 16
.IF ax==BN_CLICKED
invoke SendMessage, hWnd, WM_COMMAND, 1, 0
.ENDIF
.ENDIF
.ENDIF
.ELSEIF uMsg==WM_KEYDOWN
mov eax, wParam
invoke Controls, eax
invoke Cal_Mesh, ReCalMesh
Рисунок 14 - Продолжение
21
mov ReCalMesh, 0
mov RePaint, 0
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint, hWnd, addr ps
mov hdc, eax
invoke CreatePen, 0, 2, 0FF0000h
invoke SelectObject, hdc, eax
invoke Box_Draw, hdc, addr Matr_View, addr Mesh0, addr XY0
invoke Box_Draw, hdc, addr Matr_View, addr Mesh1, addr XY0
invoke Box_Draw, hdc, addr Matr_View, addr Mesh2, addr XY0
invoke Box_Draw, hdc, addr Matr_View, addr Mesh3, addr XY0
cmp AnimIK, 0
jne s0
invoke CreatePen, 0, 4, 0FF00h
invoke SelectObject, hdc, eax
invoke Art_Kinm, hdc, addr Matr_View, addr Art_IK, addr XY0
s0: invoke CreatePen, 0, 10, 0FFh
invoke SelectObject, hdc, eax
invoke Dot_Draw, hdc, addr Matr_View, addr Dot_0, addr XY0
invoke TextOut, hdc, 10, 660, addr TextH, sizeof TextH
invoke EndPaint, hWnd, addr ps
invoke UpdateWindow, hButton
invoke Sleep, 30
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
.IF AnimIK==0
invoke Inv_Kinm
invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 0
invoke Lim_Actn, addr Zv_2+20, addr Lim_Zv_2, 1
invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 0
invoke Lim_Actn, addr Zv_3+20, addr Lim_Zv_3, 1
invoke Cal_Mesh, 2
mov RePaint, 0
.ENDIF
.IF RePaint==0
invoke InvalidateRect, hWnd, 0, TRUE
not RePaint
.ENDIF
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
Рисунок 15 - Продолжение
22
3.Вычислительный эксперимент.
На
рисунках
18-19
представлены
вид
окна
и
результаты
вычислительных экспериментов в различных режимах работы программы.
Рисунок 16 – Окно программы
Рисунок 17 – Управление звеньями манипулятора с клавиатуры
23
Заключение
В ходе выполнения данной курсовой работы были разработаны
алгоритм и программа ассемблер. Программа осуществляет построение и
графический вывод 3D- модели трехзвенного манипулятора. В модели
предусмотрены управление звеньями манипулятора, изменение точки
наблюдения, масштабирование модели, движение выходного звена по
заданной траектории. Получены и закреплены навыки программирования на
языке MASM32.
24
Список литературы
1. ГОСТ 19.504-79. Руководство программисту. Требования к содержанию
и оформлению. – Введ. 1980-01-01. – М.: Издательство стандартов, 1979.
– 2 с. – (Единая система программной документации)
2. ГОСТ 19.505-79. Руководство оператора. Требования к содержанию и
оформлению. – Введ. 1980-01-01. – М.: Издательство стандартов, 1979.
– 2 с. – (Единая система программной документации)
3. Игнатенко А. Однородные координаты: учеб-метод пособие / сост.
Игнатенко А. - 5 с.
4. Роджерс Д., Адамс Дж. Математические основы машинной графики. М.:
Мир, 2001. 604 с.
5. Матрица перехода. Электронная библиотека Wikipedia [ Электронный
ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Матрица_перехода
6. Эллипс. Электронная библиотека Wikipedia [ Электронный ресурс].
Режим доступа: https://ru.wikipedia.org/wiki/Эллипс
7. SSE. Электронная библиотека Wikipedia [ Электронный ресурс]. Режим
доступа: https://ru.wikipedia.org/wiki/SSE
8. Алан Зуккони. Инверсная кинематика в 2Д. [Электронный ресурс].
Режим доступа: https://www.alanzucconi.com/2018/05/02/ik-2d-1/
25
Приложение А. Руководство пользователя
Назначение и условие применение программы. Данное приложение
предназначена
трехзвенного
для
графической
манипулятора.
визуализации
Программа
трехмерной
позволяет
модели
масштабировать
изображение, перемещать звенья манипулятора, изменять точку наблюдения, а
также реализует движения по траектории.
Рекомендуемые системные требования для программного обеспечения:
Процессор Pentium 4 2Гц, Оперативная память 256 Mb, 32-bit разрядная
система, 10 Mb свободного места на жёстком диске, Операционная система
Windows 7, Мышь, Клавиатура, Монитор.
Характеристики программы. Приложение работает в режиме оффлайн,
данный
дистрибутив
может
транспортироваться
на
любом
носителе
информации.
Обращение к программе. Запуск приложения осуществляется через
исполняемый файл "manipulator.exe".
Управление программой осуществляется использованием клавиатуры:
1. W/A/S/D –Вращение вида
2. Q/E –Масштабирование вида
3. U/J –Управление 1-ым звеном
4. I/K –Управление 2-ым звеном
5. O/L –Управление 3-им звеном
6. H – Помощь
7. Кнопка «Инв. Кин.» – Выполняет движение по траектории
Входными данными являются нажатия клавиш клавиатуры
Выходные данными являются графическая визуализация трехмерной
модели трехзвенного манипулятора.
26
Download