周五白班,焊接单元旁。
“师傅,这批薄壁支架焊完又变形了,角缝鼓包,”焊工老周指着工件,“工艺卡写焊接速度 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解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!