尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

python的先进制造技术工业场景模拟第二篇:导入机器人点位坐标数据集,筛选超出安全工作区间的坐标点,输出异常点位数量。

python的先进制造技术工业场景模拟第二篇:导入机器人点位坐标数据集,筛选超出安全工作区间的坐标点,输出异常点位数量。 周二下午两点机器人工作站。又撞了。维修班长老赵蹲在发那科机器人底座旁边手指着末端执行器上的一道新鲜刮痕今早自动运行时第六轴带着抓手直接怼到了夹具底座上。限位报警停机四十分钟。工艺工程师小周把笔记本电脑转过来我查了昨天导入的点位数据集——从 CAD 离线编程软件导出的 500 个目标点CSV 格式。我肉眼翻了前几十条没看出问题就直接下发了。结果……500 个点你肉眼翻我拉开椅子坐下你有没有先写个程序把每个点的坐标跟机器人的安全工作区间比对一下超出去的标红、计数、报警小周愣了一下那个……我都是靠离线编程软件自带的仿真检查。但这次夹具改了位置安全工作区间变了软件里还是旧参数。这就是问题。我打开 VS Code离线编程软件的仿真环境是理想化的。实际现场夹具改了、底座垫高了、甚至机器人安装面不平——这些变动不会自动同步到软件里。你需要在部署前用 Python 把点位数据集拉进来跟现场实际的安全工作区间做一遍比对筛出超限点数清楚有多少个具体是哪些。我敲了几行代码import pandas as pdimport numpy as np# 读取点位数据集df pd.read_csv(robot_points.csv)# 安全工作区间现场实测workspace {x_min: -800, x_max: 800,y_min: -600, y_max: 600,z_min: 100, z_max: 1200}# 筛选超限点mask ((df[x] workspace[x_min]) | (df[x] workspace[x_max]) |(df[y] workspace[y_min]) | (df[y] workspace[y_max]) |(df[z] workspace[z_min]) | (df[z] workspace[z_max]))outliers df[mask]print(f异常点位数量: {len(outliers)})# 异常点位数量: 23这只是核心逻辑我说完整版会用 OOP 封装一个类管点位数据加载一个类管安全工作区间定义和校验一个类管异常筛选和统计一个类管可视化——把异常点在 3D 散点图上标红。数据自包含用 numpy 合成一份点位 CSV读者下载就能跑。老赵站起身所以你这东西本质上就是给机器人点位做体检——500 个体检完23 个不合格告诉你具体是谁、超了哪个方向。对。而且不用停机、不用冒碰撞风险在电脑里跑 3 秒钟就出结果。一、实际应用场景真实痛点场景设定工业机器人工作站从离线编程软件导出目标点位数据集CSV 格式含 X/Y/Z 坐标需要与实际现场的安全工作区间比对筛出超限点并统计数量。现场常见痛点离线编程软件中的工作区间参数与实际现场不同步夹具改动、机器人基座偏移等直接下发未校验的点位数据可能导致机器人碰撞、限位报警、停机损失。现场原话叙事化我不是没有检查小周说离线软件里仿真过了轨迹是通的。但我忘了夹具上周改了位置——底座加高了 50mm软件里还是旧尺寸。结果机器人按旧坐标走第六轴直接撞上去。你需要的是部署前的最后一道防线我说不管离线软件怎么仿的点位数据到现场之后用 Python 跟实际安全工作区间比一遍。超出去的一个都别放过。核心矛盾离线编程的理想化点位与现场实际物理约束之间的不匹配。需要一个机器人点位安全区间校验程序用pandas 导入点位数据集用numpy 做向量化区间校验用matplotlib 做 3D 可视化标注快速输出异常点位数量和明细。二、痛点分析映射到滨州职业学院《先进制造技术》课程模型《先进制造技术》模块 本篇痛点对应工业机器人技术基础机器人运动学与工作空间 安全工作区间校验机器人末端执行器必须在限定空间内运动超限点位是碰撞风险的直接来源。先进制造技术基础先进制造系统安全规范 安全边界定义任何自动化设备都需明确安全作业范围点位校验是安全规范的数字落地。智能制造与数字孪生虚拟-现实映射一致性 从离线仿真到现场部署的最后一公里虚拟环境中的点位必须校验与物理环境的一致性。柔性制造系统FMS与先进生产管理生产安全管理 防错机制在自动生产前通过软件手段拦截异常减少非计划停机。一句话总结我们需要构建一个机器人点位安全区间校验程序用pandas 导入点位 CSV用numpy 向量化筛选超限坐标点用matplotlib 绘制 3D 散点图标注异常输出异常点位数量和明细为机器人工作站提供部署前的安全防线。三、核心逻辑讲解大白话3.1 问题本质把点位校验想象成快递柜格子把机器人的安全工作区间想象成小区里的快递柜* 点位数据集 你要放的 500 个包裹每个包裹有长、宽、高三个尺寸对应 X、Y、Z 坐标。* 安全工作区间 快递柜的格子大小格子有最大长宽高包裹放进去不能冒出来。* 超限点 放不进去的包裹太大了塞不进格子硬塞就会卡住碰撞。* 校验程序 自动量尺寸不用你一个一个量程序 3 秒钟把 500 个包裹全量完告诉你哪些放不进去、有几个。工业应用* pandas 导入read_csv() 一行读取 500 个点的坐标。* numpy 向量化校验不用 for 循环逐个比用布尔索引一次性筛出所有超限点。* matplotlib 3D 图把正常点画成蓝色超限点画成红色一眼看出哪些点跑到了安全框外面。3.2 业务逻辑 → 代码映射定义点位数据模型│▼ PointCloudLoader (pandas)导入点位 CSVpd.read_csv(robot_points.csv)解析 X, Y, Z 列│▼ WorkspaceValidator (numpy)定义安全工作区间x ∈ [-800, 800], y ∈ [-600, 600], z ∈ [100, 1200]向量化校验mask (X x_min) | (X x_max) | ...筛选超限点统计异常数量│▼ OutlierReporter输出异常明细异常点位的索引、坐标、超限方向异常数量汇总│▼ Visualizer (matplotlib)3D 可视化1. 正常点位蓝色散点2. 异常点位红色散点放大标记3. 安全工作区间线框半透明立方体│▼ SyntheticDataGenerator (numpy)合成数据生成用 numpy 在安全工作区间内生成正常点在区间外生成超限点确保数据自包含、可复现3.3 为什么用向量化而不是 for 循环* 问题500 个点用 for 循环逐个if 判断代码啰嗦速度慢。* 处理策略numpy 布尔索引一次性对所有点做逻辑运算速度提升 10 倍以上代码只有一行。* 工程合理性工业现场动辄上万点位喷涂、焊接轨迹向量化是必备技能。3.4 校验前后对比维度 人工/离线软件检查 Python 程序校验检查速度 500 个点需数十分钟 3 秒完成准确性 依赖人眼易遗漏 100% 覆盖现场同步 需手动更新软件参数 直接输入现场实测区间输出结果 看起来没问题 异常点 23 个明细列表四、OOP 代码实现4.1 项目结构robot_workspace_check/├── robot_workspace_check/│ ├── __init__.py│ ├── point_loader.py # 点位数据加载│ ├── workspace_validator.py # 安全工作区间校验│ ├── outlier_reporter.py # 异常报告生成│ ├── visualizer.py # 3D 可视化│ └── synthetic_data.py # 合成数据生成├── tests/│ ├── __init__.py│ └── test_workspace_check.py # 单元测试├── results/│ ├── workspace_3d.png # 3D 散点图│ ├── outlier_summary.csv # 异常点位明细│ └── check_report.txt # 校验报告└── run_check.py # 主程序入口4.2 核心源码detailssummary/summary机器人点位数据加载器import pandas as pdfrom pathlib import Pathfrom typing import Optional, Listclass PointCloudLoader:点位数据集加载器支持从 CSV 文件读取机器人目标点位坐标。def __init__(self, filepath: str, encoding: str utf-8):self.filepath Path(filepath)self.encoding encodingself._raw_df: Optional[pd.DataFrame] Nonedef load(self,x_col: str x,y_col: str y,z_col: str z) - pd.DataFrame:加载点位 CSVParameters----------x_col, y_col, z_col : str坐标列名Returns-------pd.DataFrame包含 X, Y, Z 列的数据框if not self.filepath.exists():raise FileNotFoundError(f文件不存在: {self.filepath})self._raw_df pd.read_csv(self.filepath, encodingself.encoding)# 列名标准化col_map {}for target, aliases in [(x_col, [X, x_coord, pos_x, PX]),(y_col, [Y, y_coord, pos_y, PY]),(z_col, [Z, z_coord, pos_z, PZ]),]:if target not in self._raw_df.columns:for alias in aliases:if alias in self._raw_df.columns:col_map[alias] targetbreakif col_map:self._raw_df self._raw_df.rename(columnscol_map)required [x_col, y_col, z_col]missing [c for c in required if c not in self._raw_df.columns]if missing:raise ValueError(f缺少必要的坐标列: {missing})return self._raw_df[required].copy()def get_raw_data(self) - Optional[pd.DataFrame]:return self._raw_df.copy() if self._raw_df is not None else None/detailsdetailssummary/summary安全工作区间校验器import numpy as npimport pandas as pdfrom dataclasses import dataclassfrom typing import Dict, Optionaldataclassclass WorkspaceBounds:安全工作区间边界x_min: float -800.0x_max: float 800.0y_min: float -600.0y_max: float 600.0z_min: float 100.0z_max: float 1200.0def __post_init__(self):if self.x_min self.x_max:raise ValueError(x_min 必须小于 x_max)if self.y_min self.y_max:raise ValueError(y_min 必须小于 y_max)if self.z_min self.z_max:raise ValueError(z_min 必须小于 z_max)class WorkspaceValidator:机器人安全工作区间校验器使用 numpy 向量化运算快速筛选超限点位。def __init__(self, bounds: Optional[WorkspaceBounds] None):self.bounds bounds or WorkspaceBounds()def validate(self, df: pd.DataFrame,x_col: str x,y_col: str y,z_col: str z) - pd.DataFrame:校验所有点位Parameters----------df : pd.DataFrame点位数据x_col, y_col, z_col : str坐标列名Returns-------pd.DataFrame包含校验结果的原始数据新增 is_outlier 列coords df[[x_col, y_col, z_col]].values.astype(float)b self.bounds# 向量化区间校验outlier_mask ((coords[:, 0] b.x_min) | (coords[:, 0] b.x_max) |(coords[:, 1] b.y_min) | (coords[:, 1] b.y_max) |(coords[:, 2] b.z_min) | (coords[:, 2] b.z_max))result df.copy()result[is_outlier] outlier_maskresult[outlier_reason] result.apply(lambda row: self._get_reason(row[x_col], row[y_col], row[z_col]),axis1)return resultdef _get_reason(self, x: float, y: float, z: float) - str:获取超限原因reasons []b self.boundsif x b.x_min:reasons.append(fX{x:.1f}{b.x_min})elif x b.x_max:reasons.append(fX{x:.1f}{b.x_max})if y b.y_min:reasons.append(fY{y:.1f}{b.y_min})elif y b.y_max:reasons.append(fY{y:.1f}{b.y_max})if z b.z_min:reasons.append(fZ{z:.1f}{b.z_min})elif z b.z_max:reasons.append(fZ{z:.1f}{b.z_max})return ; .join(reasons) if reasons else OKdef count_outliers(self, df: pd.DataFrame) - int:统计异常点位数量if is_outlier not in df.columns:raise ValueError(请先调用 validate() 进行校验)return int(df[is_outlier].sum())def get_outliers(self, df: pd.DataFrame) - pd.DataFrame:获取异常点位明细if is_outlier not in df.columns:raise ValueError(请先调用 validate() 进行校验)return df[df[is_outlier]].copy()/detailsdetailssummary/summary异常报告生成器import pandas as pdfrom pathlib import Pathfrom typing import Dictclass OutlierReporter:异常点位报告生成器def __init__(self, output_dir: str results):self.output_dir Path(output_dir)self.output_dir.mkdir(exist_okTrue)def generate_summary(self, df: pd.DataFrame,total_count: int) - Dict:生成异常汇总Parameters----------df : pd.DataFrame校验后的数据含 is_outlier 列total_count : int总点位数Returns-------dict汇总信息outlier_df df[df[is_outlier]]outlier_count len(outlier_df)ratio outlier_count / total_count * 100 if total_count 0 else 0summary {total_points: total_count,outlier_count: outlier_count,outlier_ratio_percent: ratio,normal_count: total_count - outlier_count,}return summarydef save_outlier_details(self, df: pd.DataFrame,filepath: str outlier_summary.csv) - None:保存异常点位明细到 CSVoutlier_df df[df[is_outlier]]output_path self.output_dir / filepathoutlier_df.to_csv(output_path, indexFalse, encodingutf-8)def print_report(self, summary: Dict) - None:打印文本报告lines [ * 60,机器人点位安全区间校验报告, * 60,f\n总点位数: {summary[total_points]},f异常点位数: {summary[outlier_count]},f异常比例: {summary[outlier_ratio_percent]:.1f}%,f正常点位数: {summary[normal_count]},\n * 60,]report \n.join(lines)print(report)report_path self.output_dir / check_report.txtwith open(report_path, w, encodingutf-8) as f:f.write(report)/detailsdetailssummary/summary3D 可视化器import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom pathlib import Pathfrom typing import Optionalplt.rcParams[font.sans-serif] [SimHei, DejaVu Sans]plt.rcParams[axes.unicode_minus] Falseclass Visualizer:机器人工作区间 3D 可视化def __init__(self, results_dir: str results):self.results_dir Path(results_dir)self.results_dir.mkdir(exist_okTrue)def plot_workspace_3d(self, df: pd.DataFrame,bounds,x_col: str x,y_col: str y,z_col: str z,title: str 机器人点位安全区间校验) - None:绘制 3D 散点图Parameters----------df : pd.DataFrame校验后的数据含 is_outlier 列bounds : WorkspaceBounds安全工作区间x_col, y_col, z_col : str坐标列名title : str图表标题fig plt.figure(figsize(10, 8))ax fig.add_subplot(111, projection3d)# 正常点normal df[~df[is_outlier]]ax.scatter(normal[x_col], normal[y_col], normal[z_col],c#3498DB, s15, alpha0.6, label正常点位)# 异常点outliers df[df[is_outlier]]if len(outliers) 0:ax.scatter(outliers[x_col], outliers[y_col], outliers[z_col],c#E74C3C, s40, marker^, zorder5,labelf异常点位 ({len(outliers)}个))# 安全区间线框半透明立方体self._draw_workspace_cube(ax, bounds)ax.set_xlabel(X (mm))ax.set_ylabel(Y (mm))ax.set_zlabel(Z (mm))ax.set_title(title, fontsize13, fontweightbold)ax.legend(fontsize9)plt.tight_layout()plt.savefig(self.results_dir / workspace_3d.png,dpi150, bbox_inchestight)plt.close()def _draw_workspace_cube(self, ax, bounds):绘制安全区间线框x_edges [bounds.x_min, bounds.x_max]y_edges [bounds.y_min, bounds.y_max]z_edges [bounds.z_min, bounds.z_max]# 立方体的 12 条边edges [# 底面([x_edges[0], x_edges[1]], [y_edges[0], y_edges[0]], [z_edges[0], z_edges[0]]),([x_edges[1], x_edges[1]], [y_edges[0], y_edges[1]], [z_edges[0], z_edges[0]]),([x_edges[1], x_edges[0]], [y_edges[1], y_edges[1]], [z_edges[0], z_edges[0]]),([x_edges[0], x_edges[0]], [y_edges[1], y_edges[0]], [z_edges[0], z_edges[0]]),# 顶面([x_edges[0], x_edges[1]], [y_edges[0], y_edges[0]], [z_edges[1], z_edges[1]]),([x_edges[1], x_edges[1]], [y_edges[0], y_edges[1]], [z_edges[1], z_edges[1]]),([x_edges[1], x_edges[0]], [y_edges[1], y_edges[1]], [z_edges[1], z_edges[1]]),([x_edges[0], x_edges[0]], [y_edges[1], y_edges[0]], [z_edges[1], z_edges[1]]),# 侧面竖线([x_edges[0], x_edges[0]], [y_edges[0], y_edges[0]], [z_edges[0], z_edges[1]]),([x_edges[1], x_edges[1]], [y_edges[0], y_edges[0]], [z_edges[0], z_edges[1]]),([x_edges[1], x_edges[1]], [y_edges[1], y_edges[1]], [z_edges[0], z_edges[1]]),([x_edges[0], x_edges[0]], [y_edges[1], y_edges[1]], [z_edges[0], z_edges[1]]),]for x, y, z in edges:ax.plot(x, y, z, color#2C3E50, linewidth1.0,alpha0.4, linestyle--)/detailsdetailssummary/summary合成数据生成器import numpy as npimport pandas as pdfrom pathlib import Pathfrom typing import Optional, Tupleclass SyntheticDataGenerator:合成机器人点位数据生成器生成包含正常点和安全区间外异常点的模拟数据集。def __init__(self, rng: Optional[np.random.RandomState] None):self.rng rng or np.random.RandomState(42)def generate(self,n_points: int 500,bounds: Optional[Tuple] None,outlier_ratio: float 0.05,output_path: str robot_points.csv) - pd.DataFrame:生成合成点位数据Parameters----------n_points : int总点位数bounds : tuple, optional(x_min, x_max, y_min, y_max, z_min, z_max)outlier_ratio : float异常点比例output_path : str输出 CSV 路径Returns-------pd.DataFrameif bounds is None:bounds (-800, 800, -600, 600, 100, 1200)x_min, x_max, y_min, y_max, z_min, z_max boundsn_outliers int(n_points * outlier_ratio)n_normal n_points - n_outliers# 正常点均匀分布在工作区间内x_normal self.rng.uniform(x_min * 0.7, x_max * 0.7, n_normal)y_normal self.rng.uniform(y_min * 0.7, y_max * 0.7, n_normal)z_normal self.rng.uniform(z_min * 1.05, z_max * 0.9, n_normal)# 异常点在区间外随机生成x_out np.concatenate([self.rng.uniform(x_min - 200, x_min - 10, n_outliers // 6),self.rng.uniform(x_max 10, x_max 200, n_outliers // 6),self.rng.uniform(x_min * 0.5, x_max * 0.5, n_outliers - 2 * (n_outliers // 6)),])y_out np.concatenate([self.rng.uniform(y_min - 150, y_min - 10, n_outliers // 6),self.rng.uniform(y_max 10, y_max 150, n_outliers // 6),self.rng.uniform(y_min * 0.5, y_max * 0.5, n_outliers - 2 * (n_outliers // 6)),])z_out np.concatenate([self.rng.uniform(z_min - 80, z_min - 5, n_outliers // 6),self.rng.uniform(z_max 5, z_max 200, n_outliers // 6),self.rng.uniform(z_min * 0.5, z_max * 0.5, n_outliers - 2 * (n_outliers // 6)),])x np.concatenate([x_normal, x_out[:n_outliers]])y np.concatenate([y_normal, y_out[:n_outliers]])z np.concatenate([z_normal, z_out[:n_outliers]])# 打乱顺序shuffle_idx self.rng.permutation(n_points)df pd.DataFrame({point_id: np.arange(n_points),x: x[shuffle_idx],y: y[shuffle_idx],z: z[shuffle_idx],})output_path Path(output_path)output_path.parent.mkdir(parentsTrue, exist_okTrue)df.to_csv(output_path, indexFalse, encodingutf-8)return df/detailsdetailssummary/summary机器人点位安全区间校验程序课程映射滨州职业学院《先进制造技术》工业机器人技术基础机器人工作空间与安全边界先进制造技术基础先进制造系统安全规范智能制造与数字孪生虚拟-现实映射一致性校验FMS与先进生产管理生产安全管理防错机制技术栈严格pandas # 点位数据加载与处理numpy # 向量化区间校验matplotlib # 3D 散点图可视化import sysimport ossys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))import numpy as npimport pandas as pdfrom pathlib import Pathfrom robot_workspace_check.point_loader import PointCloudLoaderfrom robot_workspace_check.workspace_validator import (WorkspaceValidator, WorkspaceBounds)from robot_workspace_check.outlier_reporter import OutlierReporterfrom robot_workspace_check.visualizer import Visualizerfrom robot_workspace_check.synthetic_data import SyntheticDataGeneratordef main():主程序print( * 70)print(机器人点位安全区间校验程序)print( * 70)results_dir Path(results)results_dir.mkdir(exist_okTrue)# 1. 生成合成数据print(\n[1/5] 生成合成点位数据...)generator SyntheticDataGenerator(rngnp.random.RandomState(42))bounds_tuple (-800, 800, -600, 600, 100, 1200)csv_path robot_points.csvdf_raw generator.generate(n_points500,boundsbounds_tuple,outlier_ratio0.05,output_pathcsv_path,)print(f 生成 {len(df_raw)} 个点位含约 5% 异常点)# 2. 加载数据print(\n[2/5] 加载点位数据...)loader PointCloudLoader(csv_path)df loader.load()print(f 加载 {len(df)} 个点位)# 3. 校验安全区间print(\n[3/5] 校验安全工作区间...)bounds WorkspaceBounds(*bounds_tuple)validator WorkspaceValidator(bounds)df_checked validator.validate(df)outlier_count validator.count_outliers(df_checked)print(f 安全工作区间: X[{bounds.x_min},{bounds.x_max}] fY[{bounds.y_min},{bounds.y_max}] fZ[{bounds.z_min},{bounds.z_max}])print(f 异常点位数量: {outlier_count})# 4. 生成报告print(\n[4/5] 生成校验报告...)reporter OutlierReporter(str(results_dir))summary reporter.generate_summary(df_checked, total_countlen(df))reporter.print_report(summary)reporter.save_outlier_details(df_checked)# 5. 可视化print(\n[5/5] 生成 3D 可视化...)vis Visualizer(str(results_dir))vis.plot_workspace_3d(df_checked, bounds)print(f 3D 图已保存: {results_dir / workspace_3d.png})print(f\n{*70})print(校验完成结果已保存至 results/ 目录)print(f{*70})if __name__ __main__:main()/detailsdetailssummary/summaryimport sysimport ossys.path.ins利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛
返回列表