基于ESP32与Pure Data的无线音乐控制器:从硬件到软件的完整实现

news2026/5/18 16:43:26
1. 项目概述与核心思路如果你对用代码做音乐感兴趣或者玩过像Pure Data、Max/MSP这样的可视化音频编程环境那你肯定想过一个问题能不能把物理世界里的动作比如触摸、倾斜、敲击直接变成控制音乐的声音参数这个想法听起来很酷但真要做起来硬件选型、无线通信、数据映射每一步都可能是个坑。我最近就动手做了一个这样的玩意儿一个完全无线、可手持的音乐控制器。它的核心是一块ESP32-S2开发板通过Wi-Fi把触摸屏和加速度计的数据实时发送到电脑上的Pure Data用来控制一个合成器的音序和滤波器。整个项目从硬件焊接、3D打印外壳到CircuitPython编程和Pure Data补丁调试我都走了一遍。今天就把这个从零到一的过程包括我踩过的那些坑和总结出来的实用技巧毫无保留地分享给你。这个控制器的核心价值在于它把复杂的音乐参数控制变成了非常直观的物理交互。你用手指在触摸屏上滑动可以实时编排一个8步的音序你摇晃或倾斜整个设备合成器的滤波器参数会随之动态变化甚至轻轻敲击一下设备侧面就能启动或停止整个音乐段落。这比用鼠标在软件里拖拽滑块要有趣和直观得多。它非常适合现场演出、音乐教学或者就是单纯想给自己做一件酷炫的交互式乐器。下面我会从硬件选型与电路设计开始一步步拆解整个制作过程重点会放在那些原始教程可能一笔带过但实际做起来又至关重要的细节上比如Wi-Fi连接的稳定性处理、传感器数据的滤波与映射、Pure Data与微控制器之间的通信协议以及如何让整个系统响应既灵敏又不会“抽风”。2. 硬件选型、电路设计与组装要点做硬件项目第一步永远是搞清楚你需要什么以及为什么选它。这个项目的硬件清单看起来不复杂但每一件都有其不可替代的理由。2.1 核心控制器为什么是QT Py ESP32-S2主控板我选择了Adafruit的QT Py ESP32-S2。你可能会有疑问ESP32开发板那么多为什么选这个首先无线能力是刚需。ESP32-S2提供了可靠的Wi-Fi支持这是我们实现无线控制的基础。相比蓝牙Wi-Fi的传输距离更远穿透性更好在小型演出场地或者工作室里更稳定。其次QT Py系列板型小巧非常适合嵌入到手持设备中。最后也是最重要的一点它原生支持STEMMA QT/Qwiic接口。这是一种采用4针JST SH连接器的I2C总线标准其最大好处是防反插和即插即用能极大简化传感器扩展的难度让你告别繁琐的杜邦线焊接。注意市面上有些ESP32-S2模块的Wi-Fi驱动在CircuitPython下可能不太稳定。Adafruit的QT Py ESP32-S2经过了他们的充分测试其CircuitPython固件对Wi-Fi的支持非常完善省去了自己折腾底层驱动的麻烦这是选择它的一个隐性优势。2.2 传感器搭档触摸与姿态感知触摸输入采用了“电阻触摸屏 TSC2007控制器”的方案。这里有个关键点我们用的是一块3.7英寸的4线电阻屏而不是更常见的电容屏。电阻屏虽然精度和手感不如电容屏但它有两个巨大优势一是价格低廉二是可以用任何物体包括手套、笔触发这在音乐表演中非常实用。TSC2007是一个专用的电阻触摸屏控制器芯片它通过I2C接口与主控通信将模拟的触摸点坐标转换成数字信号大大减轻了主控MCU的模拟读取和计算负担。姿态感知交给了ADXL343三轴加速度计。选择它而不是更便宜的型号如MPU6050主要是看中其极低的功耗和内置的敲击检测功能。ADXL343可以通过配置寄存器非常精准地识别出单次或双次敲击事件我们用它来作为合成器的启动/停止开关既自然又可靠。它同样通过I2C接口通信。2.3 供电与结构让设备真正“可手持”为了实现真正的无线和便携供电部分必须独立。我搭配了Adafruit专为QT Py设计的LiPo充电器BFFBack-Forward-Front扩展板。这块小板子直接插在QT Py下方提供了一个锂电池接口、一个充电管理芯片和一个电源开关。这样整个设备就可以用一块常见的3.7V 400mAh锂电池供电续航时间根据使用强度可以达到数小时。结构方面一个设计良好的外壳至关重要。我提供的3D模型文件包含四个部分上盖、主体、下盖和手柄。设计时考虑了以下几点模块化固定下盖内部有专门为QT Py、ADXL343和TSC2007设计的卡槽和螺丝柱位确保电路板在摇晃中不会松动。走线空间上盖预留了触摸屏排线的出口内部也为电池和STEMMA QT连接线留出了充足空间避免挤压。人体工学手柄的设计让握持更舒适同时也将敲击检测加速度计的敏感轴对准了侧面方便通过敲击手柄来触发命令。2.4 电路连接实战与避坑指南所有传感器都通过STEMMA QT电缆连接理论上是“傻瓜式”操作但实践中仍有几个细节需要注意连接顺序建议遵循“电源链”思想。即锂电池接入BFF板 - BFF板为QT Py供电 - QT Py的STEMMA接口为第一个传感器如ADXL343提供3.3V和GND - 第一个传感器的另一个STEMMA接口串联到第二个传感器TSC2007。这样就形成了一个干净的菊花链避免了星型连接可能引入的噪声。焊接提示在将排针焊接到LiPo BFF和QT Py上时务必先将排针插入面包板或另一个连接器中再进行焊接这样可以保证所有针脚绝对平行且高度一致方便后续插接。焊接QT Py到BFF的排母时烙铁温度不要过高建议350°C左右快速焊接防止过热损坏USB-C端口附近的元件。组装步骤先将所有M2.5螺柱固定到下盖的对应位置。将QT Py ESP32-S2插入下盖的卡槽USB口朝外。用M2.5螺丝将ADXL343和TSC2007分别固定到它们对应的螺柱上。注意螺丝不要拧得过紧以免压碎传感器或导致PCB变形。使用50mm长的STEMMA QT电缆按照QT Py - ADXL343 - TSC2007的顺序连接好I2C总线。将触摸屏背面贴上泡棉胶或使用螺丝固定到上盖并小心地将排线穿过上盖的开口插入TSC2007的插座。排线插入时要注意金色触点一面朝向正确的方向通常是有标记的一面朝上轻轻锁紧插座上的卡扣。将电池连接到BFF板并用高温胶带如聚酰亚胺胶带将电池妥善固定在下盖的空余位置防止其移动导致连线脱落。最后将上盖、主体、下盖扣合并用手柄和螺丝将主体与手柄固定。完成这些一个结实、专业的硬件平台就准备好了。接下来我们要让它“活”起来。3. 软件环境搭建与核心代码解析硬件是躯体软件才是灵魂。这个项目的软件部分分为两端设备端的CircuitPython固件和电脑端的Pure Data补丁。3.1 CircuitPython 固件刷写与配置首先你需要将QT Py ESP32-S2刷写成CircuitPython设备。访问circuitpython.org找到对应QT Py ESP32-S2的.uf2文件并下载。刷写关键步骤用数据线连接板子和电脑。快速按两次复位按钮RST进入UF2引导加载模式。此时电脑上会出现一个名为QTPYS2BOOT的磁盘。将下载好的.uf2文件拖入该磁盘。完成后磁盘会消失并出现一个新的名为CIRCUITPY的磁盘。这表明刷写成功。常见问题如果双击复位后没有出现QTPYS2BOOT磁盘请检查USB线是否支持数据传输很多手机充电线只供电或尝试换一个USB端口。如果仍不成功可能需要按照Adafruit的指南重新安装UF2引导程序。项目文件部署将下载的项目包解压你会看到code.py和一个lib文件夹。将它们全部复制到CIRCUITPY磁盘的根目录。lib文件夹里包含了adafruit_tsc2007和adafruit_adxl34x等必要的驱动库CircuitPython会在启动时自动加载它们。核心配置文件settings.toml这是整个项目的“钥匙”。你需要在CIRCUITPY磁盘根目录下新建一个文本文件命名为settings.toml注意全小写扩展名正确并写入以下内容CIRCUITPY_WIFI_SSID 你的Wi-Fi网络名称 CIRCUITPY_WIFI_PASSWORD 你的Wi-Fi密码 CIRCUITPY_WEB_API_PASSWORD 可选的网页API密码本项目不需要可留空 CIRCUITPY_WEB_API_PORT 80 host 你电脑的IP地址Wi-Fi信息确保你的2.4GHz Wi-Fi网络名称和密码正确。ESP32-S2不支持5GHz频段。电脑IP地址这是本项目通信的关键。你需要找到你电脑在当前Wi-Fi网络中的本地局域网IP地址通常是192.168.x.x或10.x.x.x。Windows在命令提示符中输入ipconfig查找“无线局域网适配器 WLAN”下的“IPv4 地址”。Mac/Linux在终端中输入ifconfig | grep inet 找到对应Wi-Fi接口的地址。重要请确保你的电脑和ESP32连接到了同一个局域网并且电脑的防火墙允许12345端口的传入连接后续会讲。3.2 核心代码深度剖析让我们深入看看code.py是如何工作的。理解这段代码你就能举一反三修改它来实现自己的控制逻辑。初始化与连接 代码开头导入必要的库并从settings.toml读取配置。接着初始化I2C总线、触摸屏和加速度计。这里加速度计特别开启了敲击检测功能enable_tap_detection()。# I2C初始化 i2c board.STEMMA_I2C() # 使用板载的STEMMA QT I2C端口 tsc adafruit_tsc2007.TSC2007(i2c) accelerometer adafruit_adxl34x.ADXL343(i2c) accelerometer.enable_tap_detection(tap_count1, threshold20, duration15, latency80, window200) # 参数可调整实操心得enable_tap_detection的参数需要根据你的外壳厚度和敲击力度微调。threshold是灵敏度值越小越敏感duration是敲击最小持续时间单位毫秒。我建议在代码里多打印accelerometer.events[tap]的值通过实际敲击来找到最可靠的参数。Wi-Fi与Socket连接 这是无线通信的核心。代码使用socketpool库创建了一个TCP客户端套接字连接到电脑host的12345端口。wifi.radio.connect(ssid, password) pool socketpool.SocketPool(wifi.radio) s pool.socket(pool.AF_INET, pool.SOCK_STREAM) s.connect((HOST, PORT))避坑指南网络连接可能不稳定。在实际使用中我强烈建议在连接代码外增加一个while重试循环并加入异常捕获。例如如果连接失败等待几秒后重试并在串口输出提示信息这样比程序直接崩溃要好得多。主循环逻辑 主循环 (while True) 持续做以下几件事敲击检测检查加速度计的敲击事件。这是一个状态触发器用于切换合成器的播放run状态。这里用了last_tap变量进行消抖防止一次敲击被误判为多次。触摸屏读取如果屏幕被触摸读取其X和Y坐标原始值范围0-4095。然后使用simpleio.map_range函数将其映射到0-8的范围。为什么是0-8因为我们在Pure Data中设计了一个8步的音序器Sequencer这个映射直接将触摸位置对应到了音序的步进索引。加速度计读取读取X和Y轴的加速度值单位通常是m/s²并将其映射到滤波器所需的频率范围例如X轴映射到450-1200HzY轴映射到250-750Hz。这个映射范围需要根据你Pure Data中滤波器的设计来调整。变化检测比较当前读取的传感器值是否与上一次的值相同。只有当一个或多个值发生变化时才准备发送新数据。这极大地减少了不必要的数据传输降低了Wi-Fi负载和Pure Data的处理压力是保证实时性的关键优化。数据打包与发送如果检测到变化将新的触摸坐标x_map,y_map、加速度值acc_x,acc_y以及根据Y坐标从音符数组中选出的MIDI音符打包成一个字符串消息。最关键的一点每条消息必须以分号;结尾。这是Pure Data使用的FUDI网络协议规定的消息终止符少了它Pure Data就无法正确解析。# 消息格式示例 “x 3; y 5; aX 876; aY 420; n 60;” size s.send(str.encode( .join([x, str(x_map), ;, y, str(y_map), ;, aX, str(acc_x), ;, aY, str(acc_y), ;, n, str(note), ;])))3.3 Pure Data 补丁工作原理电脑端的Pure Data补丁.pd文件负责接收数据并生成声音。它就像一个虚拟的合成器被物理控制器远程遥控。数据接收与解析 补丁使用netreceive对象在12345端口监听。收到的数据被送入route对象根据我们定义的前缀x,y,aX,aY,run,n将消息分流到不同的处理通道。route是Pure Data中用于消息路由的核心对象非常高效。音序器Sequencer 这是项目的“大脑”之一。我们使用了一个tabread~对象来读取一个名为seq的数组table。ESP32发来的x值控制音序器的播放速度时钟y值和n值共同决定在音序的哪个位置步进写入哪个音符MIDI编号。tabwrite对象负责将音符写入数组。一个简单的计数器 1和% 8构成了8步循环驱动tabread~依次读取数组中的音符。合成器与滤波器 收到音符后通过mtofMIDI转频率对象将其转换为频率驱动一个phasor~锯齿波振荡器产生基础波形。这个波形会经过一系列滤波处理其中最关键的是一个vcf~电压控制滤波器对象。它的截止频率cutoff frequency由ESP32发来的aX和aY值控制。当你倾斜控制器时加速度数据的变化会实时改变滤波器的频率从而产生那种经典的“哇音”或扫频效果。启动/停止控制run消息控制一个spigot水龙头对象。当run为1时spigot打开允许时钟信号驱动音序器当run为0时spigot关闭同时向所有音频参数发送0使合成器静音。4. 系统集成、调试与性能优化当硬件组装完毕代码也部署好后真正的挑战——系统集成与调试——就开始了。这一步往往能区分“做出来”和“好用”。4.1 首次连接与通信测试启动顺序建议先打开Pure Data并加载pureDataWithESP32.pd补丁然后再给控制器上电。这样Pure Data的netreceive对象能先进入监听状态。观察串口输出通过串口监视器如Mu编辑器、Thonny或screen/putty连接QT Py ESP32-S2。你应该能看到它尝试连接Wi-Fi成功后打印“Connected to SSID!”然后尝试连接电脑IP。如果卡在连接Wi-Fi一步检查settings.toml如果卡在连接Socket检查电脑IP是否正确以及电脑防火墙是否屏蔽了12345端口。防火墙设置关键这是最常见的连接失败原因。你需要在电脑的防火墙设置中为Pure Data或你使用的终端如Terminal添加入站规则允许TCP端口12345的通信。Windows进入“Windows Defender 防火墙”-“高级设置”-“入站规则”-“新建规则”选择“端口”指定TCP 12345允许连接。Mac在“系统设置”-“网络”-“防火墙”-“选项”中为Pure Data添加允许传入连接。验证数据流在Pure Data补丁中你可以添加print对象连接到route的各个输出这样每当收到x,y等消息时Pure Data的主窗口就会打印出来。这是最直接的调试方式。4.2 传感器校准与数据映射优化原始传感器数据往往不能直接使用需要经过校准和映射。触摸屏校准电阻屏可能存在非线性或边缘误差。我们的代码使用了简单的线性映射0-4095到0-8。如果发现触摸位置不准确可以尝试更精确的映射。一个更健壮的方法是在代码中记录触摸屏四个角的原始坐标值然后使用simpleio.map_range时输入范围使用实际测出的最小值和最大值而不是理论的0和4095。加速度计数据滤波加速度计读数非常敏感即使静止时也会有微小抖动。直接发送原始数据会导致滤波器参数疯狂跳动产生难听的噪音。我们的代码通过“变化检测”只发送有显著变化的值这本身就是一种软件滤波。你还可以考虑加入低通滤波或移动平均来平滑数据。例如在读取加速度值后# 简单的移动平均滤波示例 accel_readings_x.append(accelerometer.acceleration[0]) if len(accel_readings_x) 5: # 保持最近5个读数 accel_readings_x.pop(0) smoothed_acc_x sum(accel_readings_x) / len(accel_readings_x) # 然后对 smoothed_acc_x 进行映射映射范围调整代码中将加速度X轴映射到450-1200HzY轴映射到250-750Hz。这个范围是针对特定滤波器设计的。你可以根据你想要的声音效果来调整。例如想要更夸张的滤波效果可以扩大映射范围如100-2000Hz想要更精细的控制可以缩小范围。4.3 提升系统响应与稳定性Wi-Fi延迟优化无线通信必然有延迟。为了最小化影响确保ESP32和电脑距离路由器不要太远信号良好。在代码中可以适当增加主循环的延迟如time.sleep(0.01)但这会降低响应速度。更好的方法是优化Pure Data补丁让它能处理一定程度的数据包突发。可以在Pure Data端使用pipe对象来缓冲和稳定数据流。考虑使用UDP协议代替TCP。UDP更快、开销更小但不保证数据包顺序和到达。对于实时音频控制丢失个别数据包通常是可以接受的。在CircuitPython中创建UDP socket只需将pool.SOCK_STREAM改为pool.SOCK_DGRAM并使用sendto方法。电源管理使用电池供电时功耗是关键。ESP32-S2在Wi-Fi活跃时功耗较高。如果续航不足可以考虑在代码中当检测到长时间无触摸/无动作时让ESP32进入轻度睡眠模式Light Sleep由加速度计的敲击中断唤醒。这需要更复杂的编程和硬件连接连接加速度计的中断引脚到ESP32的唤醒引脚。降低Wi-Fi发射功率wifi.radio.tx_power在信号好的地方可以适当调低。定期检查电池电压并在电压过低时通过NeoPixel LED或发送特定消息到Pure Data发出警告。4.4 功能扩展与创意改造这个项目是一个完美的起点你可以从多个维度扩展它增加更多传感器STEMMA QT生态系统有大量传感器如陀螺仪、光传感器、距离传感器、滑块电位器。你可以轻松地将它们串联起来用更多维度控制声音。例如用光传感器控制音量用滑块控制失真度。修改Pure Data合成器Pure Data的强大之处在于其无限的模块化可能。你可以将接收到的数据映射到任何你想要的参数上振荡器波形、音高、和声、延迟反馈、混响大小等等。尝试用aX和aY控制一个biquad~滤波器的Q值共振会产生非常有趣的效果。改变通信协议除了原始的Socket你还可以让ESP32发送标准的MIDI信息通过Wi-Fi MIDI或串口MIDI桥接这样它就能控制任何支持MIDI的软件或硬件合成器如Ableton Live、Logic Pro或硬件音源适用性大大增强。改进用户界面可以考虑为触摸屏增加一个简单的GUI用Adafruit_DisplayIO库显示当前的音符、滤波器状态或电池电量让控制器更具交互性。5. 常见问题排查与解决实录在实际制作和调试过程中我遇到了不少问题。这里把它们整理成表希望能帮你快速定位和解决。问题现象可能原因排查步骤与解决方案ESP32无法连接Wi-Fi1.settings.toml文件格式错误或未保存。2. Wi-Fi密码错误。3. 网络是5GHz频段。4. 板载天线接触不良某些型号。1. 检查settings.toml文件名、路径、等号两边空格、引号是否全为英文符号。2. 确认密码尝试连接手机热点排除路由器问题。3. 确保连接2.4GHz网络。4. 检查串口输出具体错误信息。Pure Data收不到数据1. 电脑IP地址错误或变更。2. 电脑防火墙阻止了12345端口。3. ESP32与电脑不在同一局域网。4. Pure Data补丁未打开或netreceive对象端口设置错误。1. 重新获取电脑IP并更新settings.toml。2.重点检查在电脑防火墙中为12345端口添加入站规则。3. 确保两者连接到同一个路由器/网络。4. 检查Pure Data补丁中netreceive对象是否为12345。在补丁中添加print对象调试。触摸屏无反应或坐标不准1. STEMMA QT线缆接触不良。2. 触摸屏排线未插紧或损坏。3. 电阻屏需要校准。4. 代码中I2C地址错误TSC2007通常为0x48。1. 重新插拔所有连接线。2. 检查排线重新锁紧TSC2007插座卡扣。3. 在代码中添加打印语句输出tsc.touch的原始x,y值观察其范围是否在0-4095内。尝试校准映射范围。4. 使用I2C扫描程序确认设备地址。敲击检测不灵敏或误触发1. ADXL343敲击检测参数不合适。2. 外壳过厚或安装不牢削弱了震动。3. 电池或线缆在壳内晃动产生干扰。1. 调整enable_tap_detection()中的threshold增大值降低灵敏度、duration等参数并通过串口打印accelerometer.events[“tap”]观察。2. 确保加速度计用螺丝牢固固定在外壳内壁。3. 用胶带固定好内部所有可移动部件。音频输出有爆音或卡顿1. Wi-Fi网络拥堵或信号差导致数据延迟/丢失。2. Pure Data音频设置缓冲区太小。3. 传感器数据发送过于频繁Pure Data处理不过来。1. 拉近设备与路由器距离或更换更畅通的Wi-Fi信道。2. 在Pure Data的“媒体”菜单中增加“音频延迟”Audio Delay大小。3. 确保ESP32代码中只有传感器值变化时才发送数据已实现。可在Pure Data端对接收的数据做平滑处理。设备运行一段时间后断开连接1. 电池电量不足。2. Wi-Fi路由器设置了连接超时或设备隔离。3. ESP32代码陷入错误或内存泄漏。1. 检查电池电压充电或更换电池。2. 在路由器设置中检查是否有“AP隔离”或“客户端隔离”功能被开启将其关闭。3. 在代码的关键部分添加try-except异常捕获并将错误打印到串口以便诊断。定期用gc.collect()进行垃圾回收。合成器声音不对或无声1. Pure Data音频输出设备未正确选择。2. Pure Data补丁内的音频路径有误或对象参数错误。3. ESP32发送的音符数据超出合理范围。1. 在Pure Data的“媒体”-“音频设置”中选择正确的输入输出设备如内置扬声器或外接声卡。2. 检查补丁中dac~或output~对象是否连接音量控制是否打开。逐一检查route分发的数据是否到达了合成器模块。3. 确保ESP32代码中notes数组的MIDI值在合理范围如0-127且映射后的y_map作为索引不会越界0-7。这个项目最让我享受的就是把抽象的代码和冰冷的硬件变成一种可以握在手里、能即时产生反馈的创意工具。当第一次通过倾斜控制器让滤波器发出“嗖嗖”的扫频声时那种感觉是单纯用鼠标拖拽参数无法比拟的。它不只是一个控制器更像是一个乐器的延伸。如果你也完成了制作不妨试着修改notes数组里的音符换成属于你自己的和弦进行或者彻底改造Pure Data里的合成器架构比如把锯齿波换成方波再加一个环形调制器。硬件平台已经搭好剩下的声音世界由你定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2622225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…