基于Python的管路弯管坐标转换工具设计
2021-07-21郑晓芳丁龙斌
郑晓芳 丁龙斌
摘要: 当前轨道车辆弯管工作中,存在需要转换弯管空间坐标到角度坐标、需要根据实际管路数值进行数值修正的情况,而当前的工具使用不便,且没有实现自动计算修正值的功能。本文深入分析了管路弯管工作的数学原理,详细分析了弯管坐标转换的具体过程,并使用python编程语言实现了管路弯管坐标转换运算的算法和图形用户界面GUI的设计,完成了一套弯管坐标转换和自动修正数值的软件,并加入各种管路数值合理性判断条件,能够有效提升生产一线在弯管计算上的工作效率。
关键词:管路弯管 弯管空间坐标 坐标变换 弹性值修正 应用程序开发
Design of Pipe Bend Coordinate Transformation Tool Based on Python
ZHENG Xiaofang DING Longbin
(CRRC Qingdao Co., Ltd., Qingdao, Shandong Province, 266111 China)
Abstract: At present, in the bend work of rail vehicles, it is necessary to convert the spatial coordinates of the bend to the Angle coordinates and make numerical correction according to the actual pipeline value. However, the current tool is inconvenient to use and does not realize the function of automatically calculating the repair value. This paper deeply analyzes the mathematical principle of pipe bending machine work, describes in detail the concrete process of pipe bending coordinate transformation and using the python programming language to realize the algorithm and the design of GUI, implements a set of pipe bending coordinate transformation and automatic correction numerical software, rationality and join various numerical judgement conditions, effectively improve the production line on the pipe bending calculation efficiency.
Key Words: Pipe elbow; Elbow space coordinates; Coordinate transformation; Elastic value correction; Application development
0 引言
在軌道车辆中,制动及给水装置大多使用管路送风给水,部分电路也通过管路保护电线。管路分布较为复杂,需要多种多样的管路弯管避免空间上管路铺设时的相互碰撞和对抗。
数控弯管机采用矢量弯管的原理,工作时需要输入直线进给量(Y轴)、空间旋转角(B轴)和平面弯曲角(C轴)[1]。在当前普遍使用的三维软件设计管路时,只能输出弯管空间几何坐标(X,Y,Z)。因此对空间坐标转换为数控弯管机可以使用的矢量坐标是弯管工作中一项重要环节。
由于加工工艺、实际打磨和各个管道生产厂家的标准不同,实际使用的管路总是和其理论值有所偏差。此外,由于管路并不是绝对刚体,在弯管过程中也有一些弹性,不同材质的管路弹性不同,因此弯曲角度的误差不同,需要修正的弯曲角度也有所不同。
本文通过对管道弯管计算方法进行深入分析,开发弯管三维空间坐标系坐标转换为线长和角度计量的坐标的软件工具,将三维空间坐标转换为(直线段长,弯曲角度,旋转角度)的矢量坐标,并提供不同精确值不同修正参考值条件下的弯管偏差值修正的计算。此外,将各种设备的误差计算汇总,方便选择设备来进一步规范弯管数值计算。该工具能够改善管道弯管实际工作过程中的坐标转换不便,理论值修正值计算不便的现状,提升管道弯管工作效率[2]。
1 弯管转换原理
首先研究弯管转换原理和转换方法。矢量弯管是基于空间矢量技术的原理,将弯管加工中管件形位尺寸及空间角度的计算直接运用矢量坐标计算的方法,这一方法是将管件设置在一空间直角坐标系中,则管件上的任一点具有相应的坐标值,任一直线段具有量值的大小且有方向,根据这一特性,可将管件弯曲加工的参数,直接求出管件展开长度和有关工艺参数[3]。
采用矢量方法增量型数控弯管机加工弯管,其弯管运动所需要的数据主要有三方面内容:两弯管之间的直线送进距离,弯曲角度和空间旋转角度[4]。弯管运动简化描述如图1所示。
该图中,红色线路表示管路,该管路由直线段和圆弧段中心线构成。相邻两中心线延长后产生交点,即直线段P1G与直线段HM延长后相交点P2、直线段HM与直线段NP4延长后相交点P3,P1和P4是管子的两端,且点P1、P2在平面YOZ内,点P3、P4在平面XOZ内,G、H、M、N为圆弧与直线段的交点。
2坐标转换方法
在弯管坐标转换计算中,需要计算直线段长度l,弧线段长度s、管子弯曲角度α和管子旋转角度β. 输入数据为空间坐标点{P1, P2, … Pn}, n>3. 设P1,P2P3为管子的三个相邻点,其中P2为相邻两直线段延长线的交点,即弯曲部位弧线两端切线的交点,则三个点确定一个空间平面,向量和的夹角即为弯曲角度α,因此利用向量夹角的计算公式,可得:
然后利用反三角函数公式即可求出.
在得到弯曲角度之后,由弧长和半径及弧度之间的关系,可根据弯管半径求得弧线段长度s:
弯管坐标计算中,旋转角度为两平面的夹角,设P1P2P3 和P2P3P4为弯管上相邻的两个平面,交于直线P1P2,则两平面的夹角与平面法向量的夹角相等(正向旋转时)或相反(负向旋转时)。
平面法向量平行于平面内相交的两个向量的矩,其向量表示可由公式(3)求出:
其中为P1P2P3的空間坐标。由于P1P2与P2P3相交且不平行,利用向量夹角公式(1)即可得到向量夹角.
由于空间平面旋转角度在变化,在该区间内余弦公式只能得到角度的值,而无法得到角度的符号。判断旋转角度的正负,即判断P4在平面P1P2P3的上方还是下方。规定弯管方向为直线段方向的右侧,则在的右侧,根据右手定则,两向量的矩的方向为垂直平面P1P2P3向下. 当P4在平面P1P2P3的上方时,向量与的点乘为负,当P4在平面P1P2P3的下方时,向量与的点乘为正,即旋转角度β的符号与三个向量混合积的结果符号相反,如公式(4)所示:
为计算简便,公式(4)右侧表示为行列式形式为:
到此,即可得到旋转角度β的准确值。
得到弯曲角度后,由图1可得到第一段直线段长度l的计算公式(6):
其中为直线段左端点,为与下一段直线段延长线的交点(在最后一段直线段为终点)。对于第2段到第n-1段直线段,还需要再减去前面一段弧线对应的直线段长度,如公式(7)所示:
对于最后一段直线段,是该段直线长度减去前面半个弧度对应的直线长度,即公式(8):
由于实际管路和理论上的管路模型特性参数有误差,因此需要对误差部分进行修正。设管路弯曲角度的理论值和实际值对应关系为(i >1),利用弹性系数修正的方法,当计算出的弯曲角度为时,处于区间内,则修正值计算公式(9)-(12)为:
其中,为参考点的理论值和修正值,如理论弯曲度数为90度时,修正值为89度等等。,为弯曲角度的修正值,为直线段长度的修正值,k、b为弹性系数。
3 应用程序设计
3.1 弯管坐标转换算法实现
弯管坐标转换算法可描述如下:<!-- 表格格式如 -->
输入:弯曲半径R,多个空间三维坐标点{P1, P2, … Pn}, n>3,弯曲角度的理论值与实际值
约束条件:相邻四点不共线,相邻两点不重合
输出:直线段长度l,弧线段长度s、管子弯曲角度α和管道旋转角度β;修正后的直线段长度和弯曲角度.
本文选用数学科学计算工具Python语言实现,版本为3.7.5,使用科学数据包有numpy[5].
算法共分为两个模块,理论值计算和修正值计算。理论值计算包含数据输入方法,弯曲角度计算方法,直线段长度计算方法和旋转角度计算方法。修正值计算包括弹性区间选择、弹性系数计算和修正值计算。后文将结合伪代码对转换算法进行分析。
首先是弯曲角度α的计算,如下伪代码所示。输入P1、P2、P3,首先使用二阶范数函数norm计算P1P2和P2P3的长度,然后进行判断,如果长度有一个为0,则表示有相邻点重合,这是不被允许的,因此升起数值错误,若是没有问题,则使用dot函数计算P1P2和P2P3向量的点乘后除去线段的长度,即得到弯曲角度α的余弦值,取反余弦函数acos,就得到了α.
def cosalpha(p1, p2, p3):
a = norm(p1-p2)
b = norm(p3-p2)
if a == 0 or b ==0:
raise ValueError("相鄰的点不能相同")
alpha = acos(dot(p2 - p1, p3 - p2) / a / b)
return alpha
第二部分是旋转角度β的计算,如下伪代码所示。输入P1、P2、P3、P4,首先使用cross计算相邻向量的矩,也就是叉乘,得到两个平面的矩向量。然后,判断矩向量长度是否为0,如果为零则表示共线,升起错误。如果没有错误,则计算两个矩向量的夹角的绝对值,即得到β的绝对值。计算出绝对值后,还需计算β的符号。β的符号和向量、、的混合积符号相反。混合积的计算可以先计算、的叉乘,在与点乘,最后将得到的结果与0比较,如果大于0则β的值为负数,小于等于0则为正数[7]。
def beta(p1, p2, p3, p4):
n1 = cross(p1p2, p2p3)
n2 = cross(p2p3, p2p4)
a = norm(n1)
b = norm(n2)
if a == 0 or b ==0:
raise ValueError("连续四点共线错误")
beta = acos(dot(n1, n2) / a / b)
sign = 1 if dot(p1p4, cross(p1p2, p1p3))<=0 else -1
return beta * sign
第三部分是直线段长度的计算,如下伪代码所示。如果该直线段是第一段直线,则计算P1P2段的长度后减去一半弧度对应的长度即可。如果该直线段是第2到第n-1段直线,则还需减去直线之前的一半弧度对应的长度。如果是最后一段直线段,则需要在计算P1P2段的长度后减去之前的一半弧度对应的长度[8]。
def length(p1, p2, r, alpha):
if i == 1:
length[i] = norm(p2-p1) – r*tan(alpha[i]/2)
else if 1 < i <n-1:
length[i] = norm(p2-p1)-r*tan(alpha[i]/2)
–r*tan(alpha[i-1]/2)
if i == n:
length[i] = norm(p2-p1)- –r*tan(alpha[i-1]/2)
return length
然后是修正值的計算。如表5所示,首先选择合适的弹性区间section。当一个弯曲角度α位于区间[theory[i], theory[i+1]]内时,该区间即为α的弹性区间。通过弹性系数计算公式(9)和(10),可得到k和b的值。corr_alpha 为alpha的修正值,等于alpha乘上k加b. 求出corr_alpha后,第一段直线段长度不做修正,之后的直线段需要减去弧长的差值。
k = (theory[i+1]-theory[i])/(reality[i+1]-reality[i])
b = (theory[i+1]*reality[i+1]-theory[i+1]*reality[i])
/(reality[i+1]-reality[i])
corr_alpha = k * alpha + b
3.2 GUI设计[6]
如图3所示,GUI主要包含三个部分,菜单栏、工作区以及结果显示区。菜单栏主要有设备管理、计算结果的主要功能,和精确度管理、文件读取等辅助功能。工作区左侧包括设备选择,空间坐标输入,空间坐标增删改以及弯曲半径选择,右侧表格显示已经添加的空间坐标,空间坐标也可通过菜单栏的文件读取选项从excel文件中读取。界面下方为结果显示界面,使用两个标签界面分别显示理论值的计算结果和实际值的计算结果。
设备管理的功能主要有添加设备、修改设备和删除设备。图4为添加设备界面,设备主要参数包括设备型号、模具规格和材质,以及该材质对应的弯曲角度理论值与修正值。图5为修改设备界面,可修改模具、材质和弯曲值对应关系。图6为删除设备界面,可通过设备名称删除存在的设备条目。
图7为修正值的显示界面,包含两个表格,分别显示修正值结果和所选设备设置的理论值与实际值。默认保留整数,可通过菜单栏的精确度菜单选择保留的小数位数。
3.3 代码结构
弯管左边转换工具quality的代码结构如图8所示。Dist文件夹中存放程序打包后的exe可执行文件,bendpipe中实现了理论值与修正值的计算算法,plus_factory、update_factory和del_factory实现了设备添加、修改和删除界面,myPlusFactory是对plus_factory的包装,实现了设备添加的逻辑功能,主程序为quality_define,所有的逻辑功能实现在该文件中集成,quality_window是主界面的设计代码。添加的设备信息以字典和列表的形式存储在factories.json文件中。
如图9所示,当输入表1中的空间坐标点时,点击运行后直接显示理论值,并通过右图中右下角的理论值;修正值的参考表计算出弹性系数k和b,然后自动计算出当前理论值下的修正值情况。
纠错功能:当输入相邻两点相同或者相邻四点共线时,弹出警告对话框,如图11所示。
5总结
本文基于Python语言的管道弯管坐标转换工具设计结合了一线管路弯管工作的生产实际,通过对弯管空间坐标变换到弯管矢量坐标的数学理论研究,实现了空间坐标点到弯管机实际使用数据的自动转换功能,并能供结合提供的弹性区间自动进行修正值的计算。利用Python编程语言和科学工具包numpy,将其用编程语言实现,然后利用Qt编写GUI提供给用户使用,并添加了多种特殊情况判断,优化了坐标转换的计算过程和使用者对数据的判断流程,能够提高弯管的生产效率。
今后,可在本文研究的基础上,继续深入,进一步开发三维弯管仿真模型的三维视觉仿真程序,并在当前基础上增加更细粒度的逻辑判断,以直观地展示当前数据的生成模型,减少在判断弯管数据上的时间和出错的几率,提升工作效率。
注:软件源代码可在https://github.com/dlb123/pipebend-caculate获取
6参考文献
-
王立新. 矢量弯管[M]. 国防工业出版社, 1984.
-
陈亚楼. 一体化弯管数控机床的伺服驱动器的研究与设计[D].武汉理工大学,2018.
-
罗志猛. 基于三角形算法的数控弯管信息转换及仿真[D].武汉理工大学,2006.
-
张德乾,李丰,姜杨杨,夏元平.基于易语言的弯管坐标转换加工程序研究[J].科技创新导报,2020,17(07):111-112.
-
丁龙斌,伍忠东,苏佳丽.基于集成深度森林的入侵检测方法[J].计算机工程,2020,46(03):144-150.
-
孙守江. 供热管道系统的受力分析及优化[D].北京建筑大学,2020.
-
丁龙斌. 随机森林入侵检测算法研究[D].兰州交通大学,2020.
-
苏佳丽,伍忠东,丁龙斌,刘菲菲.基于IGWO-RBF的LTE-R切换算法研究[J].计算机工程与应用,2020,56(08):74-80.