基于ROS2与Qt6的嵌入式GUI开发:以NXP EasyEVSE充电站为例
1. 项目概述与核心价值如果你正在开发一个智能电动汽车充电站EVSE那么人机交互界面和用户身份认证绝对是绕不开的两个核心模块。一个直观的GUI能让用户和管理员清晰地掌控充电状态、费用和能耗而一套可靠的认证机制比如NFC刷卡则是保障运营安全和用户便捷性的关键。NXP推出的EasyEVSE参考设计平台恰好为我们提供了一个绝佳的实战样本它完整地展示了如何在基于Linux的嵌入式系统上使用Qt6构建GUI并集成PN7160 NFC读卡器来实现这些功能。这个项目的精髓不在于从零造轮子而在于理解如何将成熟的工业级技术栈——Linux、Qt、ROS2、NFC——无缝整合到一个实时性、可靠性要求极高的嵌入式产品中。它解决了嵌入式开发者常面临的几个痛点如何在资源受限的平台上实现流畅的图形界面如何让不同的功能模块如电表、充电控制、云通信高效、解耦地交换数据以及如何快速集成像NFC这样的标准外设并确保其稳定工作。通过剖析EasyEVSE的实现我们不仅能学到具体的代码怎么写更能掌握一套在复杂物联网设备中组织软件架构的思维模式。2. 系统架构与通信机制解析在深入GUI和NFC的细节之前我们必须先理解整个EasyEVSE软件系统的骨架。它不是一个单一的大程序而是一个由多个独立进程在ROS2中称为节点组成的分布式系统。这种基于ROS2的微服务化架构是保证系统模块化、可维护性和可扩展性的基石。2.1 ROS2发布/订阅模型的核心作用ROS2的核心通信模型是发布/订阅。想象一下一个会议室有的人是信息发布者Publisher站起来宣布消息有的人是信息订阅者Subscriber只收听自己感兴趣的话题。在EasyEVSE中各个功能模块就是这样的角色。云服务节点作为发布者定期发布从云端下发的策略如grid_pwr_lim电网功率限制、tariff_cost费率。充电协议栈节点作为发布者发布最核心的充电过程数据如chg_state充电状态A/B/C、energy_delivered已充电量、vehicle_auth车辆认证状态。电表节点作为发布者发布实时电气参数如voltage电压、current电流、power功率。NFC节点作为发布者在读到卡片时发布nfc_id卡片UID。GUI节点它是核心的订阅者同时订阅以上所有主题。一旦任何数据有更新回调函数会被触发GUI立即更新界面显示。这种设计的最大优势是解耦。GUI不需要知道数据具体从哪里来、怎么计算的它只关心接收和显示。电表模块升级或云服务接口变更只要它们发布的消息格式不变就完全不影响GUI。这极大降低了系统不同模块间的依赖和集成难度。2.2 数据结构定义与消息流数据在节点间流动需要统一的“语言”这就是ROS2的msg文件。在EasyEVSE中定义了多个自定义消息类型。例如NfcData.msg可能简单到只有一行string nfc_id。而StackData.msg则会复杂很多包含数十个字段覆盖充电过程的方方面面。当NFC读卡器检测到卡片时nfcNode.cpp中的处理线程会获取UID并构造一个NfcData消息通过publisher-publish(nfc_data)发送出去。与此同时GUI节点中的nfc_data_subscription_会接收到这个消息其绑定的回调函数nfc_data_callback被调用在这个函数内部我们执行ui-lineEdit_Card_UID-setText(...)来更新UI上的文本框。注意数据同步与线程安全。GUI的主线程负责处理界面刷新而ROS2的订阅回调通常发生在ROS2管理的线程池中。直接在回调函数中操作UI控件在某些框架下可能导致崩溃。Qt提供了安全的跨线程信号槽机制。在guiNode.cpp中更佳实践是在回调函数中仅更新内存中的数据模型然后发射一个Qt信号在主线程的槽函数中执行UI更新。虽然示例代码可能简化了这一步但在实际高可靠性产品中这是必须考虑的。3. Qt6 GUI开发实战详解GUI是用户与充电站交互的窗口。EasyEVSE的GUI基于Qt6 Widgets模块开发这是一个经典且强大的选择特别适合需要复杂自定义控件和确定性格局的工业嵌入式界面。3.1 项目结构与工程搭建从提供的材料看GUI部分的核心文件结构清晰mainwindow.ui用Qt Designer设计的XML格式界面文件。这里拖拽按钮、标签、布局所见即所得。mainwindow.h/cpp主窗口类的头文件和实现文件。这里定义了界面控件的交互逻辑例如按钮点击的槽函数。guiNode.cpp这是连接GUI和ROS2世界的桥梁。它继承自rclcpp::Node负责初始化ROS2节点、创建发布者和订阅者并实现数据回调函数。一个关键的整合点是guiNode.cpp中的MainWindow实例访问。通常我们会在main.cpp或guiNode.cpp的初始化函数中将MainWindow对象的指针传递给ROS2节点这样在数据回调函数中才能调用w-ui-xxx来更新界面。实操心得Qt项目与ROS2节点的融合。这并不是一个标准的Qt项目缺少.pro或CMakeLists.txt因为它深度嵌入了ROS2的构建系统如colcon。开发时可以在Qt Creator中创建一个独立的标准Qt Widgets项目进行UI设计和基础逻辑调试待UI稳定后再将mainwindow.ui、.h、.cpp文件移植到ROS2工作空间的src/gui目录下并编写guiNode.cpp来完成通信集成。这能大大提高前期开发效率。3.2 多页面导航与QStackedWidget充电站GUI通常信息繁多需要分页面组织。EasyEVSE使用了QStackedWidget来实现这一点。你可以把它想象成一叠卡片每次只显示最上面的一张。创建页面在Qt Designer中设计多个QWidget每个都是一个独立的页面如主菜单、NFC页面、电表页面。添加到堆栈将这些QWidget依次添加为QStackedWidget的子页面。每个页面都有一个索引Index从0开始。页面切换通过ui-stackedWidget-setCurrentIndex(index)来切换页面。例如主菜单的“电表”按钮点击后切换到索引为3的页面。// 在mainwindow.cpp中 void MainWindow::on_button_meter_clicked() { // 假设电表页面的索引是3 ui-stackedWidget-setCurrentIndex(3); } void MainWindow::on_button_back_clicked() { // 返回主菜单索引为0 ui-stackedWidget-setCurrentIndex(0); }3.3 数据绑定与实时刷新GUI的核心价值是实时反映系统状态。在EasyEVSE中每个UI控件的数据源都有明确的归属界面组件数据源节点对应ROS2消息字段说明与处理充电状态SEVENSTAX (充电协议栈)stack_data.charging(布尔值)通常转换为“充电中”/“空闲”文本或不同颜色的指示灯。充电功率SEVENSTAXstack_data.chg_rate直接显示单位可能是kW。已充电量SEVENSTAXstack_data.energy_delivered直接显示单位kWh。充电费用SEVENSTAX CLOUDstack_data.energy_delivered * cloud_data.tariff_cost需要融合计算。GUI节点订阅两者在回调中计算并更新。电网功率限制CLOUDcloud_data.grid_pwr_lim来自云端的控制参数用于显示或设置。电压/电流METERmeter_data.voltage,meter_data.current直接从电表节点获取通常需要单位转换如V, A。NFC卡UIDNFCnfc_data.nfc_id字符串直接显示。在guiNode.cpp的各个回调函数中更新逻辑如下void GUINode::meter_data_callback(const interfaces::msg::MeterData::SharedPtr msg) { // 假设 ‘w‘ 是 MainWindow 的实例指针 float voltage msg-voltage; float current msg-current; float power_kw msg-power / 1000.0; // 转换为千瓦 // 使用Qt信号槽或直接调用确保线程安全更新UI QMetaObject::invokeMethod(w, [this, voltage, current, power_kw]() { w-ui-label_voltage-setText(QString::number(voltage, f, 1) V); w-ui-label_current-setText(QString::number(current, f, 1) A); w-ui-label_power-setText(QString::number(power_kw, f, 2) kW); }, Qt::QueuedConnection); // 确保跨线程安全调用 }4. NFC功能集成深度剖析NFC为充电站提供了便捷、无接触的身份识别方式。EasyEVSE选用NXP自家的PN7160控制器这是一个集成了固件和NCI接口的“交钥匙”方案大大降低了驱动开发难度。4.1 硬件与驱动层集成集成PN7160到Linux系统需要完成以下三层工作内核驱动nxpnfc驱动。这是与PN7160硬件对话的底层模块。在EasyEVSE的Yocto项目中通过内核补丁的方式将驱动源码添加到drivers/nfc/目录并编译进内核。设备树Device Tree的配置至关重要它告诉内核SPI总线上的哪个设备是NFC控制器。lpspi6 { status okay; nxpnfc0 { compatible nxp,nxpnfc; reg 0; nxp,nxpnfc-irq gpio2 22 GPIO_ACTIVE_HIGH; // 中断引脚 nxp,nxpnfc-ven gpio2 23 GPIO_ACTIVE_HIGH; // 使能引脚 nxp,nxpnfc-fw-dwnld gpio2 24 GPIO_ACTIVE_HIGH; // 固件下载引脚 spi-max-frequency 7000000; // SPI通信频率 }; };驱动加载后会在/dev目录下创建设备节点如/dev/nxpnfc为用户空间程序提供访问接口。用户空间库libnfc-nci。这是NXP提供的官方用户空间库实现了NFC的完整协议栈。它通过内核驱动与PN7160通信并向上层应用提供简洁的API如NfcLib_Init(),NfcLib_DiscoveryStart()。该库通过Yocto的libnfceasyevse.bb食谱被编译并安装到根文件系统。应用层EasyEVSE的nfc_api.c和nfcNode.cpp。nfc_api.c封装了libnfc-nci库的调用实现一个轮询Polling Loop线程持续搜索NFC标签。当检测到卡片时读取其UID。nfcNode.cpp则作为ROS2节点启动这个轮询线程并将读取到的UID通过ROS2话题发布出去。4.2 NFC发现流程与代码实现NFC读卡器的工作模式通常是“发现循环”。以下是其核心流程在代码中的体现// nfc_api.c 中的简化流程 void *nfc_polling_thread(void *arg) { nfc_init(); // 初始化NFC库和硬件 configure_discovery(); // 配置发现模式如只读Type A卡 while (!thread_exit) { start_discovery(); // 开始一轮发现 // 阻塞等待直到有卡片进入场区触发中断 if (card_detected()) { select_card(); // 选择这张卡 get_card_info(card_type, uid, uid_len); // 获取卡片类型和UID // 将UID传递给ROS2节点通过队列、共享内存等线程间通信 notify_new_uid(uid, uid_len); } sleep_ms(100); // 短暂间隔后继续下一轮发现 } nfc_deinit(); return NULL; }在nfcNode.cpp中这个线程被启动并且设置了一个回调当nfc_api.c收到新UID时会触发该回调进而发布ROS2消息。重要警告UID并非安全凭证。文档中特别强调仅凭NFC标签的UID进行身份验证是极不安全的。UID通常是公开可读的攻击者可以轻易复制。在生产环境中必须使用基于加密的认证例如MIFARE Classic使用密钥进行读写认证但已被破解不推荐用于高安全场景。MIFARE DESFire支持3DES/AES加密通信是更安全的选择。NFC手机模拟卡利用手机SE安全元件进行强加密认证。 在EasyEVSE演示中仅读取UID用于显示旨在展示物理集成和基础数据流。实际产品开发必须与安全工程师合作设计完整的加密认证流程。4.3 与GUI及云端的联动NFC读取的UID其价值在于联动本地GUI显示如前所述UID通过ROS2话题发布GUI订阅并实时显示在“NFC Card”页面上给用户即时反馈。上报至云端nfcNode在发布UID的同时也可以触发业务逻辑节点如business_logic_node执行操作。该节点可以将UID作为“用户标识符”结合时间戳、充电桩ID等信息封装成一条消息通过cloud_node发送到云端物联网平台如Azure IoT Central。云端平台据此查询用户数据库完成鉴权、计费关联等操作并可能将结果如“认证成功”下发给充电桩最终在GUI上显示。5. 电表模拟与数据流整合虽然本文重点在GUI和NFC但理解电表数据的来源对于构建完整的GUI至关重要。EasyEVSE平台使用了一块TWR-KM3x开发板作为模拟电表。5.1 模拟电表的工作原理真实电表通过电流互感器或分流器采样交流电流和电压经由高精度ADC如KM3x内置的Σ-Δ ADC转换为数字信号再通过专用计量库如FFT或滤波算法库计算出有功/无功功率、电量等参数。在EasyEVSE的模拟场景中它用一个旋转电位器来模拟变化的电流信号。KM3x的SAR ADC定期采样这个电位器的电压值然后将这个电压值直接输入给NXP的滤波法计量库。该库会“假装”这是一个真实的电流波形并据此计算出一套模拟的电气参数U, I, P等。这虽然不能用于真实计量但完美模拟了真实电表的数据产生、计算和输出流程。5.2 数据上行路径KM3x板计算出的电表数据通过UART串口发送给主控板i.MX 93。在i.MX 93这一侧运行着一个meter_node电表节点。这个节点的工作是打开并监听指定的UART端口如/dev/ttymxc2。解析从KM3x发来的、遵循特定串口协议的数据帧。将解析出的电压、电流、功率值封装成ROS2的MeterData消息。定期例如每秒一次发布这个消息。随后GUI节点订阅meter_data话题就能实时获取并显示这些模拟的电参数。整个链路是电位器 - KM3x ADC - 计量库 - UART - i.MX 93 meter_node - ROS2话题 - GUI节点。注意事项真实产品与演示的区别。若要将此方案用于真实产品必须替换以下部分硬件使用经过安规认证的电流/电压采样电路和隔离方案如文档提到的ADM3251E隔离器替换掉电位器。计量库配置NXP的计量库Filter或FFT需要根据你实际使用的传感器变比、ADC基准电压等参数进行详细的系数校准。这是一个专业且严谨的过程直接使用默认系数会导致计量严重不准。安全与认证电表软件需符合相关计量法规如MID、ANSI C12.20并可能需要进行官方认证。6. 开发、调试与部署要点6.1 开发环境搭建获取SDK与源码从NXP官网下载EasyEVSE Linux SDK。它通常基于Yocto项目包含了所有必要的层BSP、ROS2、Qt、NFC驱动等。配置编译环境按照指南安装Yocto依赖项配置source环境变量。构建镜像使用bitbake命令构建完整的系统镜像。这个过程会自动化编译内核、驱动、根文件系统并集成所有软件包包括Qt GUI和NFC库。交叉编译GUI应用虽然镜像构建包含了GUI但开发阶段需要单独编译调试。你需要配置Qt Creator的交叉编译工具链指向Yocto SDK提供的sysroot和交叉编译器如aarch64-poky-linux-g。6.2 调试技巧ROS2调试使用rqt_graph可视化查看所有节点和话题的拓扑图确认gui_node是否正确订阅了所有话题。使用ros2 topic echo /topic_name可以实时查看话题上的数据流。Qt GUI调试在开发主机上可以用桌面版的Qt Creator和x86架构的ROS2进行大部分UI逻辑和业务逻辑的调试。待功能稳定后再部署到ARM板卡进行集成测试。NFC调试内核层使用dmesg | grep nfc查看驱动加载和设备识别日志。用户层可以先使用NXP提供的命令行工具如nfc-poll测试读卡器硬件和基础库是否工作正常。应用层在nfcNode.cpp中增加RCLCPP_INFO日志输出读取到的UID确认数据流已到达ROS2层。系统日志整个系统的关键日志可以通过journalctl -f命令持续查看对于排查启动问题和运行时错误非常有帮助。6.3 常见问题与排查问题现象可能原因排查步骤GUI启动后无数据更新1. ROS2节点未启动。2. GUI节点订阅的话题名不匹配。3. 数据发布频率极低。1.ros2 node list检查节点。2.ros2 topic list和ros2 topic info /gui_data检查话题。3. 使用ros2 topic hz /topic_name检查发布频率。NFC读卡无反应1. 内核驱动未加载。2. PN7160硬件连接问题SPI中断引脚。3.libnfc-nci库配置错误。1.ls /dev/nxpnfc检查设备节点。2. 检查设备树配置与硬件原理图是否一致。3. 使用官方命令行工具进行基础测试。电表数据为0或异常1. KM3x与i.MX 93的UART连接故障。2. 串口波特率、数据格式不匹配。3. Meter节点解析协议错误。1. 用示波器或逻辑分析仪检查UART引脚波形。2. 确认双方串口配置波特率、数据位、停止位、校验位。3. 在Meter节点中打印原始串口数据进行协议分析。GUI界面布局错乱1. 目标板与开发主机屏幕分辨率或DPI不同。2. Qt字体缺失。3. 布局未设置弹性策略。1. 使用Qt的布局管理器Layouts替代固定坐标。2. 确保目标板根文件系统中包含必要的字体包。3. 在main.cpp中设置高DPI缩放属性QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);6.4 性能与优化考虑GUI刷新率避免在ROS2高频数据回调如每秒100次的电表数据中直接触发UI重绘。可以设置一个定时器例如每秒刷新10-20次UI或者仅在数据变化超过一定阈值时才更新。内存与CPU嵌入式平台资源有限。使用top或htop监控进程资源占用。对于Qt避免使用过于复杂的图形效果或频繁创建销毁大量对象。启动速度考虑将GUI应用设置为系统服务并优化其启动依赖确保在ROS2核心服务启动后再启动GUI节点。通过以上从架构到细节从原理到实操的梳理你应该对如何在类似NXP EasyEVSE这样的嵌入式Linux平台上构建一个集成GUI和NFC功能的复杂物联网系统有了全面的认识。这套以ROS2为中枢、模块化解耦的设计模式不仅适用于充电桩也适用于任何需要多传感器数据融合和复杂人机交互的工业设备具有很强的借鉴意义。

相关新闻

知网文献批量下载终极指南:CNKI-download爬虫工具完整使用教程

知网文献批量下载终极指南:CNKI-download爬虫工具完整使用教程

知网文献批量下载终极指南:CNKI-download爬虫工具完整使用教程 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 想要高效获取知网…

2026/6/22 0:24:20阅读更多 →
DigitalOcean Dedicated Inference:专为vLLM优化的轻量级LLM推理底座

DigitalOcean Dedicated Inference:专为vLLM优化的轻量级LLM推理底座

1. 这不是“又一个云厂商的推理服务”,而是对LLM基础设施成本结构的一次重新校准DigitalOcean推出Dedicated Inference,表面看只是在控制台多了一个“Deploy LLM”的按钮,但如果你真去点开它的定价页、翻过它的文档、甚至尝试部署一个Qwen2-7…

2026/6/22 0:24:20阅读更多 →
算法更新会不会影响GEO优化排名

算法更新会不会影响GEO优化排名

传统SEO从业者对“算法更新”伴随着复杂的情感。百度一次核心算法更新,可能让大量网站的排名发生剧烈变化,有的站流量腰斩,有的一夜起飞。GEO作为另一种“与算法共生”的优化手段,是否也会面临同样的算法波动风险?GEO没…

2026/6/22 0:24:20阅读更多 →
Steam游戏自动破解器:如何合法绕过DRM实现离线游戏自由?

Steam游戏自动破解器:如何合法绕过DRM实现离线游戏自由?

Steam游戏自动破解器:如何合法绕过DRM实现离线游戏自由? 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack 你是否曾经遇到过这样的困扰:购买了正版Ste…

2026/6/22 1:50:16阅读更多 →
轻量级AI音乐生成模型TinyMU:2.29亿参数媲美大模型的架构与实战

轻量级AI音乐生成模型TinyMU:2.29亿参数媲美大模型的架构与实战

1. 项目概述:当“小”模型遇见“大”音乐最近在AI音乐生成这个圈子里,一个叫TinyMU的模型引起了我的注意。它的核心卖点非常直接:一个仅有2.29亿参数的“小个子”,却声称在音乐生成质量上能媲美那些动辄数十亿、上百亿参数的“庞然…

2026/6/22 1:50:16阅读更多 →
LLM驱动的文本相关性评估:从RAG到可持续性分析的工程实践

LLM驱动的文本相关性评估:从RAG到可持续性分析的工程实践

1. 从“检索”到“分析”:LLM相关性评估的价值跃迁 最近在折腾几个跟大语言模型相关的项目,从简单的RAG(检索增强生成)应用,到更复杂的可持续性报告分析,我反复被一个问题卡住: 如何判断LLM生成…

2026/6/22 1:50:16阅读更多 →
免费Photoshop批量导出插件:20秒完成100个图层的高效工作流

免费Photoshop批量导出插件:20秒完成100个图层的高效工作流

免费Photoshop批量导出插件:20秒完成100个图层的高效工作流 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目地址…

2026/6/22 1:50:16阅读更多 →
社交媒体文本分析实战:NLP与计算语言学在用户洞察中的应用

社交媒体文本分析实战:NLP与计算语言学在用户洞察中的应用

1. 项目概述:当社交媒体遇见语言科学如果你和我一样,每天都会花不少时间刷社交媒体,无论是看朋友圈、刷微博还是逛论坛,你肯定能感受到,这些平台上的文字、表情包和互动,构成了一个庞大、鲜活且瞬息万变的语…

2026/6/22 1:50:16阅读更多 →
超图影响力最大化:粒子群优化算法HDPSO原理与实现

超图影响力最大化:粒子群优化算法HDPSO原理与实现

1. 项目概述:当影响力最大化遇上超图与粒子群在社交网络分析、病毒式营销和舆情监控等领域,有一个经典且极具挑战性的问题:如何从庞大的网络中选择一小部分“种子”节点,使得信息通过网络的传播,最终能够覆盖到尽可能多…

2026/6/22 1:45:16阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/21 0:00:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/22 1:15:34阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/21 0:00:40阅读更多 →
Codex本地AI编码代理与CC Switch协议适配实战

Codex本地AI编码代理与CC Switch协议适配实战

1. Codex不是“另一个VS Code插件”,而是本地AI编码代理的临界点Codex这个名字,现在被太多人误读了。它不是ChatGPT那个早已停更的旧模型代号,也不是某个新出的VS Code扩展图标——它是2024年中后期悄然浮出水面的一类本地化AI编码代理&#…

2026/6/22 0:04:18阅读更多 →
从MSP430到Flexis QE128:8/32位MCU无缝迁移与低功耗设计实战

从MSP430到Flexis QE128:8/32位MCU无缝迁移与低功耗设计实战

1. 项目概述:当8位MCU遇到性能瓶颈,我们如何优雅升级?在嵌入式开发领域,尤其是电池供电的便携式设备、工业传感器节点或智能家居终端中,我们常常面临一个经典的两难选择:是选择功耗极低但性能有限的8位微控…

2026/6/22 0:04:18阅读更多 →
大语言模型空间推理能力提升:TEXT2SPACE数据集与ASCII增强技术解析

大语言模型空间推理能力提升:TEXT2SPACE数据集与ASCII增强技术解析

1. 项目缘起:当大语言模型“看”不懂空间 最近在折腾大语言模型(LLM)的各种应用时,我发现一个挺有意思的现象:你让模型写首诗、写代码、甚至做逻辑推理,它可能都表现得有模有样。但一旦涉及到需要理解“空间…

2026/6/22 0:04:18阅读更多 →