0%

背景与问题修正

“AI Native 开发模式”这个说法容易变得空泛。如果只把它理解成“用 AI 写更多代码”,很可能会得到更快的技术债、更大的审查压力和更难追溯的生产事故。

更准确的问题应该是:

如何把 AI 作为受控的开发参与者嵌入软件开发生命周期,并用 DevOps 的反馈、自动化、度量、安全和治理机制,让 AI 生成的产出可验证、可追溯、可交付、可运维。

这篇笔记用于持续研究这个问题:如何在软件开发生命周期中同时追求 AI 自动化效率和工程受控性。

资料快照日期:2026-06-30。后续涉及最新报告、工具能力、政策、模型版本或企业实践时,需要重新查证。

核心判断

当前更稳妥的判断是:

  1. AI 不应被视为替代 SDLC 的捷径,而应被纳入 SDLC 的受控参与者。
  2. AI 会提高需求整理、代码生成、测试草稿、文档、Review 辅助和运维分析的吞吐量。
  3. 吞吐提升后,瓶颈会转移到验证、审查、安全、可追溯、权限控制和生产化。
  4. DevOps 的价值不会因为 AI 降低,反而更重要,因为它提供反馈回路、自动化门禁、交付度量和生产证据。
  5. AI Native 的成熟度不应看“生成了多少代码”,而应看“AI 产出是否能被持续验证、审查、发布、回滚和审计”。

一句话结论:

AI Native 不是让 AI 绕过工程纪律,而是把 AI 产生的不确定性转化为可验证的软件交付证据。

事实基线

截至本次整理,公开资料给出的方向大致一致:

  • DORA 2025 报告强调,AI 更像组织能力的放大器,回报主要来自底层组织系统,而不是工具本身。
  • DORA 关于 AI 张力的研究指出,AI 提升吞吐后,可能增加审查、验证和交付稳定性的压力。
  • GitHub Octoverse 2025 显示,AI 相关开发活动已经进入主流软件生态,LLM SDK 使用和 agentic coding 迹象明显增长。
  • NIST SSDF 要求把安全实践集成进每一种软件开发生命周期。
  • NIST AI RMF 和 Generative AI Profile 提醒,AI 系统需要围绕治理、映射、度量和管理风险来设计。
  • OWASP LLM Top 10 2025 把 Prompt Injection、敏感信息泄露、供应链、过度代理权等列为核心风险。
  • SLSA 和 OpenSSF Scorecard 这类供应链安全实践,正在成为 AI 参与开发后的基础门槛。

这些事实不支持一个简单结论:“AI 越多越好”。它们更支持另一个结论:AI 能力越强,工程控制系统越要强。

AI Native SDLC 框架

可以把 AI Native SDLC 拆成五个关键词:

  • Intent:需求、约束、验收标准、风险等级先结构化。
  • Context:AI 能访问受控的代码、文档、接口、日志、架构决策和规范。
  • Agent:AI 可以生成、修改、测试、审查、总结,但权限分级、行为可审计。
  • Evidence:每个产出都必须有测试、扫描、评审、运行证据支撑。
  • Governance:人负责判断,流水线负责验证,平台负责权限和追踪。

需求阶段

AI 适合做:

  • 汇总用户反馈、issue、客服记录、事故记录和日志摘要。
  • 把自然语言想法转成用户故事、验收标准、边界条件和风险清单。
  • 对需求提出反例,例如权限、数据一致性、异常流、灰度发布、回滚方案。

控制点:

  • 需求不能停留在 prompt。
  • 必须沉淀为 PRD、用户故事、验收标准、接口契约或 issue。
  • 关键需求必须明确非功能要求,例如安全、性能、可观测性、合规、兼容性和回滚。

设计阶段

AI 适合做:

  • 生成 ADR 备选方案。
  • 草拟接口、数据流、状态机、错误处理和威胁模型。
  • 对比不同架构方案的代价。
  • 检查方案是否遗漏安全、降级、可观测、迁移、回滚和运维入口。

控制点:

  • 人类架构师或负责人必须做最终取舍。
  • AI 生成的设计不能直接成为事实,必须经过约束核查。
  • 架构决策要留下 ADR 或设计记录,避免未来只剩一段聊天记录。

编码阶段

AI 适合做:

  • 生成样板代码。
  • 小范围重构。
  • 根据既有模式补全实现。
  • 生成单测草稿、mock、迁移脚本、CLI 工具和文档。
  • 解释陌生代码和调用链。

控制点:

  • PR 要小。
  • 强类型、lint、format、单测、集成测试必须进入默认流程。
  • AI 生成代码不能绕过代码审查。
  • 对安全、权限、支付、生产数据、基础设施、机器人或工业设备控制相关代码,应提高审查等级。

Review 阶段

AI 适合做:

  • 在作者侧提前检查代码风格、测试缺口、潜在 bug 和安全风险。
  • 总结 PR 变更范围。
  • 对比需求验收标准和实际实现。
  • 提醒破坏性变更、迁移风险和回滚遗漏。

控制点:

  • AI Review 不能替代人工 Review。
  • 人工 Review 应聚焦语义正确性、业务后果、架构一致性和风险判断。
  • 不应把 AI 接受率、AI 评论数量或代码行数当作质量指标。

测试阶段

AI 适合做:

  • 生成测试用例草稿。
  • 补充边界条件。
  • 生成 e2e 脚本、契约测试、mock 数据和回归用例。
  • 从事故复盘中提炼回归测试。

控制点:

  • 不能让“AI 生成代码 + AI 生成测试”自证正确。
  • 关键路径的测试 oracle 必须由人或明确规格定义。
  • CI 至少覆盖单测、集成测试、契约测试、e2e、静态检查和安全扫描中的必要部分。

DevSecOps 阶段

AI 时代应把这些能力作为默认门禁:

  • SAST:静态应用安全测试。
  • SCA:开源依赖和漏洞扫描。
  • secret scanning:密钥泄漏扫描。
  • IaC scanning:基础设施即代码扫描。
  • container scanning:镜像漏洞扫描。
  • SBOM:软件物料清单。
  • provenance:构建来源和制品可追溯。
  • signed artifact:制品签名。
  • policy as code:用规则控制发布、权限和例外。

控制点:

  • AI 生成代码进入同一质量门禁。
  • 不能为 AI 代码开“快速通道”。
  • 例外必须记录原因、负责人、过期时间和补偿措施。

发布阶段

AI 适合做:

  • 生成 release note。
  • 总结变更影响。
  • 草拟回滚预案。
  • 分析灰度数据和错误趋势。

控制点:

  • 发布仍应依赖 feature flag、canary、blue-green、自动回滚和审计记录。
  • 高风险发布必须有人审批。
  • AI 可以建议操作,但不应直接绕过流水线变更生产环境。

运维阶段

AI 适合做:

  • 日志摘要。
  • 告警聚类。
  • runbook 推荐。
  • 事故复盘草稿。
  • 根因假设生成。
  • 用户影响范围分析。

控制点:

  • 对生产写操作、删数据、扩缩容、权限变更、设备控制等动作,应默认 human-in-the-loop。
  • AI 的操作建议要进入审计。
  • 事故复盘要区分事实、推断和行动项。

自动化与受控的边界

可以先按风险等级划分 AI 权限:

场景 推荐自动化程度 控制要求
文档摘要、代码解释、测试草稿 保留来源和人工抽查
样板代码、小型重构、非关键工具 中高 小 PR、CI、Review
业务核心逻辑、权限、安全、支付 中低 强制人工审查、测试证据
基础设施、生产发布、数据迁移 审批、回滚、审计
删除生产数据、控制真实设备、改变权限边界 极低 默认禁止自动执行,必须人工确认

一个实用原则:

AI 可以加速低风险、可回滚、可测试的事情;越接近生产状态、真实资产和不可逆操作,越需要人和平台门禁。

度量体系

保留 DevOps 的核心指标:

  • lead time:从提交到上线的时间。
  • deployment frequency:部署频率。
  • change failure rate:变更失败率。
  • MTTR:平均恢复时间。

增加 AI 时代指标:

  • AI 代码返工率。
  • AI 产出缺陷逃逸率。
  • AI 参与 PR 的平均 Review 时长。
  • PR 体积变化。
  • 关键路径测试覆盖率。
  • CI 阻断原因分布。
  • SAST/SCA/secret scanning 阻断数。
  • SBOM 覆盖率。
  • 制品签名覆盖率。
  • provenance 覆盖率。
  • agent 权限违规次数。
  • 生产事故中 AI 参与代码的比例和原因。

谨慎使用这些指标:

  • AI 生成代码行数。
  • Copilot/Cursor/Claude Code 接受率。
  • prompt 次数。
  • commit 数。
  • PR 数量。

这些指标可能说明活跃度,但不能直接说明软件质量和交付价值。

实践路线

2 到 4 周:建立基线

目标:知道当前工程系统的真实状态。

交付物:

  • 当前 DORA 指标快照。
  • Review 时长和 PR 体积统计。
  • CI 失败原因分类。
  • 缺陷逃逸和回滚记录。
  • AI 使用规范初稿。

验收标准:

  • 明确哪些场景允许 AI 参与。
  • 明确哪些数据不能进入外部模型。
  • 明确哪些操作必须人工审批。
  • 至少有一条从需求到发布的证据链样例。

1 到 2 个月:受控试点

目标:选一个低风险项目,把 AI 纳入完整 SDLC。

适合试点的对象:

  • 内部工具。
  • 非核心服务。
  • 文档和测试补全。
  • 可回滚的小功能。

交付物:

  • AI 辅助需求、设计、编码、测试、Review、发布的完整样例。
  • CI/CD 门禁。
  • 安全扫描。
  • PR 模板。
  • Review checklist。
  • 发布记录和回滚方案。

验收标准:

  • AI 参与的 PR 能通过统一门禁。
  • 人工 Review 负担没有失控。
  • 缺陷没有明显上升。
  • 产出可以被追溯到需求、测试和发布记录。

3 到 6 个月:建设 AI Engineering Platform

目标:让 AI 使用从个人技巧变成组织能力。

交付物:

  • 代码知识库和文档索引。
  • 规范库和 prompt 模板。
  • agent 权限模型。
  • 审计日志。
  • 制品 provenance。
  • AI 使用成本和质量仪表盘。
  • 安全和合规策略。

验收标准:

  • 不同团队可以复用同一套 AI 工程规范。
  • AI 产出可审查、可追溯、可度量。
  • 高风险动作默认受控。
  • 平台能回答:谁让 AI 做了什么、用了什么上下文、改了什么、如何验证、何时发布、出了问题如何回滚。

与个人技术方向的关系

对我这种从 Web/full-stack 向工业软件、机器人应用、数字孪生和 AI-assisted operations 转型的人来说,这个方向有现实价值。

更强的定位不是“我会用 AI 写代码”,而是:

我能把 AI、DevOps、工业系统状态、可观测性、权限控制和人机协同流程结合起来,构建可交付、可追溯、可运维的智能软件系统。

这和工业机器人、机器视觉、数字孪生、设备状态平台、AI 运维助手都有连接点。尤其在真实设备和工业现场中,自动化不能脱离状态建模、权限、安全、审计、回滚和人工确认。

后续研究问题

后续需要继续研究:

  • 企业如何定义 AI 生成代码的责任边界。
  • AI agent 在 CI/CD 中应获得哪些最小权限。
  • 如何设计 agent 审计日志和 evidence trail。
  • AI Review 如何避免制造噪音。
  • AI 生成测试如何和人工定义的 oracle 结合。
  • 如何把 NIST SSDF、SLSA、OWASP LLM Top 10 落到日常开发流水线。
  • 如何在工业软件和机器人系统中设计 human-in-the-loop。
  • 如何度量 AI 对质量、交付速度和运维稳定性的真实影响。

持续研究日志

2026-06-30:初始判断

初始结论:AI Native 开发不应被理解成“AI 替代软件工程”,而应被理解成“AI 参与软件工程后,如何通过 SDLC、DevOps、DevSecOps 和治理机制把不确定产出变成可信交付”。

当前最重要的实践问题不是 prompt,而是:

  • 上下文如何受控。
  • 权限如何分级。
  • 产出如何验证。
  • 证据如何保留。
  • 事故如何追溯。
  • 生产如何回滚。

参考资料

背景

以前用 Docker 部署 Jenkins、MySQL 这类成熟 SaaS 服务时,主要工作是:

  • 找到官方镜像
  • 配置端口和 volume
  • 设置环境变量
  • 通过 docker rundocker compose 启动

这种经验很有价值,但它容易造成一个误解:Docker 只是把程序放进镜像里,然后到处运行。

对于工业硬件项目,这个理解不够。以这次项目为例,它不是单纯的 Web 服务,而是 Rust 后端、前端、工业硬件 SDK、机器人 bridge、动态库和现场网络共同组成的系统。Docker 发布的难点不在 Dockerfile 语法本身,而在下面这些东西是否一致:

  • 目标 OS
  • CPU 架构
  • 原生 SDK
  • 动态库路径
  • Cargo feature
  • Python bridge 环境
  • 硬件访问方式
  • 运行时配置
  • 现场网络和权限

先给结论

Docker 镜像不是跨平台安装包。Linux image 运行 Linux binary,Windows image 运行 Windows binary。

当前项目快照中,根目录 Dockerfile 是 Linux 容器镜像,不是 Windows 发布包。它不能直接加载 Windows MechMind SDK DLL,也不能直接复用 Windows 上的 Python/Agilebot bridge 环境。

如果目标环境是:

  • Windows
  • Agilebot
  • MechMind

更稳妥的第一条生产发布路线是 Windows 原生发布包,而不是先走 Docker。

Docker 版本更适合单独作为 Linux 工控机部署线维护,前提是 MechMind Linux SDK、Agilebot bridge、网络发现和硬件访问都已经在容器内验证过。

常见误区

误区一:Docker 可以天然跨平台

Docker 的跨平台能力经常被误解。

容器共享宿主机内核,它不是完整虚拟机。Linux container 使用 Linux 内核,Windows container 使用 Windows 内核。

在 Windows 上使用 Docker Desktop 跑 Linux container,本质上是运行在一个 Linux VM 里,不等于 Windows 原生环境。因此:

  • Linux container 不能直接加载 Windows DLL
  • Linux container 不能直接使用 Windows Python 虚拟环境
  • Windows 上的 USB、GigE 相机发现、网卡广播、厂商服务发现,在 Linux VM 中可能有额外限制

误区二:编译通过就代表运行时可用

工业项目经常依赖原生动态库。编译通过只说明构建阶段找到了头文件、链接库或 feature 配置,不代表运行时一定能找到对应动态库。

例如:

  • MechMind 是厂商 C++ SDK FFI,容器中必须安装对应平台的 SDK 和动态库
  • ONNX Runtime 需要运行时动态库路径,启用 onnx feature 不等于容器内已经能加载 ONNX Runtime
  • Python bridge 需要 Python 版本、依赖包、脚本路径和运行权限一致

误区三:镜像里有程序就能控制硬件

硬件访问还涉及网络、权限和现场拓扑。

相机、机器人、PLC、工控机之间通常依赖固定 IP、网段、广播发现、端口白名单、厂商守护进程和设备驱动。容器部署时,需要额外确认:

  • 容器网络模式是否能访问设备网段
  • 是否需要 host network
  • 是否需要挂载 USB 或设备节点
  • 是否需要厂商 license 或运行时服务
  • 容器内路径是否和配置文件一致

误区四:latest 可以作为生产版本

latest 适合临时测试,不适合生产部署和回滚。

生产版本应该使用不可变 tag,例如:

1
2
0.6.1-mechmind-a1b2c3d
runtime-20260623-mechmind-a1b2c3d

至少应该能从 tag 中看出:

  • 业务版本
  • feature profile
  • git sha

发布前确认

确认发布 profile

当前项目快照中,可以按下面方式理解 profile:

profile 说明
default 当前 Dockerfile 默认,约等于 step + onnx
mechmind 需要启用 step,onnx,mechmind
full 会启用 mechmind + galaxy + realsense + step + onnx,不建议只为了 MechMind 直接用 full
agilebot 不是单独 Cargo feature,但需要 bridge 脚本、Python 环境和网络连通

这里要区分两件事:

  • Cargo feature 决定 Rust 编译哪些能力
  • 运行时依赖决定服务启动后能不能真的连接设备

agilebot-driver 如果是常驻依赖,就不能按 feature 来理解。它真正的部署风险在 bridge 是否能运行、路径是否一致、机器人网络是否可达。

确认镜像目标平台

发布前先明确目标:

  • Linux image:基于 Debian/Rust 构建 Linux binary
  • Windows image:需要 Windows container base、MSVC Rust toolchain、Windows SDK 路径
  • Windows 原生包:输出 .exe、SDK、配置模板和服务安装脚本

当前项目已有的是 Linux image 路线,不等于已经有 Windows Docker 发布路线。

确认 Dockerfile 能力

按这次 AI agent 对项目的描述,当前 Dockerfile 有几个重点:

  • 安装了基础构建依赖和 ca-certificates
  • 没有安装 MechMind SDK
  • 没有安装 Agilebot bridge 的 Python 依赖
  • 没有把 feature 参数做成 ARG
  • 固定执行 cargo build --release --bin runtime-service --bin runtime-cli
  • 不会自动启用 mechmind

如果要让镜像支持不同发布 profile,Dockerfile 通常需要把 feature 做成构建参数:

1
2
3
4
5
ARG CARGO_FEATURES=step,onnx
RUN cargo build --release \
--bin runtime-service \
--bin runtime-cli \
--features "${CARGO_FEATURES}"

如果启用 MechMind,还需要处理 SDK:

1
2
# 示例:具体路径以厂商 Linux SDK 为准
ENV LD_LIBRARY_PATH=/opt/mechmind/lib:${LD_LIBRARY_PATH}

这不是固定答案,只是提醒:原生 SDK 必须进入镜像或通过受控方式挂载,不能只改 Rust feature。

Docker 发布流程

1. 冻结发布信息

发布负责人先记录:

  • git commit sha
  • 业务版本号
  • Cargo feature profile
  • 目标 OS
  • 目标 CPU 架构
  • SDK 版本
  • 配置文件版本
  • 是否包含 Agilebot bridge
  • 是否包含 MechMind SDK

这一步的目的不是写文档好看,而是为了出问题时能复现。

2. 构建镜像

基础构建:

1
docker build -t microi-runtime:<git-sha> .

启用 MechMind 的构建可以类似:

1
2
3
4
docker build \
--build-arg CARGO_FEATURES="step,onnx,mechmind" \
-t microi-runtime:0.6.1-mechmind-<git-sha> \
.

如果项目使用 GitLab CI,生产构建应优先使用 CI job,而不是个人电脑手工构建。CI 可以保证构建环境、镜像 tag、推送路径和日志可追溯。

3. 推送 registry

CI 当前会推 GitLab registry:

1
2
${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}
${CI_REGISTRY_IMAGE}:latest

实际部署时不要只依赖 latest。建议至少保留:

  • git sha tag
  • 业务版本 tag
  • feature profile tag

Harbor 可以作为基础镜像缓存或企业镜像仓库,但不改变一个原则:生产部署要使用不可变 tag。

4. 准备部署配置

容器通常需要暴露:

1
2
50051 gRPC
50052 HTTP / WebSocket / metrics

建议挂载配置:

1
/etc/microi/runtime.toml

建议挂载运行数据和日志:

1
2
/var/run/microi
/var/log/microi

常见环境变量:

1
2
MICROI_CONFIG=/etc/microi/runtime.toml
RUST_LOG=info,runtime_service=debug

配置文件要把路径写成容器内路径,而不是宿主机路径。

5. 启动服务

可以通过 compose 或现场部署系统启动。重点不是命令形式,而是启动前确认:

  • image tag 是否正确
  • config 是否是目标现场配置
  • volume 是否挂载到正确路径
  • 网络模式是否能访问硬件设备
  • SDK 动态库是否能被加载
  • bridge 脚本是否在容器内可执行

6. 验证服务

验证要从只读能力开始,不要一上来发运动指令。

基础检查:

1
curl http://host:50052/api/status

继续确认:

  • 日志里 enabled features 是否包含目标 profile,例如 mechmind
  • 设备列表中 Agilebot 和 MechMind 是否注册成功
  • MechMind 是否能建立只读连接
  • MechMind 是否能执行单帧 capture
  • Agilebot 是否能读取状态
  • WebSocket 或 HTTP 状态是否正常刷新
  • metrics 或日志中是否出现 SDK 加载错误

机器人验证顺序建议:

  1. 服务启动
  2. 只读状态读取
  3. 设备连接状态
  4. 坐标、限位、急停状态确认
  5. 人工确认安全环境
  6. 再考虑低风险运动命令

7. 回滚

回滚应该切换 image tag,不要临时改容器内部文件。

回滚后重新验证:

  • /api/status
  • 设备注册
  • MechMind capture
  • Agilebot read-only state probe
  • 日志中的 feature profile 和 SDK 版本

数据卷和现场配置一般不要跟着镜像回滚,除非本次发布明确包含配置 schema 变更,并且准备了配置回滚方案。

当前项目暴露出的维护点

这次问答中提到两个很典型的 Docker 漂移问题:

compose 引用的 Dockerfile 路径漂移

deploy/docker-compose.yml 引用的是:

1
deploy/Dockerfile

但仓库实际只有根目录 Dockerfile。

这类问题说明 compose 文件和真实构建入口已经漂移。发布负责人需要决定:

  • 把 Dockerfile 移到 deploy/
  • 修改 compose 指向根目录 Dockerfile
  • 或者统一由 CI 构建镜像,compose 只负责拉取镜像

healthcheck 依赖镜像中不存在的工具

compose healthcheck 使用了 curl,但 runtime image 当前没有安装 curl

解决方式有两类:

  • 在 runtime image 中安装 curl
  • 改用镜像内已经存在的健康检查工具或内置二进制

健康检查不是装饰项。工业软件部署中,健康检查会影响重启、告警、回滚和现场判断。

Windows + Agilebot + MechMind 的推荐路线

如果目标是 Windows 现场,并且需要 Agilebot + MechMind,建议先做 Windows 原生发布包:

1
2
3
4
5
6
7
8
9
10
runtime-service.exe
runtime-cli.exe
MechMind Windows SDK
Agilebot bridge
Python 运行环境或依赖锁定
runtime.toml 配置模板
Windows service 安装脚本
日志目录
版本说明
回滚说明

这条路线更符合 Windows 厂商 SDK 和现场调试习惯。

Docker 版本可以作为 Linux 工控机部署线维护,但要单独验证:

  • MechMind Linux SDK
  • Agilebot bridge 的 Linux 可用性
  • 容器网络访问设备的稳定性
  • 动态库路径
  • Python 依赖
  • 权限、license 和现场网段

不要把 Windows 原生部署和 Linux Docker 部署混成一个发布方案。

发布负责人检查清单

发布前:

  • 是否明确目标 OS 和 CPU 架构
  • 是否明确 Cargo features
  • 是否明确 SDK 版本
  • 是否明确 image tag
  • 是否避免只用 latest
  • 是否确认 Dockerfile 安装了运行时依赖
  • 是否确认 compose 的 Dockerfile 路径正确
  • 是否确认 healthcheck 命令可用
  • 是否确认配置文件使用容器内路径
  • 是否确认硬件网络可达

发布后:

  • 服务是否启动
  • /api/status 是否正常
  • 日志中 feature profile 是否正确
  • 动态库是否加载成功
  • MechMind 是否能只读连接和 capture
  • Agilebot 是否能只读读取状态
  • 前端或 API 是否能看到设备状态
  • 是否有明确回滚 tag

这件事的项目价值

对工业软件和机器人应用开发来说,Docker 发布能力不是会写几行 Dockerfile,而是能把软件、SDK、设备、网络、配置和回滚组织成一条可靠发布链路。

这类能力可以证明的不只是 DevOps 基础,而是系统集成能力:

  • 知道容器边界
  • 知道原生 SDK 的限制
  • 知道硬件访问不是普通 Web API
  • 知道 feature、配置和运行时依赖要对齐
  • 知道发布和回滚要可追溯

这比单纯说“我部署过 Docker”更接近工业机器人项目里真正需要的工程能力。

系统概述

比例阀用于工业系统中实现气压或流量的连续可调控制。典型应用包括:

  • 机器人夹爪力控
  • 打磨恒力控制
  • 点胶压力控制
  • 张力控制系统

比例阀系统的关键不是简单输出一个模拟量,而是要把设定值、现场反馈、安全联锁、报警和状态机组织成一个可靠的控制闭环。

系统架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
       上位机 HMI / SCADA
|
参数配置 / 显示
|
PLC
+---------+---------+
| | |
比例阀控制 状态机 报警逻辑
|
模拟量 / 总线
|
比例阀
|
气路系统
|
压力传感器反馈
|
PLC

职责划分

PLC 负责实时控制和安全:

  • 压力闭环逻辑
  • IO 控制
  • 状态机执行
  • 安全联锁
  • 报警判断
  • 设备启停条件

上位机负责非实时功能:

  • 压力设定和配方管理
  • 数据展示
  • 历史记录
  • 报警显示和查询
  • 参数管理

核心原则:

PLC 做判断、控制和安全;上位机做配置、展示和记录。

上位机不能承担实时判断,原因是网络延迟、操作系统非实时、进程可靠性和通信链路都不可作为安全控制的基础。

比例阀控制模式

开环控制

1
PLC -> 模拟量 -> 比例阀 -> 气压

特点:

  • 无反馈
  • 成本低
  • 精度一般
  • 适合要求不高或负载变化很小的场景

闭环控制

1
2
3
4
5
PLC -> 设定压力 -> 比例阀
|
压力传感器
|
PLC反馈

特点:

  • 可控性强
  • 精度更高
  • 能抵抗负载和气路波动
  • 是工业比例阀系统的主流设计

比例阀控制本质:

1
PLC设定值 -> 比例阀 -> 气压 -> 反馈 -> PLC闭环

PLC 内部变量模型

1
2
3
4
5
6
7
8
9
PressureCmd       : REAL;   // 目标压力
PressureActual : REAL; // 实际压力

PressureError : REAL;

PressureOK : BOOL;
PressureLowAlarm : BOOL;
PressureHighAlarm : BOOL;
PressureStable : BOOL;

基础判断逻辑:

1
2
3
4
5
6
7
8
9
10
11
PressureError := ABS(PressureCmd - PressureActual);

PressureOK :=
(PressureError < 0.05)
AND (PressureActual > MinPressure);

PressureLowAlarm :=
PressureActual < MinPressure;

PressureHighAlarm :=
PressureActual > MaxPressure;

工业现场通常不只看瞬时误差,还要判断稳定时间。例如:

1
2
3
IF ABS(PressureCmd - PressureActual) < 0.05 FOR 200ms THEN
PressureStable := TRUE;
END_IF;

实际 PLC 程序里通常会用定时器功能块实现这个逻辑,避免信号抖动导致状态频繁切换。

上位机数据模型

上位机可以通过适配层把 PLC 数据整理成更适合 UI 或业务逻辑使用的结构:

1
2
3
4
5
6
7
8
9
10
struct PressureUnit
{
float pressureCmd;
float pressureActual;

bool pressureOK;
bool lowAlarm;
bool highAlarm;
bool stable;
};

上位机主要负责:

  • 显示状态
  • 修改设定值
  • 保存配方
  • 显示报警历史
  • 记录趋势数据

上位机可以提示和记录异常,但不要把安全联锁和实时报警生成放在上位机。

PLC 信号表设计

输入信号

名称 类型 说明
AI_PressureActual REAL 压力传感器反馈
DI_SystemReady BOOL 系统就绪
DI_EStop BOOL 急停

输出信号

名称 类型 说明
AO_PressureCmd REAL 模拟量输出
DO_EnableValve BOOL 阀使能

PLC 内部变量

名称 类型 说明
PressureCmd REAL 目标压力
PressureActual REAL 实际压力
PressureOK BOOL 压力正常
PressureAlarm BOOL 总报警

上位机交互信号

名称 类型 说明
HMI_PressureSet REAL 上位机设定压力
HMI_PressureActual REAL 显示反馈压力
HMI_AlarmCode INT 报警码

状态机设计

比例阀控制不应该只靠几个布尔量堆逻辑,建议明确状态机:

1
2
3
4
5
6
7
8
9
10
11
12
13
INIT
|
READY
|
PRESSURIZE
|
STABLE
|
WORKING
|
RELEASE
|
ERROR

INIT

系统初始化和 IO 检查。

典型动作:

  • 清空报警或等待复位
  • 检查急停、气源、传感器状态
  • 初始化输出为安全值

READY

等待启动,压力归零或处于安全待机压力。

典型条件:

  • 系统就绪
  • 无报警
  • 阀使能条件满足

PRESSURIZE

比例阀逐步升压。

进入或保持条件:

1
PressureActual < PressureCmd

工程上通常还要加入升压超时判断,避免气路泄漏或阀异常时一直等待。

STABLE

压力达到目标并保持稳定。

稳定条件:

1
ABS(Error) < threshold for 200ms

只有进入稳定状态后,才允许后续工艺动作启动。

WORKING

执行工艺动作,例如机器人夹爪动作、打磨、点胶或张力控制。

这个阶段仍然需要持续监控压力范围,异常时进入 ERROR。

RELEASE

泄压和复位。

典型动作:

  • 关闭阀使能或输出泄压设定
  • 等待压力降到安全范围
  • 返回 READY

ERROR

压力异常或安全条件不满足时进入错误状态。

常见触发条件:

  • 压力过低
  • 压力过高
  • 传感器异常
  • 超时未达到压力
  • 急停或安全联锁断开

ERROR 状态中 PLC 应执行联锁停止,并等待人工确认或复位条件满足。

报警设计

报警应由 PLC 生成,上位机只做显示、记录和查询历史。

报警类型 说明
PressureLow 压力不足
PressureHigh 超压
PressureTimeout 未达到目标
SensorFault 传感器异常

基础报警逻辑示例:

1
2
3
IF PressureActual < MinPressure THEN
AlarmLow := TRUE;
END_IF;

实际工程中还要考虑:

  • 报警延时,避免瞬时波动误报
  • 报警锁存,避免故障消失后历史不可追溯
  • 报警复位条件,避免未处理故障被直接清除
  • 报警码统一映射,方便上位机显示和日志记录

关键设计原则

实时逻辑必须在 PLC:

  • 压力判断
  • 联锁
  • 状态机
  • 报警生成
  • 阀输出控制

上位机不能做实时判断:

  • 网络有延迟
  • 操作系统非实时
  • 通信可能中断
  • UI 线程和业务线程不适合作为安全控制依据

工业系统的分层关系:

1
2
控制层 PLC = 决策 + 安全 + 执行
上位机 = 管理 + 可视化 + 配置

工程经验总结

比例阀系统本质是压力版伺服系统:PLC 负责闭环判断、状态机和安全联锁,上位机只负责参数、配方、显示和记录。

设计时最重要的是把实时控制闭环留在 PLC,把人机交互和数据管理放到上位机,不要让上位机成为安全链路的一部分。

背景

局域网内有些 PC 访问 GitHub repo 受限,但本机可以正常访问 GitHub。目标是在本机提供一个局域网 HTTP/HTTPS 正向代理,让其他电脑通过本机代理执行:

1
2
3
git clone https://github.com/xxx/yyy.git
git fetch
git pull

本机环境:

  • Ubuntu 22.04
  • 本机局域网 IP:192.168.111.231/24
  • 代理端口:3128
  • 允许访问的网段:192.168.111.0/24

为什么不用 Nginx

Nginx 默认适合做 Web 服务和反向代理,例如把外部请求转发到某个内部 HTTP 服务。

但是 GitHub repo 通常走 HTTPS,Git 客户端需要 HTTP 代理支持 CONNECT 方法来建立 HTTPS 隧道。标准 Nginx 不适合作为通用正向 HTTPS 代理,除非额外编译第三方模块,例如 ngx_http_proxy_connect_module

这个场景更适合使用 Squid:

  • 原生支持 HTTP/HTTPS 正向代理
  • 支持 CONNECT
  • 支持 ACL 限制来源网段,避免变成开放代理
  • 日志和诊断能力更直接

安装 Squid

1
2
sudo apt update
sudo apt install -y squid

安装后 Squid 的主配置文件在:

1
/etc/squid/squid.conf

配置正向代理

先备份原配置:

1
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak.codex-20260608-1022

/etc/squid/squid.conf 改成下面的最小配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Squid forward proxy for LAN Git HTTPS access.
# Host LAN address: 192.168.111.231/24

acl local_lan src 192.168.111.0/24
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow local_lan
http_access deny all

http_port 3128

access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log

关键点:

  • acl local_lan src 192.168.111.0/24:只允许当前局域网使用代理。
  • acl SSL_ports port 443:允许 HTTPS 目标端口。
  • acl CONNECT method CONNECT:识别 HTTPS 隧道请求。
  • http_access deny CONNECT !SSL_ports:只允许对安全端口做 CONNECT
  • http_access deny all:最后兜底拒绝其他来源,避免开放代理。

校验配置并重启

配置写完后先检查语法:

1
squid -k parse -f /etc/squid/squid.conf

重启并设置开机启动:

1
2
3
sudo systemctl enable --now squid
sudo systemctl restart squid
sudo systemctl status squid --no-pager

检查监听端口:

1
ss -ltnp

正常情况下可以看到:

1
LISTEN ... *:3128 ...

防火墙

这次实践中检查到 UFW 没有启用:

1
cat /etc/ufw/ufw.conf

结果:

1
ENABLED=no

所以没有额外添加防火墙规则。

如果 UFW 是启用状态,可以放行当前局域网访问 3128/tcp

1
sudo ufw allow from 192.168.111.0/24 to any port 3128 proto tcp

本机验证

通过本机回环地址验证:

1
curl -I --max-time 10 -x http://127.0.0.1:3128 https://github.com

通过本机局域网地址验证,模拟其他 PC 的访问方式:

1
curl -I --max-time 10 -x http://192.168.111.231:3128 https://github.com

成功时会看到类似结果:

1
2
3
4
HTTP/1.1 200 Connection established

HTTP/2 200
server: github.com

再用 Git 验证 repo 访问:

1
2
3
git -c http.proxy=http://192.168.111.231:3128 \
-c https.proxy=http://192.168.111.231:3128 \
ls-remote https://github.com/git/git.git HEAD

成功结果:

1
9ac3f193c05c2237e2b14ebaa1149e9fc8a1abe0 HEAD

局域网客户端使用

在其他 PC 上设置 Git 全局代理:

1
2
git config --global http.proxy http://192.168.111.231:3128
git config --global https.proxy http://192.168.111.231:3128

验证:

1
git ls-remote https://github.com/git/git.git HEAD

临时使用代理,不写入 Git 全局配置:

1
HTTPS_PROXY=http://192.168.111.231:3128 git clone https://github.com/git/git.git

取消 Git 全局代理:

1
2
git config --global --unset http.proxy
git config --global --unset https.proxy

日志排查

查看 Squid 访问日志:

1
sudo tail -f /var/log/squid/access.log

查看 Squid 服务日志:

1
sudo journalctl -u squid -f

如果客户端无法访问,优先检查:

  1. 客户端和代理机器是否在 192.168.111.0/24 网段。
  2. 客户端能否 ping 到 192.168.111.231
  3. 代理机器 3128 是否在监听。
  4. Squid 日志里是否出现 TCP_DENIED
  5. 本机自己是否能访问 GitHub。

小结

这个场景本质上是正向代理,不是反向代理。Nginx 可以做很多 Web 代理场景,但 GitHub HTTPS repo 访问需要稳定支持 CONNECT,所以 Squid 更直接。

最终局域网电脑只需要把 Git 的 HTTP/HTTPS proxy 指向:

1
http://192.168.111.231:3128

就可以通过本机访问 GitHub HTTPS repo。

OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

切换到绘制线段/图形 —> 绘制参数 —> 更新

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。如创建窗口、处理输入(如键盘、鼠标、游戏手柄)以及管理 OpenGL 上下文,GLFW是开发 OpenGL 应用程序的常用工具之一

GLFW window hint 枚举

安装环境

执行日期:2026-06-03

系统版本:

1
cat /etc/os-release

结果:

1
2
3
PRETTY_NAME="Ubuntu 24.04.4 LTS"
VERSION_CODENAME=noble
UBUNTU_CODENAME=noble

当前系统未安装 ROS2:

1
2
3
which ros2
which colcon
dpkg -l ros2-apt-source ros-jazzy-desktop ros-dev-tools python3-colcon-common-extensions

结果:

1
2
3
4
5
6
which ros2:无输出
which colcon:无输出
dpkg-query: no packages found matching ros2-apt-source
dpkg-query: no packages found matching ros-jazzy-desktop
dpkg-query: no packages found matching ros-dev-tools
dpkg-query: no packages found matching python3-colcon-common-extensions

版本选择

Ubuntu 24.04 Noble 对应 ROS2 Jazzy Jalisco。虽然 2026 年已经有更新的 ROS2 Lyrical,但 Lyrical 的 deb 包面向 Ubuntu 26.04;当前机器是 Ubuntu 24.04,因此选择 Jazzy。

官方文档:

1
https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html

前置检查

检查 locale:

1
locale

结果:

1
2
LANG=zh_CN.UTF-8
LC_ALL=C.UTF-8

已满足 UTF-8 要求。

检查 Ubuntu apt suites:

1
grep Suites /etc/apt/sources.list.d/ubuntu.sources

结果:

1
2
Suites: noble noble-updates noble-backports
Suites: noble-security

noble-updatesnoble-backports 已存在,安装 ros-dev-tools 前不需要修改 Ubuntu 源。

检查前置包:

1
apt-cache policy software-properties-common curl locales

结果:

1
2
3
software-properties-common 已安装
locales 已安装
curl 未安装

安装命令

安装 Ubuntu Universe 源工具与 curl:

1
2
3
sudo apt update
sudo apt install -y software-properties-common curl
sudo add-apt-repository -y universe

安装 ROS2 apt source:

1
2
3
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
sudo dpkg -i /tmp/ros2-apt-source.deb

安装 ROS2 Desktop 和开发工具:

1
2
3
sudo apt update
sudo apt upgrade -y
sudo apt install -y ros-jazzy-desktop ros-dev-tools

配置当前 shell 环境:

1
source /opt/ros/jazzy/setup.bash

可选:写入 ~/.bashrc,让新终端自动加载 ROS2:

1
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc

验证命令

检查命令:

1
2
3
ros2 --version
colcon --help
ros2 doctor

运行 demo:

终端 1:

1
2
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker

终端 2:

1
2
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_py listener

如果 talker 持续输出 Publishinglistener 持续输出 I heard,说明 C++ 和 Python demo 都正常。

遇到的问题

sudo 需要本机密码

执行:

1
2
sudo -n true
sudo apt update

遇到:

1
2
sudo: a password is required
[sudo] password for qqs:

处理:安装流程暂停。需要在本机终端执行一次:

1
sudo -v

输入当前用户密码完成 sudo 授权后,再继续执行上面的 ROS2 安装命令。

当前状态

截至 2026-06-03:已完成系统检查和安装方案记录;因为 sudo 需要本机密码,ROS2 尚未实际安装完成。

关节控制链:

控制器->伺服驱动器->伺服电机->减速器->机械关节<-编码器反馈

步进电机 多对电极依次通断 吸引转子转动指定角度

舵机是加入控制电路的步进电机

伺服电机(Servo Motor)= 电机 + 编码器 + 驱动控制

编码器 霍尔元件 ADC电位器 磁编码器

安装环境

Ubuntu24.04lts

1
2
3
4
5
6
apt install build-essencial gcc make perl dkms

# 可分割的终端窗口 Ctrl+Shift+O Ctrl+Shift+E
apt install terminator
snap install code --classic
apt install gedit

install ROS 2 Jazzy

download deb package

VLM、VLN、VLA, RL

VLM、VLN、VLA

RL(Reinforcement Learning 强化学习) 让机器通过不断试错自主学习最优策略

Tsai-Lenz HandEye(蔡-伦兹手眼标定 Eye-in-Hand) Calibration

AX=XB