Python 理解脚本
我有一个脚本,可以参数化圆。这用于模拟程序。然而,我很难理解剧本的某些部分,我想学习这一点。我参加了一些python在线课程,但我不确定这是否足以理解它。例如,下面的部分 是不是在圆的圆周上找3个点来确定它是否是圆?整个代码低于其他代码。表达式Python 理解脚本,python,math,geometry,Python,Math,Geometry,我有一个脚本,可以参数化圆。这用于模拟程序。然而,我很难理解剧本的某些部分,我想学习这一点。我参加了一些python在线课程,但我不确定这是否足以理解它。例如,下面的部分 是不是在圆的圆周上找3个点来确定它是否是圆?整个代码低于其他代码。表达式fabs((V1*V2)/(sqrt(V1*V1*V2*V2))>0.95中的V1、V2和V3是什么意思 for i in range(skipCount): P1 = points[i] P2 = points[i+1] if
fabs((V1*V2)/(sqrt(V1*V1*V2*V2))>0.95中的V1
、V2
和V3
是什么意思
for i in range(skipCount):
P1 = points[i]
P2 = points[i+1]
if i+2 < skipCount:
P3 = points[i+2]
else:
P3 = points[i-1]
#endif
范围内i的(skipCount):
P1=点[i]
P2=点[i+1]
如果i+2
整个代码:
def OnAbort():
cmd.Checked = False
pass
#-------------------------------------------------------------------------------
def firstState():
if selProg.Count != 1:
print "Circular Move: No program selected. Aborting..."
return False
#endif
cmd.Checked = True
program = selProg.getItem(0)
routine = program.CurrentRoutine
controller = program.Controller
addLimitProperty( cmd, VC_REAL, "CircularSpeed", True, False, False, 100., None, "Velocity", 0., controller.MaxCartesianSpeed )
cmp = controller.Component
# Fix for Main Program selection BUG
if routine != program.MainRoutine:
if selStmt.Count:
stmt = selStmt.getItem(0)
if stmt.Routine != routine:
routine = program.MainRoutine
#endif
#endif
#endif
if not displayPropertyDialog( cmd.Name, "Circular Motion Settings", ''):
OnAbort()
return False
#endif
phName = 'CircularMove'
ph = cmp.findBehaviour(phName)
processName = 'CircularMove'
if ph != None:
if ph.Script[:12] != "#VERSION 1.2":
print "Updating Script " + processName
ph.delete()
ph = None
#endif
#endif
if ph == None:
ph = cmp.createBehaviour(VC_PYTHON_PROCESS_HANDLER, phName)
# set the bitmap of the process, that appears in the RSL statement grid
iconuri = getCommandPath()
iconuri = iconuri[:-3] + ".bmp"
icon = getApplication().loadBitmap(iconuri)
ph.Icon = icon
# register process handler to the rsl executor behavior(s) of the robot
xl = cmp.findBehavioursByType(VC_RSLEXECUTOR)
for x in xl:
phl = x.ProcessHandlers
phl.append(ph)
x.ProcessHandlers = phl
#endfor
ph.Process = processName
ph.Script = """#VERSION 1.2
from vcRslProcessHandler import *
from math import *
import vcMatrix
RAD_TO_DEG = 90.0/atan2(1.,0.)
def OnExecuteProcess(executor, process_statement):
# Check if at end of Circle Move
skipProp = process_statement.getProperty( "SkipCount" )
if skipProp != None:
#delete all dummy statements to trick RSL program pointer
routine = process_statement.Routine
s = process_statement.Index - skipProp.Value + 1
for i in range( skipProp.Value ):
routine.deleteStatement(s)
return
routine.endBatch()
#endif
cntr = executor.Controller
routine = process_statement.Routine
stmts = routine.Statements
if process_statement.getProperty( "NumPoints" ):
skipCount = process_statement.NumPoints
else:
skipCount = 2
#endif
idx = process_statement.Index
if idx+skipCount >= routine.StatementCount:
return
#endif
for i in range(skipCount):
if stmts[idx+1+i].Type not in [VC_STATEMENT_LINMOTION, VC_STATEMENT_PTPMOTION]:
return
#endif
#endfor
cntr.clearTargets()
trg = cntr.createTarget()
points = [ trg.Target ]
for i in range(skipCount):
points.append(stmts[idx+1+i].Target )
#endfor
for i in range(skipCount):
P1 = points[i]
P2 = points[i+1]
if i+2 < skipCount:
P3 = points[i+2]
else:
P3 = points[i-1]
#endif
V1 = P1.P - P2.P
V2 = P2.P - P3.P
V3 = P3.P - P1.P
if fabs((V1*V2)/(sqrt(V1*V1*V2*V2))) > 0.95:
print "ERROR: CircularMove: Points are colinear"
getSimulation().halt()
return
#endif
N = V1 ^ V2
circleRadius = V1.length()*V2.length()*V3.length()/(2.0*N.length())
alpha = -1.0*(V2*V2)*(V1*V3)
beta = -1.0*(V3*V3)*(V2*V1)
gamma = -1.0*(V1*V1)*(V3*V2)
cP = (alpha*P1.P + beta*P2.P + gamma*P3.P)*(1.0/(2.0*N*N))
R = P1.P - cP
xx = P1.P - cP
xx.normalize()
N.normalize()
yy = N ^ xx
yy.normalize()
V = P2.P - cP
V.normalize()
if process_statement.FullCircle:
circleAngle = 360.0
P3 = P1
else:
circleAngle = atan2( V*yy, V*xx )*RAD_TO_DEG
if circleAngle < 0.0 :
circleAngle += 360.0
#endif
#endif
vel = process_statement.CircularSpeed
acc = cntr.MaxCartesianAccel
arg = vel*vel/(4.*circleRadius*acc)
if arg > 1.0:
arg = 1.0
#endif
dAngle = 2.0*asin( arg ) * RAD_TO_DEG
i = (int) (circleAngle/dAngle)
if i < 2:
i = 2
#endif
dAngle = circleAngle/i
if dAngle < 5.0:
dAngle = 5.0
#endif
trg.MotionType = VC_MOTIONTARGET_MT_LINEAR
trg.CartesianSpeed = vel
trg.AccuracyMethod = VC_MOTIONTARGET_AM_VELOCITY
trg.AccuracyValue = vel
dC = vcMatrix.new()
dC.setAxisAngle( N.X, N.Y, N.Z, circleAngle )
dC.translateAbs( cP.X, cP.Y, cP.Z )
invP1 = dC*P1
invP1.invert()
P12 = invP1*P2
k12 = P12.getAxisAngle()
if circleAngle > 180.0 and abs(k12.W) > 0.1:
k12.W = -(360.0 - k12.W)
#endif
if k12.Z < -0.1:
k12.W *= -1.0
#endif
dTheta = k12.W/circleAngle*dAngle
dP12 = vcMatrix.new()
C0 = vcMatrix.new(P1)
C0.translateAbs( -cP.X, -cP.Y, -cP.Z )
theta = 0.0
angle = 0.0
while angle < circleAngle:
dC.setAxisAngle( N.X, N.Y, N.Z, angle )
dP12.setAxisAngle( k12.X, k12.Y, k12.Z, theta )
C = dC*C0*dP12
trg.Target = C
cntr.addTarget(trg)
angle += dAngle
theta += dTheta
#endwhile
#endif
trg.AccuracyValue = 0.0
trg.Target = P2
cntr.addTarget(trg)
cntr.move()
# Mark end of Circle Move
routine.beginBatch()
stmt = routine.createStatement( VC_STATEMENT_PROCESS )
stmt.Index = process_statement.Index+1
stmt.Process = "CircularMove"
prop = stmt.createProperty( VC_INTEGER, "SkipCount" )
prop.Value = skipCount
# Add dummy Comment statements to trick RSL program pointer
for i in range( skipCount-1 ):
stmt = routine.createStatement( VC_STATEMENT_COMMENT )
stmt.Index = process_statement.Index+1
#endfor
#-------------------------------------------------------------------------------
def OnFinalize():
pass
#-------------------------------------------------------------------------------
def OnReset():
pass
#-------------------------------------------------------------------------------
"""
#endif
ps = routine.createStatement(VC_STATEMENT_PROCESS)
ps.Name = "CM1"
ps.Process = processName
for p in ps.Properties:
if p.Name == "Process":
p.IsVisible = False
addLimitProperty( ps, VC_INTEGER, "NumPoints", True, False, False, 2, None, "", 2, 8)
copyProperties( cmd, ps )
cmd.Checked = False
stmt = selStmt.getItem(0)
if stmt:
ps.Index = stmt.Index+1
return True
addState(firstState)
#endif
def OnAbort():
cmd.Checked=False
通过
#-------------------------------------------------------------------------------
def firstState():
如果selProg.Count!=1:
打印“循环移动:未选择程序。正在中止…”
返回错误
#恩迪夫
cmd.Checked=True
程序=selProg.getItem(0)
例程=程序。当前例程
控制器=程序控制器
addLimitProperty(cmd,VC_REAL,“循环速度”,真,假,假,100.,无,“速度”,0.,controller.MaxCartesianSpeed)
cmp=控制器组件
#修复主程序选择错误
如果是例行公事!=program.Main例程:
如果选择计数:
stmt=selsmt.getItem(0)
如果stmt.Routine!=例行程序:
例程=program.Main例程
#恩迪夫
#恩迪夫
#恩迪夫
如果未显示PropertyDialog(cmd.Name,“圆周运动设置”,“”):
OnAbort()
返回错误
#恩迪夫
phName='CircularMove'
ph=cmp.findBehaviour(phName)
processName='CircularMove'
如果ph!=无:
如果博士脚本[:12]!=“#版本1.2”:
打印“更新脚本”+进程名
删除()
ph=无
#恩迪夫
#恩迪夫
如果ph==无:
ph=cmp.createBehavior(VC\u PYTHON\u进程\u处理程序,phName)
#设置显示在RSL语句网格中的进程位图
iconuri=getCommandPath()
iconuri=iconuri[:-3]+“.bmp”
icon=getApplication().loadBitmap(iconuri)
博士图标=图标
#将进程处理程序注册到机器人的rsl执行器行为
xl=cmp.findBehavioursByType(VC\RSLEXECUTOR)
对于x英寸xl:
phl=x.ProcessHandlers
ph.附加(ph)
x、 ProcessHandlers=phl
#结束
ph.Process=processName
ph.Script=“”#版本1.2
从vcRslProcessHandler导入*
从数学导入*
导入vcMatrix
弧度至度=90.0/atan2(1,0.)
def OnExecuteProcess(执行者、过程声明):
#检查圆的末端是否移动
skipProp=process_statement.getProperty(“SkipCount”)
如果skipplop!=无:
#删除所有伪语句以欺骗RSL程序指针
例程=过程\语句。例程
s=进程\语句索引-跳过.值+1
对于范围内的i(skipProp.Value):
例程.delete语句
返回
routine.endBatch()
#恩迪夫
cntr=执行器控制器
例程=过程\语句。例程
stmts=例程.语句
if process_语句.getProperty(“NumPoints”):
skipCount=进程\语句.NumPoints
其他:
skipCount=2
#恩迪夫
idx=过程\语句索引
如果idx+skipCount>=routine.StatementCount:
返回
#恩迪夫
对于范围内的i(skipCount):
如果stmts[idx+1+i]。未在[VC_语句\u LINMOTION,VC_语句\u PTPMOTION]中键入:
返回
#恩迪夫
#结束
cntr.clearTargets()
trg=cntr.createTarget()
点数=[训练目标]
对于范围内的i(skipCount):
points.append(stmts[idx+1+i].Target)
#结束
对于范围内的i(skipCount):
P1=点[i]
P2=点[i+1]
如果i+20.95:
打印“错误:循环移动:点共线”
getSimulation().halt()
返回
#恩迪夫
N=V1^V2
circleRadius=V1.length()*V2.length()*V3.length()/(2.0*N.length())
alpha=-1.0*(V2*V2)*(V1*V3)
beta=-1.0*(V3*V3)*(V2*V1)
伽马=-1.0*(V1*V1)*(V3*V2)
cP=(α*P1.P+β*P2.P+γ*P3.P)*(1.0/(2.0*N*N))
R=P1.P-cP
xx=P1.P-cP
xx.规范化()
正常化
yy=N^xx
yy.normalize()
V=P2.P-cP
五、规范化
如果过程_语句.FullCircle:
圆圈角度=360.0
P3=P1
其他:
圆环角度=atan2(V*yy,V*xx)*弧度到度
如果圆圈角度<0.0:
圆圈角度+=360.0
#恩迪夫
#恩迪夫
vel=过程\报表。循环速度
acc=cntr.MaxCartesianAccel
arg=vel*vel/(4.*circleRadius*acc)
如果arg>1.0:
arg=1.0
#恩迪夫
悬挂=2.0*asin(arg)*弧度至度
i=(int)(圆圈摆动/悬挂)
如果i<2:
i=2
#恩迪夫
悬挂=圆圈摆动/i
如果悬挂<5.0:
悬挂=5.0
#恩迪夫
trg.MotionType=VC\u MOTIONTARGET\u MT\u线性
trg.CartesianSpeed=vel
训练精度方法=运动目标速度
训练精度值=水平
dC=vcMatrix.new()
直流设置轴角(N.X、N.Y、N.Z、圆环角)
dC.可翻译性(cP.X、cP.Y、cP.Z)
invP1=dC*P1
invP1.invert()
P12=invP1*P2
k12=P12.getAxisAngle()
如果圆圈角度>180.0且abs(k12.W)>0.1:
k12.W=-(360.0-k12.W)
#恩迪夫
如果k12.Z<-0.1:
k12.W*=-1.0
#恩迪夫
dTheta=k12.W/圆形摆动*悬挂
dP12=vcMatrix.new()
C0=vcMatrix.new(P1)
C0.可翻译性(-cP.X,-cP.Y,-cP.Z)
θ=0.0
角度=0.0
当角度<圆圈角度:
dC.setAxisAngle(N.X、N.Y、N.Z、角度)
设置轴角(k12.X,k12.Y,k12.Z,θ)
C=dC*C0*dP12
训练目标=C
cntr.addTarget(训练)
角度+=悬挂
θ+=dTheta
#结束时
#恩迪夫
训练精度