☰
python的先进制造技术工业场景模拟第八十九篇:搭建机器人焊接轨迹仿真,调整焊接速度参数,模拟焊缝热积累变化。
2026/10/8 13:02:43 网站建设 项目流程

周五白班,焊接单元旁。

“师傅,这批薄壁支架焊完又变形了,角缝鼓包,”焊工老周指着工件,“工艺卡写焊接速度 12mm/s,可长直缝连着焊,越到后段焊缝越亮,热都堆上了,变形就跟着来。系统只记个电流电压,不告诉我热积累到多少。”

我接上导出的轨迹点表、焊接速度序列、电流电压、板厚、焊缝坐标、红外热像采样、变形实测。

“这里面有啥?”我问。

“路径点XYZ、各段速度、焊接电流、板厚、材料、热像采样帧都有,”老周说,“可系统只画个轨迹线,不模拟‘速度调慢→线能量变大→前一段余热没散→后段热积累叠加→热影响区变宽→变形量’。想定速度,得真焊几件剖开看。”

“最亏的是连续焊,”老周补一句,“单段看速度合规,可前5段余热叠在薄板上,第6段起热积累超阈值,焊缝发蓝,角变形3.2mm。系统没报警,因为瞬时温度没超。”

“我就想干一件事,”老周说,“给轨迹+速度参数,仿真沿轨迹的热积累演化,算每段线能量、累积热、HAZ宽度、角变形,扫几种速度方案对比,标出临界速度,像个小焊接热积累仿真器,不用先烧废件。”

“机器人焊接不是看电流稳不稳,”我接话,“是看‘轨迹点→速度→线能量→余热扩散→热积累→HAZ→变形’。用 numpy 做沿轨迹热累积递推,scipy 做热扩散卷积+样条拟合,pandas 管轨迹表,matplotlib 画热积累云图+速度对比曲线,networkx 建‘轨迹段-热积累-变形’关联链,sklearn 做变形等级分类。”

“对,”老周点头,“要能说清‘12mm/s:末段热积累148℃,角变形3.2mm超差;18mm/s:末段92℃,变形0.7mm合格;临界速度约16mm/s,主因是薄板导热慢+连续段余热叠加’。”

“OOP 封好,”我开工程,“轨迹加载器、线能量模型、热积累求解器、HAZ映射器、变形估算器、速度扫描器、可视化器,合成多速度方案,下载就能跑。”

敲了行原型:

# 目标: 轨迹+速度 → 线能量 → 沿轨迹热积累 → HAZ → 角变形 → 速度方案对比

# 方法: 沿路径递推热累积+热扩散卷积+RF变形分级

老周凑近看:“那以后看报告:轨迹热积累云图,速度-变形对比曲线,HAZ宽度分布,热链关联图,变形等级散点。新工件编程序先跑,红段就是得提速的地方。”

“对,”我接话,“焊接热积累仿真不是‘记电流电压’,是‘提前看见哪段会烧蓝变形’。数字孪生里挂这个热场看板,就是老周的‘控热尺’。”

一、实际应用场景(真实痛点)

场景设定:六轴机器人弧焊单元,焊接 2mm 薄壁不锈钢支架,长直角缝分 8 段连续施焊。工艺卡固定焊接速度 12mm/s、电流 180A。连续焊过程中前段余热未散,后段热积累叠加,导致焊缝发蓝、HAZ 变宽、角变形超差,后处理校形成本高。

现场原话(叙事化):

“不是电流飘了,”老周说,“是热没处走。2mm薄板像散热片但导热慢,前一段焊完还红着,下一段接着焊,热就摞起来了。越焊到尾端越亮,角就翘起来了。”

“最亏的是定速度,”老周说,“工艺卡写12mm/s,单段看都合规,可连焊8段没人算过热积累。想验证就得焊完测变形,废件都切了。”

核心矛盾:“看瞬时电流电压+固定速度” 与 “轨迹+速度→线能量→沿轨迹热积累演化→HAZ→角变形→速度方案扫描+关联图” 之间的断层。

二、痛点分析(映射到滨州职业学院《先进制造技术》课程模型)

《先进制造技术》课程模块 本篇痛点对应

工业机器人技术基础:机器人弧焊轨迹、焊接工艺参数、路径规划 轨迹+速度参数化仿真

数控加工与CAD/CAM技术:工艺规划思想类比(刀轨→焊轨) 路径离散化映射

先进制造技术基础:热变形、几何精度、误差传递 热积累→角变形量化

智能制造与数字孪生:焊接过程热场数字映射、质量预警 热积累挂孪生看板

先进制造新模式:数据驱动工艺参数优化 速度知识库沉淀

增材制造(类比):热累积思想互通 层间余热类比段间余热

一句话总结:我们需要一个“焊接轨迹+速度参数→线能量→沿轨迹热积累→HAZ宽度→角变形→多速度方案对比+关联图”程序,实现从“按工艺卡死速度”到“仿真定临界速度”的闭环。

三、核心逻辑讲解(大白话)

3.1 问题本质:把焊缝想成“铁板上划一根会发热的铅笔线”

把焊接轨迹想成拿一根发热笔在薄铁板上画线,画得慢线就烫,前面画的还没凉,后面接着画,热就叠上去:

* 焊接速度 = 笔划得多快,慢=热量塞得多

* 线能量 = 电流×电压÷速度,速度越慢线能量越大

* 热积累 = 本段自身发热 + 前几段没散掉的余热

* 散热 = 薄板会散,但有时间常数,连焊就散不及

* HAZ(热影响区) = 被烤到相变温度的一圈,热越多越宽

* 角变形 = 焊缝侧缩得多,另一侧少,像纸条沾水卷边

* 临界速度 = 快到热积累刚好不超标的那个速度

* 试焊验证 = 真烧几件剖开量,贵且破坏件

3.2 业务逻辑 → 代码映射

输入轨迹点+速度方案

│

▼ WeldPathLoader (pandas)

读取:

段号, x,y,z, 板厚, 材料, 电流, 电压, 速度

│

▼ LineEnergyModel (numpy)

线能量计算:

q = U*I / v (J/mm)

按段离散, 速度可调

│

▼ HeatAccumSolver (numpy + scipy)

热积累求解器:

沿轨迹递推: T_k = q_k*α + T_prev*decay + 邻段扩散卷积

decay = exp(-Δt/τ), τ由板厚/材料定

scipy卷积做横向热扩散

│

▼ HAZMapper (scipy)

HAZ映射:

按局部峰值温度映射HAZ宽度(样条拟合)

T>相变温度圈宽即HAZ

│

▼ DistortionEstimator (numpy)

角变形估算:

θ ≈ k * ∫(热积累梯度) * 板厚因子

薄板放大系数高

│

▼ SpeedSweeper

速度扫描:

v ∈ [10,12,14,16,18,20] mm/s 各跑一遍

输出热积累/变形随速度曲线

│

▼ DistortionClassifier (sklearn)

变形等级分类:

特征: 速度, 末段热积累, HAZ宽, 板厚, 线能量

标签: 优(≤0.8mm)/良(0.8~2mm)/超差(>2mm)

RF分类 + 5折宏F1

│

▼ WeldViz (matplotlib + networkx)

可视化:

1. 轨迹热积累云图(沿路径着色)

2. 速度-末段热积累/变形对比曲线

3. HAZ宽度沿轨迹分布

4. 段-热积累-变形关联链(networkx)

5. 变形等级预测vs实际散点

6. 单方案温度演化曲线

│

▼ SyntheticWeldPath (numpy)

合成数据:

8段长直角缝, 薄板2mm, 可扫速度

3.3 为什么不能“看电流电压”

视角 问题

看电流电压 瞬时合规,看不出热堆

看单段温度 末段才超,前段正常

焊完测变形 已废件

沿轨迹热积累云图 看见末段发红

速度扫描曲线 找临界速度

HAZ分布 热影响区变宽一眼见

RF分类 新轨迹直接判变形等级

3.4 分析前后对比

维度 传统方式 本程序

热状态监控 电流电压表 沿轨迹热积累场

速度定参 工艺卡固定12mm/s 扫速度出临界值

变形预判 焊完测量 仿真前置标红段

归因 归“材料变形” 热积累+板厚量化

知识沉淀 老师傅手感 速度-板厚知识库

四、OOP 代码实现

4.1 项目结构

weld_heat_sim/

├── weld_heat_sim/

│ ├── __init__.py

│ ├── weld_path_loader.py # 轨迹加载

│ ├── line_energy_model.py # 线能量(numpy)

│ ├── heat_accum_solver.py # 热积累求解(numpy+scipy)

│ ├── haz_mapper.py # HAZ映射(scipy)

│ ├── distortion_estimator.py # 角变形估算

│ ├── speed_sweeper.py # 速度扫描

│ ├── distortion_classifier.py # 变形分类(sklearn)

│ ├── weld_viz.py # 可视化

│ └── synthetic_weld_path.py # 合成轨迹

├── tests/

│ ├── __init__.py

│ └── test_weld.py

├── results/

│ ├── path_heat_cloud.png

│ ├── speed_distortion_curve.png

│ ├── haz_profile.png

│ ├── heat_chain_network.png

│ ├── distort_pred_scatter.png

│ ├── temp_evolution.png

│ ├── weld_detail.csv

│ └── weld_report.txt

└── run_weld.py

4.2 核心源码

<details>

<summary></summary>

"""焊接轨迹加载器。"""

import pandas as pd

from pathlib import Path

class WeldPathLoader:

"""加载机器人焊接轨迹段表。"""

def __init__(self, filepath: str = "weld_path.csv",

encoding: str = "utf-8"):

self.filepath = Path(filepath)

self.encoding = encoding

def load(self) -> pd.DataFrame:

if not self.filepath.exists():

raise FileNotFoundError(self.filepath)

df = pd.read_csv(self.filepath, encoding=self.encoding)

req = ["seg", "x", "y", "z", "thick", "material",

"current", "voltage", "speed"]

miss = [c for c in req if c not in df.columns]

if miss:

raise ValueError(f"缺列: {miss}")

for c in ["seg", "x", "y", "z", "thick", "current", "voltage", "speed"]:

df[c] = pd.to_numeric(df[c], errors="coerce")

return df.dropna(subset=req).sort_values("seg").reset_index(drop=True)

def seg_length(self, df: pd.DataFrame) -> pd.Series:

dx = df.x.diff(); dy = df.y.diff()

return (dx**2 + dy**2).sqrt().fillna(0.0)

</details>

<details><summary></summary>

"""线能量模型 (numpy)。"""

import numpy as np

from dataclasses import dataclass

@dataclass

class LineEnergyResult:

q: np.ndarray # J/mm

power: np.ndarray # W

class LineEnergyModel:

"""

线能量 q = U * I / v (J/mm)

v: mm/s, I: A, U: V

"""

def __init__(self, eta: float = 0.85):

self.eta = eta # 电弧热效率

def compute(self, current, voltage, speed) -> LineEnergyResult:

cur = np.asarray(current, float)

vol = np.asarray(voltage, float)

spd = np.asarray(speed, float)

spd = np.clip(spd, 1.0, None)

power = self.eta * cur * vol

q = power / spd

return LineEnergyResult(q, power)

</details>

<details><summary></summary>

"""沿轨迹热积累求解器 (numpy + scipy)。"""

import numpy as np

from dataclasses import dataclass

from scipy.ndimage import gaussian_filter1d

@dataclass

class HeatField:

T_seg: np.ndarray # 各段峰值温度(相对基准)

T_accum: np.ndarray # 累积温度(含余热)

decay: float

class HeatAccumSolver:

"""

模型(教学级):

T_k = q_k * gain + T_{k-1} * exp(-dt/τ) + 横向扩散

τ 由板厚决定: 薄板τ大(散得慢)

"""

def __init__(self, thick_mm: float = 2.0,

base_temp: float = 25.0,

mat_gain: float = 0.9):

self.thick = thick_mm

self.t_base = base_temp

self.gain = mat_gain

# 板越薄, τ越大(余热留得久)

self.tau = 0.8 + (3.0 / max(thick_mm, 0.5)) * 0.6

def solve(self, q: np.ndarray, seg_len: np.ndarray,

speed: np.ndarray) -> HeatField:

n = len(q)

dt = seg_len / np.clip(speed, 1.0, None) # 每段耗时

decay = np.exp(-dt / self.tau)

T_seg = q * self.gain * 0.12

T_accum = np.zeros(n)

prev = 0.0

for k in range(n):

prev = prev * decay[k] + T_seg[k]

T_accum[k] = prev

# 横向热扩散平滑(邻段热串)

T_smooth = gaussian_filter1d(T_accum, sigma=0.8)

T_accum = T_accum + 0.15*(T_smooth - T_accum)

return HeatField(

T_seg + self.t_base,

T_accum + self.t_base,

float(np.mean(decay))

)

</details>

<details><summary></summary>

"""HAZ宽度映射 (scipy)。"""

import numpy as np

from dataclasses import dataclass

from scipy.interpolate import UnivariateSpline

@dataclass

class HAZResult:

haz_width: np.ndarray # mm

peak_T: np.ndarray

class HAZMappper:

"""

不锈钢相变参考温度 ~800℃

T_accum越高, HAZ越宽, 近似 sqrt(T-T0)

"""

def __init__(self, t_transition: float = 800.0,

base_temp: float = 25.0):

self.Tt = t_transition

self.t0 = base_temp

def map(self, T_accum: np.ndarray) -> HAZResult:

over = np.clip(T_accum - self.Tt, 0, None)

width = 1.2 + 0.18 * np.sqrt(over) # mm

width = np.clip(width, 1.2, 8.0)

spl = UnivariateSpline(np.arange(len(T_accum)), width, s=2)

w = spl(np.arange(len(T_accum)))

return HAZResult(w, T_accum)

</details>

<details><summary></summary>

"""角变形估算 (numpy)。"""

import numpy as np

from dataclasses import dataclass

@dataclass

class DistortionResult:

angle_deg: np.ndarray # 各段角变形当量

max_warp_mm: float # 等效端部翘曲mm

class DistortionEstimator:

"""

角变形 ∝ 热积累梯度积分 × 薄板放大系数

"""

def __init__(self, thick_mm: float = 2.0):

self.thick = thick_mm

self.thin_factor = (2.0 / max(thick_mm, 0.5)) ** 1.3

def estimate(self, T_accum: np.ndarray,

haz: np.ndarray) -> DistortionResult:

grad = np.gradient(T_accum)

accum_effect = np.cumsum(np.clip(grad, 0, None))

angle = 0.0009 * accum_effect * self.thin_factor + \

0.02 * (haz - 1.2)

angle = np.clip(angle, 0, None)

# 端部翘曲等效: 末段角变形投影

max_warp = float(angle[-1] * self.thick * 0.5)

return DistortionResult(angle, max_warp)

</details>

<details><summary></summary>

"""速度扫描器。"""

import numpy as np

import pandas as pd

from dataclasses import dataclass

from .line_energy_model import LineEnergyModel

from .heat_accum_solver import HeatAccumSolver

from .haz_mapper import HAZMappper

from .distortion_estimator import DistortionEstimator

@dataclass

class SpeedStat:

speed: float

q_mean: float

T_end: float

haz_end: float

warp_mm: float

grade: str

class SpeedSweeper:

def __init__(self, df: pd.DataFrame,

speeds: list = None):

self.df = df.copy()

self.speeds = speeds or [10,12,14,16,18,20]

self.len = WeldPathLoader_len(df)

def sweep(self) -> pd.DataFrame:

rows = []

for v in self.speeds:

df = self.df.copy()

df["speed"] = v

lem = LineEnergyModel()

le = lem.compute(df.current, df.voltage, df.speed)

hs = HeatAccumSolver(thick_mm=df.thick.iloc[0])

hf = hs.solve(le.q, self.len.values, df.speed.values)

hz = HAZMappper().map(hf.T_accum)

de = DistortionEstimator(thick_mm=df.thick.iloc[0])

dr = de.estimate(hf.T_accum, hz.haz_width)

w = dr.max_warp_mm

grade = "优" if w<=0.8 else ("良" if w<=2.0 else "超差")

rows.append({

"speed": v,

"q_mean": float(le.q.mean()),

"T_end": float(hf.T_accum[-1]),

"haz_end": float(hz.haz_width[-1]),

"warp_mm": w,

"grade": grade,

})

return pd.DataFrame(rows)

def WeldPathLoader_len(df):

from .weld_path_loader import WeldPathLoader

return WeldPathLoader().seg_length(df)

</details>

<details><summary></summary>

"""变形等级分类 (sklearn)。"""

import numpy as np

import pandas as pd

from typing import Dict

from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import cross_val_score, KFold

class DistortionClassifier:

"""优(≤0.8mm)/良(0.8~2mm)/超差(>2mm)。"""

def __init__(self, random_state: int = 42):

self.model_ = None

self.feat = ["speed", "T_end", "haz_end", "thick", "q_mean"]

@staticmethod

def _label(w: float) -> str:

if w <= 0.8: return "优"

if w <= 2.0: return "良"

return "超差"

def fit(self, df: pd.DataFrame, warp_arr: np.ndarray):

y = np.array([self._label(w) for w in warp_arr])

self.model_ = RandomForestClassifier(

n_estimators=300, max_depth=6, min_samples_leaf=2,

random_state=42, n_jobs=-1)

self.model_.fit(df[self.feat].values, y)

return self

def cv(self, df: pd.DataFrame, warp_arr: np.ndarray) -> Dict:

y = np.array([self._label(w) for w in warp_arr])

kf = KFold(5, shuffle=True, random_state=42)

sc = cross_val_score(self.model_, df[self.feat].values, y,

cv=kf, scoring="f1_macro")

imp = dict(zip(self.feats(), self.model_.feature_importances_))

return {"f1_macro": float(sc.mean()),

"importance": dict(sorted(imp.items(),

key=lambda x:x[1], reverse=True))}

def feats(self):

return self.feat

def predict(self, df: pd.DataFrame) -> np.ndarray:

return self.model_.predict(df[self.feat].values)

</details>

<details><summary></summary>

"""焊接热场可视化 (matplotlib + networkx)。"""

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from pathlib import Path

import networkx as nx

plt.rcParams["font.sans-serif"] = ["SimHei", "WenQuanYi Micro Hei", "DejaVu Sans"]

plt.rcParams["axes.unicode_minus"] = False

GRADE = {"优":"#27AE60","良":"#F39C12","超差":"#E74C3C"}

class WeldViz:

def __init__(self, results_dir: str = "results"):

self.results_dir = Path(results_dir)

self.results_dir.mkdir(exist_ok=True)

def path_heat_cloud(self, df, T_accum, title="轨迹热积累云图"):

fig, ax = plt.subplots(figsize=(11,5))

x = df.x.values; y = df.y.values

sc = ax.scatter(x, y, c=T_accum, cmap="jet",

s=120, edgecolors="k", linewidths=0.4)

ax.plot(x, y, color="#333", lw=1, alpha=0.5)

for i,t in enumerate(T_accum):

ax.text(x[i], y[i]+1, f"{t:.0f}℃", fontsize=7, ha="center")

plt.colorbar(sc, ax=ax, label="累积温度 ℃")

ax.set_title(f"{title} (末段发红=热积累)",

fontsize=13, fontweight="bold")

ax.set_aspect("equal"); ax.grid(alpha=0.2)

plt.tight_layout()

plt.savefig(self.results_dir/"path_heat_cloud.png",

dpi=150, bbox_inches="tight")

plt.close()

def speed_curve(self, sweep_df):

fig, ax1 = plt.subplots(figsize=(11,6))

ax1.plot(sweep_df.speed, sweep_df.T_end, "o-", color="#E74C3C", lw=2,

label="末段热积累℃")

ax1.plot(sweep_df.speed, sweep_df.haz_end, "s--", color="#8E44AD",

label="末段HAZ宽mm")

ax2 = ax1.twinx()

ax2.plot(sweep_df.speed, sweep_df.warp_mm, "^-", color="#2980B9", lw=2,

label="端部翘曲mm")

# 临界速度标注

ok = sweep_df[sweep_df.grade.isin(["优","良"])]

if len(ok):

cv = ok.speed.min()

ax2.axvline(cv, color="#27AE60", ls=":", lw=2,

label=f"临界速度{cv}mm/s")

ax1.set_xlabel("焊接速度 (mm/s)", fontsize=12)

ax1.set_ylabel("温度℃ / HAZ mm", fontsize=12)

ax2.set_ylabel("翘曲 mm", fontsize=12)

ax1.set_title("速度-热积累-变形对比曲线",

fontsize=13, fontweight="bold")

l1,la1=ax1.get_legend_handles_labels()

l2,la2=ax2.get_legend_handles_labels()

ax1.legend(l1+l2, la1+la2, loc="upper right")

ax1.grid(alpha=0.3)

plt.tight_layout()

plt.savefig(self.results_dir/"speed_distortion_curve.png",

dpi=150, bbox_inches="tight")

plt.close()

def haz_profile(self, df, haz):

fig, ax = plt.subplots(figsize=(11,5))

ax.plot(df.seg, haz, "o-", color="#8E44AD", lw=2)

ax.axhline(1.2, color="#27AE60", ls="--", label="基准HAZ 1.2mm")

ax.set_xlabel("轨迹段号", fontsize=12)

ax.set_ylabel("HAZ宽度 (mm)", fontsize=12)

ax.set_title("HAZ宽度沿轨迹分布", fontsize=13, fontweight="bold")

ax.legend(); ax.grid(alpha=0.3)

plt.tight_layout()

plt.savefig(self.results_dir/"haz_profile.png",

dpi=150, bbox_inches="tight")

plt.close()

def chain_network(self, df, T_accum, warp):

fig, ax = plt.subplots(figsize=(11,6))

G = nx.DiGraph()

prev=None

for i,(_,r) in enumerate(df.iterrows()):

n=f"S{r.seg}"

G.add_node(n, val=float(T_accum[i]))

if prev: G.add_edge(prev,n,weight=float(T_accum[i]))

prev=n

G.add_node("热积累", bipartite=1)

G.add_node("HAZ", bipartite=1)

G.add_node("角变形", bipartite=1)

for n in list(G.nodes)[:8]:

G.add_edge(n,"热积累")

G.add_edge("热积累","HAZ"); G.add_edge("HAZ","角变形")

pos=nx.spring_layout(G,seed=42,k=0.9)

nx.draw_networkx_nodes(G,pos,

nodelist=[n for n in G if str(n).startswith("S")],

node_color="#2980B9",node_size=500,ax=ax)

nx.draw_networkx_nodes(G,pos,nodelist=["热积累","HAZ","角变形"],

node_color="#E67E22",node_size=1200,ax=ax)

nx.draw_networkx_edges(G,pos,arrowsize=18,edge_color="#888",ax=ax)

nx.draw_networkx_labels(G,pos,font_size=8,ax=ax)

ax.set_title("轨迹段-热积累-HAZ-变形关联链",

fontsize=14,fontweight="bold")

ax.axis("off")

plt.tight_layout()

plt.savefig(self.results_dir/"heat_chain_network.png",

dpi=150,bbox_inches="tight")

plt.close()

def pred_scatter(self, y_true, y_pred):

fig, ax = plt.subplots(figsize=(8,8))

labels=["优","良","超差"]

ct=np.array([labels.index(y) for y in y_true])

cp=np.array([labels.index(y) for y in y_pred])

ax.scatter(ct,cp,c="#2980B9",s=50,edgecolors="k",alpha=0.8)

ax.plot([-0.5,2.5],[-0.5,2.5],"r--",lw=2,label="理想")

ax.set_xticks([0,1,2]);ax.set_xticklabels(labels)

ax.set_yticks([0,1,2]);ax.set_yticklabels(labels)

ax.set_xlabel("实际等级",fontsize=12)

ax.set_ylabel("预测等级",fontsize=12)

ax.set_title("变形等级 预测vs实际",fontsize=13,fontweight="bold")

ax.legend();ax.grid(alpha=0.3)

plt.tight_layout()

plt.savefig(self.results_dir/"distort_pred_scatter.png",

dpi=150,bbox_inches="tight")

plt.close()

def temp_evolution(self, T_list, speeds):

fig, ax = plt.subplots(figsize=(11,5))

for T,v in zip(T_list, speeds):

ax.plot(np.arange(len(T)), T, lw=1.6, label=f"{v}mm/s")

ax.set_xlabel("轨迹段", fontsize=12)

ax.set_ylabel("累积温度 ℃", fontsize=12)

ax.set_title("各速度方案沿轨迹温度演化",

fontsize=13, fontweight="bold")

ax.legend(); ax.grid(alpha=0.3)

plt.tight_layout()

plt.savefig(self.results_dir/"temp_evolution.png",

dpi=150,bbox_inches="tight")

plt.close()

</details>

<details><summary></summary>

"""合成焊接轨迹。"""

import numpy as np

import pandas as pd

from pathlib import Path

from typing import Optional

class SyntheticWeldPath:

"""

8段长直角缝, 2mm薄壁不锈钢

默认速度12mm/s, 电流180A, 电压22V

"""

def __init__(self, rng: Optional[np.random.RandomState] = None):

self.rng = rng or np.random.RandomState(42)

def generate(self, out_path: str = "weld_path.csv",

n_seg: int = 8) -> pd.DataFrame:

xs = np.linspace(0, 320, n_seg+1)

ys = np.zeros(n_seg+1)

zs = np.full(n_seg+1, 2.0)

rows=[]

for i in range(n_seg):

rows.append({

"seg": i+1,

"x": round(xs[i+1],2),

"y": 0.0,

"z": 2.0,

"thick": 2.0,

"material": "SUS304",

"current": 180,

"voltage": 22,

"speed": 12.0,

})

df = pd.DataFrame(rows)

Path(out_path).parent.mkdir(parents=True, exist_ok=True)

df.to_csv(out_path, index=False, encoding="utf-8")

return df

</details>

<details><summary></summary>

"""

机器人焊接轨迹热积累仿真: 速度参数→线能量→热积累→HAZ→变形

================================================================================

课程映射(滨州职业学院《先进制造技术》):

工业机器人技术基础:弧焊轨迹/焊接参数/路径规划

先进制造技术基础:热变形/几何精度

数控加工与CAD/CAM:路径离散化思想

智能制造与数字孪生:焊接热场看板

先进制造新模式:数据驱动速度优化

技术栈(严格):

pandas / numpy # 轨迹表/线能量/热累积

scipy # 高斯平滑/样条

scikit-learn # RF变形分级

matplotlib / networkx# 热云图+关联链

"""

import sys, os

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

import numpy as np

import pandas as pd

from pathlib import Path

from weld_heat_sim.weld_path_loader import WeldPathLoader

from weld_heat_sim.synthetic_weld_path import SyntheticWeld

利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询