PDA

Просмотр полной версии : программирование


AnShk
02.08.2016, 21:06
необходимо получить движение инструмента по спирали или/и по концентрическим окружностям с шагом по радиусу. прошу помощи: алгоритм или минимальный пример.

Pavel_T
05.08.2016, 13:55
Всем привет!

В качестве примера движения инструмента по спирали, привожу
пример программы и два маленьких клипа. На первом клипе показано
как примерно выглядит спираль. Здесь стоит отметить два момента:
1. Спираль сходится к центру (задаем радиус 50см и
уменьшаем его на итерациях цикла). Так сделано для того, что бы
не ударить робот.
2. После того как спираль сошлась вцентре, она нaчинает
разширятся. Видно, как она выходит за пределы белого прямоугольника.
Если белый прямоугольник, это пределы рабочей, безопасной зоны,
то выход за нее даст краш. По этому с экспериментми надо быть
осторожным.
На втором клипе виден результат работы программы с роботом.
Первый цикл это движение точка к точке, второй линеарное.

1
https://yadi.sk/d/ehqr4VxTtwuJf

2
https://yadi.sk/d/bbfdgjRUtwuQ3

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

В качестве примечания отмечу что вначале программы скорость
работы снижена до 30% ($OV_PRO = 30) для предотвращения столкновений.

Рад был помочь.
Павел.

Программа:

DEF Spiral ( )
DECL INT i
DECL REAL angle
DECL REAL radius
DECL REAL c
DECL REAL s
DECL REAL startX
DECL REAL startY


;FOLD INI;%{PE}
;FOLD BASISTECH INI
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here

;ENDFOLD (USER INI)
;ENDFOLD (INI)

;set programm speed to 30%
$OV_PRO = 30

;start from home position
GoHome()

i = 0
angle = 0
radius = 500 ;mm
c = 0
s = 0
startX = 0
startY = 0

$TOOL = TOOL_DATA[1]
$BASE = BASE_DATA[3]
TempPos = $NULLFRAME

;go to start position (spiral begining)
;FOLD PTP P1 Vel=100 % PDAT1 Tool[1]:Pash Base[2]:222;%{PE}%R 8.3.32,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:P1, 3:, 5:100, 7:PDAT1
$BWDSTART=FALSE
PDAT_ACT=PPDAT1
FDAT_ACT=FP1
BAS(#PTP_PARAMS,100)
PTP XP1
;ENDFOLD

TempPos = XP1

;save start XY pos.
startX = TempPos.X
startY = TempPos.X

;circle formula: x + r*cos(a) and y + r*sin(a).
FOR i = 1 TO 50 STEP 1
radius = radius - 10
angle = angle + 10

c = COS(angle)
s = SIN(angle)

;calc. new X pos
TempPos.X = startX + (radius * c)

;calc. new Y pos
TempPos.Y = startY + (radius * s)

;move robot to new pos as Point to Point
PTP TempPos
ENDFOR

;return robot to start position
TempPos = XP1
PTP TempPos

startX = TempPos.X
startY = TempPos.X
angle = 0
radius = 500 ;mm
FOR i = 1 TO 50 STEP 1
radius = radius - 10
angle = angle + 10

c = COS(angle)
s = SIN(angle)

;calc. new X pos
TempPos.X = startX + (radius * c)

;calc. new Y pos
TempPos.Y = startY + (radius * s)

;move robot to new pos Line to Line
LIN TempPos C_DIS
ENDFOR

;return robot to home
GoHome()
END

DEF GoHome()
;FOLD PTP HOME Vel= 100 % DEFAULT;%{PE}%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT$BWDSTART = FALSE
PDAT_ACT=PDEFAULT
FDAT_ACT=FHOME
BAS (#PTP_PARAMS,100 )
$H_POS=XHOME
PTP XHOME
END

Dat файл:

DEFDAT Spiral
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
EXT BAS (BAS_COMMAND :IN,REAL :IN )
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;Make your modifications here

;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLARATIONS)

DECL E6POS TempPos
DECL E6POS XP1={X -109.308006,Y -459.787598,Z 483.273438,A -26.8819447,B 89.9025955,C 155.420303,S 22,T 50,E1 0.0,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0}
DECL FDAT FP1={TOOL_NO 1,BASE_NO 2,IPO_FRAME #BASE,POINT2[] " ",TQ_STATE FALSE}
DECL PDAT PPDAT1={VEL 100.000,ACC 100.000,APO_DIST 100.000,GEAR_JERK 50.0000,EXAX_IGN 0}

ENDDAT

AnShk
05.08.2016, 17:58
большая благодарность! буду разбираться и наверное пытаться модернизировать....хотя бы удалось для начала запустить в том виде, нужна близкая к идеалу равномерность (лазерная наплавка)...наверное надо сплайн использовать. спасибо!!!

РОБОТ-Н
08.08.2016, 07:31
Могу предложить более оригинальное решение

DECL FRAME fROT //матрица поворота
DECL FRAME fR //матрица смещения

DECL REAL startR //начальный радиус
DECL REAL endR //конечный радиус
DECL REAL nowR //текущий радиус

DECL REAL stepR //уменьшение радиуса за оборот
DECL REAL pathA //длинна пути в градусах

fROT=$NULLFRAME
fR=$NULLFRAME

startR=100
endR=50
stepR=10

pathA=(startR-endR)/stepR*360 //находим длину пути в градусах

stepL=2 //шаг интерполяции одинаков на всех радиусах

R.x=startR //устанавливаем нач. радиус

while nowR<>endR //идём пока текущий не станет равен минимальному

fROT.a=fROT.a+L/nowR*180/3.14 //рассчитываем поворот

nowR=startR-(startR-endR)(fROT.a/pathA) //рассчитываем радиус
fR.x=nowR //подставляем радиус

IF nowR<endR THEN //если радиус меньше минимального то принимаем минимальный
nowR=endR
ENDIF

LIN fROT:fR c_dis //идём в точку

endwhile