当前位置: 首页 > article >正文

SwiftUI原生集成ChatGPT API:从架构设计到流式响应实战

1. 项目概述一个原生的Swift版ChatGPT客户端最近在折腾iOS和macOS上的AI应用开发发现了一个挺有意思的开源项目alfianlosari/ChatGPTSwift。简单来说这是一个用纯SwiftUI构建的、直接调用OpenAI官方API的ChatGPT客户端。它不是一个简单的网页封装而是一个从网络请求、数据模型到UI交互都完全原生的应用。对于iOS/macOS开发者尤其是对集成AI能力感兴趣的同行来说这个项目提供了一个非常干净的“样板间”。它剥离了所有复杂的前后端架构直指核心如何在一个现代化的Swift应用中优雅、高效地与OpenAI的ChatGPT API进行对话。我花了一些时间深入研究它的代码并基于它做了些实验发现其设计思路和实现细节有不少值得借鉴的地方尤其是在处理流式响应、管理对话状态以及构建响应式UI方面。如果你正打算在自己的App里加入一个智能聊天助手或者想学习如何将大语言模型LLMAPI集成到原生客户端这个项目会是一个极佳的起点。2. 核心架构与设计思路拆解2.1 为什么选择纯SwiftUI与原生API集成在移动端集成AI功能常见的有几种方案一种是内嵌一个WebView直接加载ChatGPT的网页版另一种是使用第三方封装好的SDK还有一种就是像这个项目一样直接调用官方API。ChatGPTSwift选择了最后一种并且用SwiftUI来实现UI这背后有清晰的考量。首先直接调用API意味着完全的控制权。你不再受限于网页版的界面或功能可以自定义整个对话流程、UI交互、历史记录管理方式甚至能深度定制发送给API的提示词Prompt和参数。这对于打造具有品牌特色或特定功能如角色扮演、专业领域问答的应用至关重要。其次SwiftUI的声明式语法与ChatGPT的异步、流式特性天然契合。SwiftUI的State、ObservedObject等属性包装器可以非常方便地管理对话状态如是否正在加载、消息列表而Async/Await语法则让处理API的异步网络请求和流式响应变得清晰直观。最后这是一个轻量级、学习成本低的参考实现。它没有引入复杂的依赖主要依赖SwiftOpenAI这个第三方库进行API封装项目结构清晰专注于演示“聊天”这一核心场景开发者可以快速理解并将其模块集成到自己的项目中。2.2 项目整体结构解析打开项目你会发现它的结构非常简洁主要分为几个部分模型层Models定义了核心的数据结构例如ChatMessage它可能包含角色role如user、assistant、内容content、唯一标识符id和时间戳。这是应用状态的核心。服务层/网络层Service/Network这里封装了与OpenAI API交互的所有逻辑。项目使用了SwiftOpenAI库它提供了类型安全的方式调用各种端点如ChatCompletion。核心是一个OpenAIService类它持有API密钥并暴露出发送消息、处理流式响应等方法。视图模型层ViewModel这是连接模型和视图的桥梁。通常会有一个ChatViewModel或ConversationViewModel它是一个ObservableObject包含一个ChatMessage数组作为状态并提供sendMessage(_:)等方法。视图模型会调用服务层的方法接收API返回的数据或数据流并更新模型状态。视图层Views用SwiftUI构建的用户界面。主要包括消息列表视图MessageListView、输入框视图MessageInputView等。它们通过StateObject或ObservedObject绑定到视图模型实现状态的自动同步。这种清晰的分层架构MVVM使得代码易于维护和测试。视图只关心如何展示视图模型处理业务逻辑和状态管理服务层专注网络通信。3. 核心功能实现细节与实操要点3.1 对话消息的建模与状态管理一个聊天应用的核心是消息列表。在ChatGPTSwift中消息通常被建模为一个ChatMessage结构体数组。这里有几个关键点消息角色的定义为了匹配OpenAI API的格式你需要明确定义消息的角色。通常有三种system: 系统指令用于设定AI助手的背景或行为准则例如“你是一个乐于助人的编程助手”。user: 用户发送的消息。assistant: AI助手回复的消息。在代码中这通常用一个枚举enum ChatRole来表示。当用户发送一条消息时你需要在本地立即生成一个role为.user的ChatMessage对象并添加到消息数组中这样UI就能立刻显示用户的输入提供即时反馈。然后再将这个数组或其中最近的一部分考虑到上下文长度限制发送给API。状态管理消息数组应该被放置在视图模型中并用Published修饰这样任何改动都会自动触发UI更新。此外还需要管理一些辅助状态例如isLoading: Bool表示是否正在等待AI回复用于显示加载指示器。inputText: String绑定到输入框的文本。errorMessage: String?存储可能发生的错误信息。实操心得在处理消息数组时要特别注意线程安全。网络请求的回调可能在后台线程而更新Published属性进而触发UI更新必须在主线程。务必使用DispatchQueue.main.async或MainActor来确保状态更新在正确的线程上进行否则可能导致UI崩溃或更新不及时。3.2 与OpenAI API的交互非流式与流式响应这是项目的技术核心。OpenAI的聊天补全Chat CompletionAPI支持两种返回方式一次性返回和流式返回。一次性返回这是最简单的方式。你发送一个请求API处理完成后将完整的回复内容一次性返回。实现起来简单但用户需要等待整个回复生成完毕才能看到内容体验上会有明显的“卡顿”感。流式返回这是ChatGPTSwift项目重点展示的也是现代AI聊天应用的标准体验。你将API请求的stream参数设为true服务器就会以Server-Sent Events (SSE)的形式将回复内容拆分成多个片段chunks逐步推送给客户端。在客户端你会收到一系列事件每个事件包含回复的一部分例如一个词或一句话。在Swift中处理流式响应Async/Await和AsyncSequence是绝配。SwiftOpenAI库的流式方法通常会返回一个AsyncThrowingStream。你可以这样处理let stream try await openAIService.sendChatStream(messages: messages) for try await chunk in stream { // 每个chunk包含回复的一部分增量内容 if let delta chunk.choices.first?.delta.content { // 将delta内容追加到当前正在构建的助手消息中 await MainActor.run { // 更新UI例如将delta添加到消息列表最后一条assistant消息的content后面 } } }这种方式下用户可以看到回复一个字一个字地“打”出来体验非常流畅。注意事项流式响应虽然体验好但处理起来更复杂。你需要妥善管理“当前正在回复的消息”这个状态。通常做法是在开始接收流之前先在消息数组中添加一个role为.assistant但content为空的消息。然后在每次收到delta时将内容追加到这条消息的content后面。同时要处理好网络中断、用户取消等异常情况确保状态能正确重置。3.3 SwiftUI视图的构建与性能优化有了视图模型提供的数据源构建SwiftUI视图就相对直接了。消息列表使用List或ScrollViewLazyVStack来显示消息数组。对于每条消息根据其role来决定气泡的样式对齐方式、背景色等。为了提高性能尤其是在消息很多时一定要使用LazyVStack它只会渲染当前可见区域内的视图。输入区域通常包含一个TextField或TextEditor以及一个发送按钮。发送按钮的状态应该与isLoading和inputText是否为空绑定。在发送消息时除了调用视图模型的方法还要清空输入框。键盘适配在iOS上需要处理好键盘的弹出和收起确保输入框不会被键盘遮挡。可以使用.ignoresSafeArea(.keyboard)或监听键盘通知来调整界面。一个常见的优化点是处理长文本和代码块。AI回复可能包含代码片段。简单的Text视图可能无法很好地渲染代码或保持格式。可以考虑集成一个支持Markdown或语法高亮的第三方文本渲染库或者对于代码块使用等宽字体、背景色和适当的边距来区分。4. 关键配置与安全实践4.1 API密钥的管理与安全这是所有集成OpenAI API的应用必须严肃对待的问题。绝对不要将API密钥硬编码在客户端的代码中一旦代码被反编译密钥就会泄露他人就可以用你的密钥发起请求导致巨额账单。正确的做法是使用后端中转构建一个简单的后端服务可以用Vapor、Perfect等Swift服务端框架也可以用Node.js、Python等任何语言。你的iOS应用将用户消息发送到你的后端服务器由后端服务器添加你的OpenAI API密钥再转发请求给OpenAI并将结果返回给iOS应用。这样API密钥就安全地存储在你的服务器上。退而求其次的方案仅用于开发/学习如果只是个人开发或原型验证可以考虑从安全的地方读取密钥例如环境变量在Xcode的Scheme设置中配置环境变量。配置文件创建一个Config.plist文件将密钥放在里面并在.gitignore中忽略此文件防止提交到公开仓库。钥匙串Keychain将密钥加密后存储在iOS系统的钥匙串中。ChatGPTSwift项目在示例中可能会为了简化而将密钥写在代码里但在任何正式或公开的项目中你必须采用上述安全措施。4.2 模型参数与对话配置发送请求时除了消息列表还有一些关键参数影响对话质量和成本模型model例如gpt-3.5-turbo,gpt-4,gpt-4-turbo-preview。选择不同的模型在能力、速度和价格上差异很大。对于大多数聊天场景gpt-3.5-turbo是性价比很高的选择。温度temperature取值范围0~2。控制输出的随机性。值越低如0.2输出越确定、一致值越高如0.8输出越随机、有创造性。聊天应用通常设置在0.7到1.0之间。最大令牌数max_tokens限制单次回复的最大长度。需要设置一个合理的值防止生成过长的回复消耗过多token。注意这个限制是对于单次回复的不是整个对话。上下文管理API调用需要携带历史消息作为上下文。但模型有上下文长度限制例如gpt-3.5-turbo是16k tokens。当对话轮数很多时你需要一个策略来管理上下文例如只保留最近N条消息或者当token数接近上限时有选择地丢弃最早的消息。在ChatGPTSwift的视图模型中这些参数可以作为可配置的属性让用户有一定程度的自定义空间比如在设置页面调整“创造性”。5. 功能扩展与高级实现思路基础聊天功能实现后可以考虑添加更多提升体验的功能5.1 对话历史持久化用户肯定希望关闭App后聊天记录还在。这就需要将消息数组持久化到本地。简单的方式是使用UserDefaults但更适合存储结构化数据的方式是使用Core Data或SwiftDataiOS 17。你可以定义一个Conversation实体它包含多个Message实体。每次启动App时从数据库加载最近的对话或对话列表。5.2 多对话/会话管理从一个单一的聊天界面扩展成一个可以创建、切换、删除不同对话的应用。这需要上层的数据模型管理一个Conversation列表每个Conversation包含自己的消息列表和标题可以自动用第一条消息生成。主界面可能变成一个会话列表点击后进入具体的聊天视图。5.3 系统指令System Prompt预设让用户可以创建或选择不同的“AI角色”预设。例如“编程助手”、“创意写手”、“英语老师”等。每个预设对应一个不同的系统指令。这可以通过在发送给API的消息列表最前面固定插入一条role为system的消息来实现。你可以在App内提供一个预设管理器。5.4 联网搜索与工具调用Function CallingOpenAI的API支持函数调用功能模型可以根据对话内容决定是否需要调用外部工具如查询天气、搜索网络、查询数据库。要实现这个你需要在请求中定义你可以提供的“工具”函数列表包括函数名、描述和参数格式。在模型的回复中它可能会返回一个表示需要调用某个函数的特殊消息。你的客户端解析这个消息在本地执行相应的函数或调用另一个API。将函数执行的结果作为一条新消息role为tool再次发送给模型让它基于结果生成面向用户的回复。这个功能能极大扩展AI助手的能力边界但实现复杂度也更高需要前后端配合。5.5 性能与用户体验优化本地缓存与预览对于AI生成的较长回复如文章、代码可以考虑在生成完毕后将其内容缓存到本地下次打开对话时能立即显示而无需重新加载虽然API调用本身有历史上下文但本地缓存可以提供更快的首屏渲染。支持富媒体虽然核心是文本但可以扩展支持用户发送图片Vision模型或者让AI回复中包含建议的链接、格式化的列表等。错误处理与重试网络请求总会失败。需要友好的错误提示如“网络连接失败请重试”并为用户提供重试发送消息的按钮。对于可重试的错误如超时可以自动重试一次。6. 常见问题与调试技巧在实际开发和集成过程中你可能会遇到以下典型问题6.1 网络请求失败与错误处理问题API请求返回错误如401认证失败、429速率限制、500服务器内部错误。排查检查API密钥确保密钥正确、未过期且有足够的额度。检查网络连接确保设备可以正常访问api.openai.com注意地区网络政策。查看错误信息OpenAI的API错误响应体通常会包含详细的错误信息在调试时打印出来。SwiftOpenAI库会将错误抛出捕获并打印即可。速率限制免费账号或某些套餐有每分钟/每天的请求次数和Token数量限制。如果请求太频繁会收到429错误。需要在代码中实现简单的限流或退避重试机制。6.2 流式响应中断或不完整问题流式响应在中间突然停止回复不完整。排查网络稳定性流式连接对网络稳定性要求更高。检查是否在弱网环境下。上下文长度超限如果发送的对话历史加上请求的max_tokens超过了模型的总上下文长度API可能会提前终止流。需要优化上下文管理策略裁剪过长的历史。代码逻辑错误检查处理AsyncThrowingStream的循环是否被意外break或return以及错误是否被正确捕获而没有中断整个流程。6.3 UI更新卡顿或闪烁问题在流式接收文本并频繁更新UI时列表滚动卡顿或者文本追加时视图闪烁。排查与优化主线程检查确保所有UI更新如向消息数组追加内容都在MainActor上执行。减少不必要的视图刷新使用ObservableiOS 17或精心设计Published属性避免因某个状态的微小变化导致整个视图层次重新计算。对于频繁更新的文本可以考虑使用TextView或自定义的文本渲染方式而不是每次追加都触发整个消息气泡的重绘。使用LazyVStack在消息列表中务必使用LazyVStack它是性能的关键。为消息项添加稳定标识符在List或ForEach中为每个ChatMessage使用其唯一的id作为标识符id: \.id帮助SwiftUI更高效地复用视图。6.4 如何调试API请求与响应技巧打印完整的请求体在调用SwiftOpenAI库的方法前将你构造的消息数组和参数打印出来确认格式正确特别是role和content字段。使用网络调试代理在Mac上开发macOS应用或iOS模拟器时可以使用Proxyman或Charles等工具抓包直接查看发送给OpenAPI的HTTP请求和原始的SSE流响应这是最直接的调试方式。模拟响应进行UI开发在UI尚未与真实API联调时可以创建一个MockOpenAIService实现相同的接口但返回预设的静态数据或模拟流式响应。这可以让你并行开发UI和逻辑提高效率。alfianlosari/ChatGPTSwift这个项目就像一份精心准备的“食材”它展示了如何用SwiftUI烹饪一道“AI聊天”的基础菜肴。它的价值在于清晰的架构和核心流程的实现。当你掌握了这些基础就可以根据自己的“口味”加入持久化、多会话、工具调用等“调料”最终做出一款功能丰富、体验出色的AI原生应用。整个过程中最需要关注的是状态管理的正确性、网络请求的健壮性以及用户交互的流畅性。多动手实验从简单的非流式开始逐步过渡到流式再慢慢添加复杂功能是学习这个过程的最佳路径。

相关文章:

SwiftUI原生集成ChatGPT API:从架构设计到流式响应实战

1. 项目概述:一个原生的Swift版ChatGPT客户端最近在折腾iOS和macOS上的AI应用开发,发现了一个挺有意思的开源项目:alfianlosari/ChatGPTSwift。简单来说,这是一个用纯SwiftUI构建的、直接调用OpenAI官方API的ChatGPT客户端。它不是…...

从专利大国到专利强国:企业全球专利布局策略与实战指南

1. 从“专利大国”到“专利强国”:一场关于价值与布局的深度思考最近翻看一些行业旧闻,2016年EE Times上那篇关于中国专利“不出海”的讨论,现在读来依然很有嚼头。文章核心就一句话:根据世界知识产权组织(WIPO&#x…...

深入浅出:用Grad-CAM解锁Swin Transformer的视觉注意力

1. 为什么需要理解Swin Transformer的视觉注意力? 当你第一次看到Swin Transformer在图像分类任务中表现出色时,可能会好奇它到底"看"到了图像的哪些部分。传统的卷积神经网络(CNN)通过局部感受野逐步提取特征&#xff…...

深入解析Baichuan-7B:从GPT架构到LoRA微调的实践指南

1. 项目概述:从开源大模型到“百川”入海 最近在和朋友聊起国内大模型的开源生态时,总绕不开一个名字——“百川”。我说的不是地理上的河流,而是由百川智能公司开源的Baichuan系列大语言模型。今天想重点聊聊的,是它的起点&#…...

校企合作奖学金与实习计划:破解半导体硬件人才困境的务实路径

1. 行业人才困境的根源与一个被忽视的解法最近和几位在半导体、硬件设计领域摸爬滚打了十几年的老朋友聊天,话题不出意外地又绕回了“招人难”。从深圳的硬件创业公司,到上海的外企研发中心,再到西安的老牌研究所,几乎所有人都在抱…...

降AI率软件9平台覆盖测评:嘎嘎降自研稳定vs套壳工具单平台!

降AI率软件9平台覆盖测评:嘎嘎降自研稳定vs套壳工具单平台! 「支持知网维普」实际只能稳定降一个平台,这是怎么回事? 我是双学位本科生,毕业论文 3.5 万字。学校规定送知网做 AIGC 检测,但导师建议我自己…...

嵌入式与硬件设计前沿:IIoT、FIDO、TSN与GaN无线充电实战解析

1. 项目概述:一场面向硬件工程师的在线技术盛宴如果你是一名嵌入式系统开发者、汽车电子工程师,或者正在为你的智能硬件产品寻找无线充电方案,那么最近一段时间密集出现的线上技术研讨会,绝对值得你花时间关注。这不是泛泛而谈的理…...

MAXON 机电高压油安全切断阀 通用型摆动式闸阀 灰铸铁 8790

在工业锅炉、熔炉及加热系统中,燃料管路的安全切断是防控火灾与爆炸风险的核心环节。MAXON(麦克森)8790 机电高压油安全切断阀,作为霍尼韦尔旗下经典的通用型摆动式闸阀,以灰铸铁阀体、毫秒级切断速度与严苛安全认证&a…...

如何轻松下载B站4K大会员视频?这款开源工具让你三步搞定离线收藏

如何轻松下载B站4K大会员视频?这款开源工具让你三步搞定离线收藏 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 想象一下…...

CoPaw个人AI工作站:私有化部署与智能体集成实战指南

1. 项目概述:你的个人AI工作站 如果你正在寻找一个能真正为你所用、在你掌控之下的AI助手,而不是一个用完即走的聊天机器人,那么CoPaw的出现,可能正是你等待已久的答案。简单来说,CoPaw是一个开源的、可私有化部署的“…...

量子支持向量机原理与硬件优化实践

1. 量子支持向量机基础原理与硬件挑战量子支持向量机(QSVM)是传统支持向量机在量子计算框架下的扩展,其核心创新点在于利用量子态空间的高维特性构建核函数。与传统核方法相比,量子核映射通过量子电路将经典数据编码到希尔伯特空间…...

中国词元与世界AI元语:模力方舟和口袋龙虾的协同进化

在AI产业从技术突破转向生态竞争的今天,一个核心命题日益凸显:如何让顶尖的AI能力跨越技术鸿沟,真正触达每一个开发者与终端用户?开源中国以“模力方舟”与“口袋龙虾”为双核驱动,构建了一条从底层资源聚合到上层应用…...

【独家首发】DeepSeek-V2模型GPU利用率可视化方案:仅需3个自定义Metrics,告别盲调参数

更多请点击: https://intelliparadigm.com 第一章:DeepSeek Grafana可视化 DeepSeek 是一款高性能、低延迟的开源时序数据引擎,其原生支持 Prometheus 兼容指标暴露。将 DeepSeek 与 Grafana 集成,可实现对模型推理吞吐、GPU 显存…...

AI智能体商业化实战:x402支付技能包集成指南

1. 项目概述:为AI智能体插上商业化的翅膀最近在折腾AI智能体(Agent)的落地应用,发现了一个挺有意思的痛点:怎么让这些能写代码、能处理任务的AI,真正地“赚到钱”?或者说,我们开发者…...

别再被Excel文件‘炸’了!手把手教你用ZipSecureFile.setMinInflateRatio解决Apache POI的Zip Bomb报错

深度解析Apache POI的Zip Bomb防护机制与安全实践 当Java开发者使用Apache POI处理用户上传的Excel文件时,可能会突然遭遇"Zip bomb detected!"的报错。这个看似简单的错误背后,实际上涉及文件安全检测、内存防护和系统稳定性等多重考量。本文…...

基于AutoHotkey v2的Cursor AI编程效率工具:CapsLock快捷键方案详解

1. 项目概述:当CapsLock键成为你的AI编程副驾如果你是一名Windows用户,同时又是Cursor编辑器的深度使用者,那么你很可能和我一样,每天都在重复着一些机械操作:选中代码、复制、切换到AI聊天框、粘贴、再敲入一段提示词…...

基于Rust构建命令行任务监控与通知工具:openclaw-tui-notify实践

1. 项目概述与核心价值最近在折腾一个后台数据处理脚本,它经常一跑就是好几个小时。问题来了,我总不能一直盯着终端看它什么时候结束吧?有时候去开个会、吃个饭,回来发现脚本早就跑完了,白白浪费了时间等结果。更头疼的…...

WSL启动器openclaw-wsl-launcher:提升Windows与Linux开发效率的桥梁工具

1. 项目概述:一个为WSL设计的OpenClaw启动器如果你和我一样,日常开发的主力环境是Windows,但核心的编译、部署和测试工作又离不开Linux,那么Windows Subsystem for Linux(WSL)绝对是你绕不开的利器。它让我…...

从理论到实践:IGBT热设计与损耗估算的工程化指南

1. IGBT热设计的基础原理 IGBT(绝缘栅双极型晶体管)作为现代电力电子系统的核心器件,其热设计直接关系到设备可靠性和寿命。我第一次接触IGBT热设计是在开发工业变频器时,当时因为散热计算失误导致批量产品返修,这个教…...

AI舞蹈生成实战:从扩散模型原理到seedance-2.0部署与调优

1. 项目概述:从种子到舞蹈的AI生成革命最近在AI生成领域,一个名为“seedance-2.0”的项目引起了我的注意。这个项目名本身就很有意思,“seedance”可以拆解为“seed”(种子)和“dance”(舞蹈)&a…...

ARM LDM指令原理与应用详解

1. ARM LDM指令架构解析LDM(Load Multiple)指令是ARM架构中用于批量加载数据的核心指令之一。作为一位长期从事ARM底层开发的工程师,我经常需要在中断处理、上下文切换等场景中使用LDM指令。与单寄存器加载指令相比,LDM指令通过单条指令即可实现从连续内…...

本地AI智能体框架NagaAgent:基于开源大模型的规划与工具调用实践

1. 项目概述:一个被低估的本地AI智能体框架最近在折腾本地大模型应用,特别是想搞点能自己跑起来的智能体(Agent),发现了一个挺有意思但讨论度不高的项目——RTGS2017/NagaAgent。乍一看这个标题,可能会觉得…...

基于陷门矩阵的高效安全委托计算方案

1. 项目概述在现代计算环境中,线性代数运算(如矩阵乘法)占据了大量计算资源。随着云计算和机器学习的发展,越来越多的计算任务被委托给云端服务器执行。然而,这种委托计算模式带来了严重的数据隐私问题——用户需要将原…...

从国赛H题到实战:构建远程幅频特性测试系统的硬件设计精要

1. 从竞赛到实战的硬件设计转型 参加电子设计竞赛的朋友们都知道,国赛H题这类题目往往能给我们带来宝贵的实战经验。2017年的这道远程幅频特性测试装置题目,看似是一个具体的竞赛任务,实则蕴含了许多通用硬件设计原理。我在实际项目中多次运用…...

如何高效管理Zotero插件:一站式插件市场完整指南

如何高效管理Zotero插件:一站式插件市场完整指南 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 还在为…...

tokenviz:量化你的AI编程助手使用习惯,生成GitHub风格热力图

1. 项目概述:你的AI编码助手使用报告作为一名每天和代码打交道的开发者,我发现自己越来越依赖AI编程助手了。从最初的Copilot补全,到后来深度使用Cursor、Claude Code,这些工具已经成了我工作流中不可或缺的一部分。但用久了&…...

触发器如何在主从架构下进行同步_基于Row格式的Binlog规避触发器

不会。MySQL在ROW格式Binlog下,主库触发器产生的变更不生成独立Binlog事件,从库仅回放行记录快照,跳过触发器执行;若启用STATEMENT/MIXED模式或手动关闭从库只读,才可能意外触发。主库触发器写入会不会被同步到从库不会…...

三步轻松上手:BilldDesk Pro开源远程桌面控制工具完整指南

三步轻松上手:BilldDesk Pro开源远程桌面控制工具完整指南 【免费下载链接】billd-desk 基于Vue3 WebRTC Nodejs Flutter搭建的远程桌面控制、游戏串流 项目地址: https://gitcode.com/gh_mirrors/bi/billd-desk 如果你正在寻找一款功能强大且完全免费的跨…...

PX4-Autopilot扩展卡尔曼滤波状态估计系统深度解析与实战调优

PX4-Autopilot扩展卡尔曼滤波状态估计系统深度解析与实战调优 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot PX4-Autopilot作为开源无人机飞控系统的标杆,其核心状态估计模块EKF2&…...

点云匹配方法 NDT(正态分布变换)

1. 正态分布变换 (NDT) 在点云匹配中,ICP基于距离直接最优化变换矩阵的参数,由于是欠定方程且旋转矩阵的约束,使得结果很难优化,为此在新的维度优化变换矩阵的参数,被很好的提出: 先将参考点云&#xff0…...