NX CAM二次开发:批量创建电极程序组的C#实现

做模具编程的朋友应该都有这种体会——一套模具下来,电极少说十几个,多的时候四五十个。每个电极在程序顺序视图里至少要建粗加工、精加工、清角三个程序组,命名还得严格按照项目规范来。以前我都是手动在NX里一个个新建、一个个改名,点到手酸不说,还偶尔把编号打错。后来接触UG CAM API二次开发,针对批量创建程序组这个需求写了一个小工具:只要输入一个初始程序组名,比如ELEC01,再填上需要几个组,工具就自动生成ELEC01_001、ELEC01_002、ELEC01_003……一直建到你要求的数量,整个过程几秒钟搞定。

这篇文章把我这版工具的关键写法拆开来讲,包括程序组在NX CAM对象模型里的位置、NCGroup那几个容易混淆的API怎么选、核心的C#循环创建代码,以及我在实测过程中遇到的重名、界面刷新、版本差异等坑。适合正在做NXOpen.CAM二次开发、或者想把CAM编程重复劳动自动化的工程师阅读。如果你刚接触二次开发,第一章对对象模型的梳理也能帮你快速建立起认知框架。

1. 程序组在NX CAM里的角色,以及重复建组为什么必须自动化

1.1 程序组是什么:CAM树里的"文件夹"

NX CAM的"程序顺序视图"(Program Order View)是一个树状结构,树的顶端是PROGRAM节点,下面可以挂很多程序组(Program Group),程序组下面再挂具体的刀路操作(Operation)。简单说,程序组就是管理刀路的文件夹:一个程序组可以对应一个电极、一个工件、或者一道工序;组里挂的操作就是针对这个对象加工时用到的所有刀路。

如果你在NX里打开程序顺序视图,看到的其实是这样的层次:

  • PROGRAM(根节点)
    • ELEC01_001(程序组)
      • CAVITY_MILL(操作)
      • ZLEVEL_PROFILE(操作)
    • ELEC01_002(程序组)
      • CAVITY_MILL(操作)
      • FINISH_WALL(操作)

程序组为什么这么重要?因为后处理输出的时候,你通常是选中一个程序组整组输出,生成的NC程序文件按组名来命名。也就是说,程序组名直接决定了NC程序的文件名和组织方式。组名起得好、结构清晰,后续上机、找程序、追溯都方便;组名乱七八遭,哪怕刀路本身没问题,也会给你带来一堆麻烦。

1.2 手动创建程序组的真实痛点

只建两三个组,手动确实不麻烦:右键PROGRAM节点,Insert → Program Group,输入名字,几秒钟的事。但真实生产里往往不是两三个。

我自己接触最多的场景是电极编程。一套模具的电极少说十几二十个,多的时候五六十个。每个电极按工艺规范至少要分粗加工、精加工、清角三个组,而且命名有严格规则,比如电极编号+工序类型。如果一个一个手动建,半小时的工作量是跑不掉的。

更头疼的是两点。第一,命名规范执行不严格,不同操作员建出来的组名风格经常不一致,有的用下划线,有的不用,有的中文,有的英文。第二,编号容易跳或者重复。批量创建程序组看着是小事,一旦编号和后处理文件名对不上,后面查程序就是灾难。

所以从这个角度回头看,程序组批量创建的需求不是锦上添花,而是CAM自动化里绕不开的一环。它是一个典型的"重复性、规则性、易错性"三合一操作,完全符合二次开发自动化的条件。

1.3 批量创建的整体方案设计

整个方案说起来其实很简单:给定一个初始程序组名,再加一个数量,程序按命名规则自动递增生成。但落到具体代码上,需要拆成几步:

  1. 先取到当前部件的CAM Setup;
  2. 收集CAM树里已有的程序组名称,避免创建时重名报错;
  3. 按"初始名 + 序号"循环生成名称;
  4. 调用NXOpen.CAM的创建接口,把组建出来;
  5. 可选:指定父组,把新组挂到指定节点下面。

这套逻辑看着简单,但有几个隐藏问题值得专门讲。比如名称冲突怎么处理、不同NX版本API变了怎么办、创建后导航器不刷新怎么办。这些我都会在后面的章节里逐一说明。

2. NCGroup对象模型解析:几种易混淆API的正确选型

2.1 NXOpen.CAM里和程序组强相关的几个类

动手写代码之前,强烈建议先把NXOpen.CAM命名空间里这几个类的关系搞清楚,否则很容易在API选择上原地打转。

类作用生活化类比
CAMSession当前NX会话里CAM功能的总入口总电源开关
CAMSetup当前部件对应的加工设置(Setup)这台工件的加工档案夹
NCGroup一个程序组节点档案夹里的一个文件夹
NCGroupCollection管理所有NCGroup的集合对象装所有文件夹的目录柜
CAMObjectCollection通用的CAM对象集合,可创建Operation/Method/Program等万能工具箱

很多教程里说的"创建程序组",本质上就是拿到CAMSetup之后,通过NCGroupCollection或者CAMObjectCollection去创建一个NCGroup节点。节点没有刀路数据,也没有后处理文件,它只是一个容器。真正装刀路的是它下面的Operation对象。理解这一点,后面用API的时候就不会想当然。

2.2 创建程序组:两种主流写法怎么选

我实际开发中用过两种写法,都能达到目的,但在不同NX版本里的可用性有差异。

写法A,直接通过NCGroupCollection创建,语义最明确:

CAM.NCGroup group = camSetup.NCGroupCollection.Create(name);

写法B,通过CAMObjectCollection的CreateProgram创建,通用性更强:

CAM.CAMObject group = camSetup.CAMObjectCollection.CreateProgram(name);

两种写法有什么区别?写法A返回的类型就是NCGroup,后续要设置父组、读名称、挂操作都很直接;写法B是CAM树通用创建接口,除了程序组,还能用CreateOperation、CreateMethod、CreateGeometry创建操作、方法、几何体等节点,但因为返回的是CAMObject,真要用到NCGroup特有功能时还得转型。

我个人建议优先用写法A。如果在手头这个NX版本里找不到NCGroupCollection.Create,再退回写法B。判断的标准就一句话:以你当前版本录制宏生成的代码为准。

2.3 用Journal录制快速定位API,比翻文档高效十倍

这一点值得单独拿出来说,因为太实用了。NX版本更新速度快,不同版本的CAM API经常有微调。我最早在一个版本上跑得好好的NCGroupCollection.Create,拿到另一个新版本上就报错找不到方法。如果光靠翻帮助文档去猜,费时费力还不一定猜对。

正确做法是用Journal录制,让NX自己告诉你API怎么写:

  1. 在NX里选择 File → Journal → Record;
  2. 录制语言选C#,或者你日常用的VB.NET;
  3. 在程序顺序视图里手动创建两个程序组,设置好名字;
  4. 停止录制,打开生成的.cs文件;
  5. 搜索Create或者Program关键词,官方API在当前版本的准确写法就在里面。

这等于把"创建程序组"这步操作翻译成代码,比自己翻文档高效得多。我每次在新版本NX上做CAM二次开发,第一件事就是录一段"创建程序组"的宏,确认API没问题再动手写工程。

3. 核心实现:输入初始程序组名,循环批量创建

3.1 开发环境与最小入口

先交代环境。我用的方式是C# + NXOpen,在Visual Studio里建一个C#类库项目,引用NXOpen相关的程序集,入口是一个静态Main方法。在NX中通过 File → Execute → NX Open 选择生成的DLL运行。如果要做成菜单化工具,可以再包一层UI,但核心逻辑都是一样的。

一个最小可运行的入口是这样:

using System; using System.Collections.Generic; using System.Linq; using NXOpen; using NXOpen.CAM; public class ProgramGroupCreator { private static Session _session; private static CAM.CAMSession _camSession; private static CAM.CAMSetup _camSetup; public static int Main(string[] args) { _session = Session.GetSession(); _camSession = _session.CAMSession; _camSetup = _camSession.GetSetup(); // 配置参数:初始名称、数量、起始序号 string baseName = "ELEC01"; int count = 10; int startIndex = 1; try { var groups = CreateProgramGroups(baseName, count, startIndex); string msg = string.Join("\n", groups.Select(g => g.Name)); UI.GetUI().NXMessageBox().Show("批量创建程序组", NXMessageBox.DialogType.Information, $"成功创建 {groups.Count} 个程序组:\n{msg}"); } catch (Exception ex) { UI.GetUI().NXMessageBox().Show("批量创建程序组", NXMessageBox.DialogType.Error, ex.Message); } return 0; } }

这里有个细节:_camSession.GetSetup()是取当前部件的CAM Setup。如果当前部件没有进入加工模块、没有CAM配置,这里可能返回空或抛异常,正式使用时要先判断一下。我习惯在Main开始时做一个保护判断,如果没有Setup就弹提示并退出。

3.2 批量创建的核心方法

下面就是核心代码,重点处理了三件事:收集已有名称、跳过重名、创建并收集结果。

public static List<CAM.NCGroup> CreateProgramGroups( string baseName, int count, int startIndex = 1, string parentGroupName = null) { var createdGroups = new List<CAM.NCGroup>(); // 1. 收集当前CAM树中已有的程序组名称 var usedNames = new HashSet<string>(); foreach (CAM.NCGroup group in _camSetup.NCGroupCollection) { usedNames.Add(group.Name); } // 2. 可选:定位父程序组 CAM.NCGroup parentGroup = null; if (!string.IsNullOrEmpty(parentGroupName)) { parentGroup = FindGroupByName(parentGroupName); if (parentGroup == null) { throw new Exception($"找不到父程序组: {parentGroupName}"); } } // 3. 循环创建,序号自动递增 int idx = startIndex; int createdCount = 0; while (createdCount < count) { string name = $"{baseName}_{idx:D3}"; // 重名则跳过,序号继续递增 if (usedNames.Contains(name)) { idx++; continue; } CAM.NCGroup newGroup = _camSetup.NCGroupCollection.Create(name); if (newGroup == null) { idx++; continue; } // 如果需要挂到指定父组下 if (parentGroup != null) { newGroup.Parent = parentGroup; } createdGroups.Add(newGroup); usedNames.Add(name); createdCount++; idx++; } return createdGroups; } public static CAM.NCGroup FindGroupByName(string groupName) { foreach (CAM.NCGroup group in _camSetup.NCGroupCollection) { if (group.Name == groupName) { return group; } } return null; }

这段代码里最需要关注的是名称生成规则:

string name = $"{baseName}_{idx:D3}";

这个写法会把序号格式化为三位。比如初始名是ELEC01,序号从1开始,生成的名称依次是ELEC01_001、ELEC01_002……一直到ELEC01_010。D3的意思是至少三位数字,不足自动补0。后面我会再讲为什么序号位数这个细节很重要。

3.3 重名躲避为什么是必需品

我见过不少初学二次开发的人,直接一个for循环就创建,结果跑到中途突然报错,然后一脸茫然。

原因很简单:同一个父节点下,程序组的名称不允许重复。当你第二次运行工具、或者零件里已经有同名程序组的时候,Create就会失败,而且报错信息有时候比较隐晦,不是直说"重名",而是抛一个对象已存在的异常。

我的做法是先在循环前遍历一次NCGroupCollection,把所有已存在的名称收进HashSet,然后在循环里逐个比对。遇到重名就跳过,序号继续递增。这样不会因为一个重名就中断整个批量创建流程,同时还实现了"从上次断点继续"的效果——比如你第一次建了001到005,第二次再给50的数量,工具会自动从006接着建下去,不会覆盖已有组。

3.4 指定父程序组的嵌套创建

有些工艺场景不是所有组都挂在PROGRAM根节点下的。比如编程习惯是先建OP10、OP20这类工位级顶层组,每个工位组下面再挂具体工序组。这种需求,通过parentGroupName参数传进去就行。

代码里核心就两行:

CAM.NCGroup parentGroup = FindGroupByName(parentGroupName); newGroup.Parent = parentGroup;

如果当前版本的NCGroup没有公开的Parent属性,不要硬猜。建议在录制宏里手动创建一个组然后拖拽到父组下,看看NX生成的代码是怎么设置父子关系的。不同版本可能叫SetParentGroup、ParentGroup或者AssignParent,跟着录制代码用就好。

4. 实测踩坑记录:刷新、重名、版本差异与性能

4.1 建完组,导航器里不显示,到底成功没有

我第一次跑通这个工具的时候,自认为万事俱备,结果在NX里运行完,程序顺序视图一片空白,啥也没多。当时第一反应是代码出错了,但弹出的信息框明明显示创建成功,到建模导航器里搜一下,又能找到那几个组。

后来才反应过来:NXOpen脚本跑完后,CAM导航器不会每次都自动刷新。尤其是批量创建上百个节点时,界面经常停留在旧状态。

我当时的排查链是这样:

  1. 先验证对象是否真的创建成功。不去看界面,直接再遍历一次NCGroupCollection,把所有组的名称打印出来,确认对象确实存在。
  2. 如果对象存在,问题就锁定在界面刷新上。
  3. 刷新尝试顺序是:先调用_camSetup.Update()强制系统更新;不行就用_camSession.SetActiveSetup(_camSetup)重设当前Setup;再不行就在代码末尾执行part.Views.WorkView.Update()。
  4. 如果以上都还不显示,手动切换一下视图再切回来,或者重启NX,对象会正常出现。

这个问题本质上是"CAM导航器刷新机制滞后",不是代码逻辑问题。知道了根因,后续遇到就不会慌。

4.2 重名报错与序号跳跃,两种处理策略

重名问题前面讲过核心逻辑,这里补充一个"序号跳跃"的细节。

有时候你要求建50个组,从001开始,如果018已经被占用,正常避让逻辑会跳过018继续往后,最终建满50个,最后一个组的序号可能到了059。这在大部分情况下没问题,但有些人希望序号连续,中间不允许有空洞。

我实际处理是做成可配置的,默认自动跳过,同时提供一个"严格连续"选项:

  • 自动跳过模式:遇到重名就idx++继续,适合大多数场景,名字看起来有个别空洞不影响使用。
  • 严格连续模式:遇到重名立刻报错停止,让用户人工去处理重名组,避免悄悄跳过导致编号错乱。

不管是哪种模式,重名判断都是必须的。不要指望NX会给你一个友好的中文报错,它抛出来的异常信息对现场操作员来说基本不可读,工具层一定要自己做好检查。

4.3 不同NX版本API变了怎么办

前面提过Journal录制这个法宝,这里举一个我遇到的实例。

我最早在某版本的NX上用camSetup.NCGroupCollection.Create(name),后来换到另一台机器跑同一个DLL,直接报错找不到方法。我立刻录了一段创建程序组的宏,发现新版本录制出来的是:

CAM.CAMObject group = camSetup.CAMObjectCollection.CreateProgram(name);

返回类型和调用入口都变了。这说明NX官方API也在持续调整,跨版本复用代码时一定要提前确认。

这里给一个兼容性的工程建议:在代码里做一个适配层,把"创建程序组"这个动作统一封装成一个自己的方法。以后NX升级导致API变动时,只需要改适配层这一处,业务代码不用动。比如这样:

public static CAM.NCGroup CreateGroup(string groupName) { // 优先用 NCGroupCollection 方式 CAM.NCGroup group = _camSetup.NCGroupCollection.Create(groupName); return group; }

如果这版编译不过,就换另一个实现重新编译,但对外暴露的方法名和业务调用方保持不变。时间久了你会发现,这个适配层省了无数排查的功夫。

4.4 命名规范和序号位数:看似小事,影响却很大

建组这件事,代码复杂度不高,但命名规则往往最容易被忽略。我踩过几次坑之后总结了几条经验:

  • 序号位数根据总量定。总数不超过100,D2就够;几百上千的量,D3起步。位数不够会出现排序混乱,比如PRG_1、PRG_10、PRG_2这种顺序,在字符串排序里非常难看,后处理出来的文件顺序也是乱的。
  • 加分隔符。ELEC01_001比ELEC01001可读性更高,也不容易产生歧义。
  • 尽量不要用中文。程序组名后面往往直接进入后处理文件名,部分机床系统对中文字符支持不好,可能变乱码。
  • 和后处理文件命名规则保持统一。程序组名最好就是NC文件名的前缀来源,这样从程序组到生成文件是一条线下来的,中间环节不会脱节。
命名示例格式适用场景
PRG_001前缀_三位序号通用程序组管理
ELEC01_粗加工电极名_工序名电极编程
OP10_MILL_001工位_类型_序号多工位装夹

4.5 大批量创建的性能与撤销体验

如果一次创建几百个组,循环里逐个调用Create,单个对象其实很快,真正卡的是界面的刷新。我的建议是:创建期间不要频繁调用Update,最后统一刷新一次;在程序开始前设置Undo Mark,结束后设置可见Mark,这样用户能一次撤销整批操作。

Undo Mark的使用方式很简单:

int undoMarkId = _session.SetUndoMark(Session.MarkVisibility.Visible, "批量创建程序组"); // ... 执行业务创建逻辑 ... _session.SetUndoMark(Session.MarkVisibility.Visible, "批量创建程序组完成");

如果你不加这个Mark,用户执行完工具后在NX里按Ctrl+Z,撤销行为可能不完整或者根本撤不掉,体验非常糟糕。这是生产环境工具和自用脚本的一个显著区别。

5. 生产环境扩展:从工具到自动化流程的进阶路线

5.1 封装成可视化对话框工具

命令行入口适合开发自测,真给车间工程师用,还是要做成一个简单的对话框界面。NXOpen的BlockStyler可以做标准NX风格对话框,在对话框里放三个输入框:初始程序组名、数量、起始序号,再放一个可选的父程序组输入框。点确定直接调用上面的CreateProgramGroups方法。

界面代码不在这里贴全,核心的思路是:把Main方法里的参数改成从UI控件取值,业务方法保持不变。这样未来加字段、改逻辑都非常容易,而且BlockStyler生成的对话框和NX原生界面风格一致,现场人员学起来很快。

5.2 对接Excel或工艺清单,按行建组

再进一步,很多企业的工艺数据存在Excel或PDM系统里。比如一行数据代表一个电极,列里有电极编号、工序类型。工具读一行建一批组,命名规则完全按数据来。这个扩展的好处是:不需要人再去决定初始名和数量,数据本身就是规则,程序组结构天然与工艺文件一致。

做这个扩展的时候有几个小提醒:读取Excel需要引入对应读取库,注意列顺序和空行过滤;如果工艺表里同一个电极有多道工序,记得用循环嵌套,一个电极名下建多个工序组。这个逻辑其实不复杂,但能把"手动输入初始名"的环节都省掉。

5.3 创建组之后,把已有操作自动归组

批量创建程序组的最终目的,不光是让树好看,而是让刀路也被归置清楚。如果操作已经写在CAM文件里,只是还没有分配到任何程序组,那就可以在批量建组之后,按操作名称遍历,自动分配到匹配的程序组。

操作的归组API和程序组类似,同样是设置父节点。比如操作名字以ELEC01_开头,那就找到ELEC01_001对应组,把操作挂进去。这个扩展写完,整个CAM文件的整理就是全自动的了,手动拖拽操作的成本可以完全省略。

5.4 和整条CAM自动化链路衔接

最后说一个更大的方向。程序组只是CAM自动化的一个环节,你完全可以把批量创建程序组,和自动创建操作、自动选择几何体、自动设置参数、自动后处理输出串成一条流水线。程序组名在这个链路里既是"文件夹",也是贯穿各个工序的标识。

我在实际项目里最深的感受是:先别急着写代码,把业务规则彻底理清。为什么程序组叫这个名字?它和NC文件名的映射关系是什么?重名了怎么处理?这些问题想清楚之后,代码只是一个执行工具而已。

如果你们也在做UG CAM二次开发,遇到重复创建程序组这类需求,我建议先别急着优化性能,先把规则想透。代码本身不复杂,我用这个思路写的工具,已经把电极编程从原来的一两个小时压缩到一两分钟。最后再分享一个小技巧:工具跑完一定要记得把成功创建的组名列表保存到日志或信息窗口,一方面方便现场确认,另一方面也是给后面的自动后处理提供分组依据。批量建组只是一个起点,把命名规则和数据打通之后,这套思路能帮你省下的重复劳动,远超你写代码花掉的时间。

相关新闻

通信基站学习指南:从硬件架构到网络优化的系统路径

通信基站学习指南:从硬件架构到网络优化的系统路径

通信基站学习资料的存量非常大&#xff0c;大到哪怕你只收集和“通信基站相关学习链接”沾边的资料&#xff0c;也能在一个晚上攒下一百多个收藏。真正的问题从来不是找不到资源&#xff0c;而是资源一多&#xff0c;就不知道按什么顺序读、读哪一版、读到什么程度才算会。我在…

2026/10/20 22:49:27 阅读更多 →
用JavaScript与Canvas从零实现俄罗斯方块:核心算法与实战解析

用JavaScript与Canvas从零实现俄罗斯方块:核心算法与实战解析

1. 项目概述与整体设计拆解1.1 为什么选择俄罗斯方块作为练手项目如果你在游戏开发这条路上摸索过&#xff0c;大概率绕不过俄罗斯方块&#xff08;Tetris&#xff09;这个经典中的经典。它看起来简单&#xff0c;一个网格、几种形状、不断落下、一行行消除&#xff0c;但真正动…

2026/10/20 22:49:27 阅读更多 →
从人类视频到四足机器人舞蹈:BeyondMimic与rl_sar实践指南

从人类视频到四足机器人舞蹈:BeyondMimic与rl_sar实践指南

你刷到过机器人跳舞的视频吗&#xff1f;乍看像特效&#xff0c;其实背后是一条从“人类视频”到“机器人在真实地面上踩节拍”的完整链路。我以前也以为跳舞动作要么是工程师手动调姿态调出来的&#xff0c;要么是从动捕设备里导出来的&#xff0c;直到认真跑了一遍 BeyondMim…

2026/10/20 22:49:27 阅读更多 →

最新新闻

T+转U8+数据迁移实战:科目、辅助核算与期初余额的平滑过渡方案

T+转U8+数据迁移实战:科目、辅助核算与期初余额的平滑过渡方案

简介&#xff1a;专门用于T与U8之间数据迁移的辅助工具&#xff0c;面向财务人员、ERP实施顾问及企业信息化运维者&#xff0c;解决T版本数据平滑转换至U8过程中的字段映射与账套整合难题。整个工具包共13个文件&#xff0c;压缩后仅426KB&#xff0c;包含8个SQL脚本&#xff0…

2026/10/20 23:25:58 阅读更多 →
spaCy 2.0与交互式标注工具:NLP工程化落地的关键一步

spaCy 2.0与交互式标注工具:NLP工程化落地的关键一步

2017年对我这种做NLP应用落地的人来说&#xff0c;是一个很微妙的年份。深度学习在学术界已经打得火热&#xff0c;但真要把它用在生产环境里&#xff0c;总是隔着一层&#xff1a;训练代码要自己写&#xff0c;数据标注靠Excel和手工&#xff0c;好不容易练出来的模型还不好部…

2026/10/20 23:25:58 阅读更多 →
OpenClaw盗刷谣言背后:AI自动化工具的安全边界

OpenClaw盗刷谣言背后:AI自动化工具的安全边界

1. 一张"受害者"截图&#xff0c;到底骗了谁&#xff1f;这两天我的信息流快被同一张图刷屏了&#xff1a;一张聊天截图&#xff0c;配文大意是"信用卡被盗刷、微信红包被盗刷&#xff0c;第一批OpenClaw受害者出现了"。配上几个红色感叹号&#xff0c;评论…

2026/10/20 23:25:58 阅读更多 →
AI智能体不是高级Prompt:四基石与七把尺子

AI智能体不是高级Prompt:四基石与七把尺子

1. 别急着调用API&#xff1a;先搞清“AI智能体”到底不是什么“AI智能体你用对了没有&#xff1f;”——这问题一出来&#xff0c;我下意识就笑了。上周在某高校实验室做技术分享&#xff0c;台下一位导师举手问&#xff1a;“我们让大模型写周报、改PPT、润色论文&#xff0c…

2026/10/20 23:25:58 阅读更多 →
智能拖拉机环境下的多类别车辆检测与识别:Mask R-CNN改进实战

智能拖拉机环境下的多类别车辆检测与识别:Mask R-CNN改进实战

做智能拖拉机环境下的车辆检测与识别&#xff0c;和做城市自动驾驶感知完全是两码事。城市道路的障碍物再复杂&#xff0c;好歹有清晰的车道线、红绿灯、标准化的车辆外形&#xff1b;田间地头是另一番光景——扬尘一起&#xff0c;逆光一下&#xff0c;远处开过来的运粮车在麦…

2026/10/20 23:25:58 阅读更多 →
diagram-design:系统可视化设计的方法论与工程实践

diagram-design:系统可视化设计的方法论与工程实践

1. “diagram-design”不是一张图&#xff0c;而是一套系统性视觉表达方法论很多人第一次看到“diagram-design”这个词&#xff0c;下意识会把它当成“画流程图”“做PPT示意图”或者“用draw.io拖几个框连几条线”的简单操作。我最初也这么想——直到在某高校的跨学科课程设计…

2026/10/20 23:24:57 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →