开源小车巡线实战:STM32与OpenMV实现PID智能循迹 这次我们直接进入主题开源小车巡线实录。网上开源小车项目非常多STM32、ESP32、Arduino、树莓派、OpenMV、Jetson 方案满天飞但真正适合入门到进阶、能跑通巡线、比赛和毕设复用度又高的组合还是集中在“主控 电机驱动 传感器 算法”这条基础链路上。巡线这件事听上去不复杂实际调起来却会碰到传感器阈值漂移、PID 参数震荡、舵机响应慢、视觉帧率不足、赛道反光干扰等一堆问题。这篇文章会以 STM32F103ZET6 主控配合灰度传感器、OpenMV 视觉模块两条巡线路线为主把选型、硬件接线、算法结构、调参流程、效果验证和常见坑位全部过一遍。无论你是准备竞赛、做课程设计还是单纯想把开源小车项目跑起来这篇都能给你一份可以直接落地的参考。先说核心能力开源小车巡线项目能做到什么、硬件门槛在哪、启动和迭代快不快先看下面的能力速览。1. 开源小车巡线核心能力速览能力项说明项目类型开源智能小车 / 嵌入式机器人巡线方案主控平台STM32F103ZET6Cortex-M372MHz可换成 STM32F407、Arduino、ESP32巡线方式红外灰度传感器巡线 / OpenMV 视觉巡线驱动方案TB6612、L298N、L9110S 电机驱动模块两轮差速电机类型直流减速电机 编码器可选闭环 PID 调速供电方式7.4V 18650 锂电池 / 2S 锂电池降压到 5V 供单片机核心算法位置误差计算、PID 转向、电机速度控制、视觉阈值分割开发工具Keil MDK / STM32CubeMX HAL 库、OpenMV IDE调试接口USART 串口打印、OLED 显示、蓝牙/Wi-Fi 可选是否支持批量任务支持离线批量采样灰度值记录可通过串口二次处理适合场景竞赛循迹、课程设计、ROS 小车入门、AGV 物流车原型、开源毕设从项目定位来看这套小车不是单靠一个板子就能跑的而是一个完整的嵌入式系统传感器负责感知主控负责决策驱动电路负责执行算法负责把“车应该往哪边转”翻译成“电机应该转多快”。尤其是多传感器灰度阵列和 OpenMV 视觉巡线两种路线前者适合低成本、低延迟、光照稳定的赛道后者适合复杂赛道、大弯道、交叉路口和有颜色标识的场景。2. 开源小车巡线的适用场景与使用边界这类开源巡线小车最适合四类人。第一类是准备智能车竞赛、电子设计竞赛和工程训练赛的学生。竞赛循迹小车地图设计里经常出现连续 S 弯、十字路口、斑马线、坡道和停车标志这些都需要巡线算法具备快速响应的能力开源方案可以让你从零开始理解误差计算和转向控制然后按比赛规则改代码。第二类是本科课程设计或毕设项目。STM32F103ZET6 智能小车属于经典选题覆盖面广、资料多、成本可控适合做完整的系统设计硬件组装、模块接线、软件调试、实物演示和论文撰写整个链路都能覆盖。第三类是想要接触 ROS、自主导航和多传感器融合的初学者。两轮差速 STM32 控制本身就是 ROS 小车自主导航仿真里的底层驱动模型先把巡线跑通后面接激光雷达、SLAM、路径规划会容易很多。第四类是开源项目维护者和极客玩家。很多开源小车项目在 Gitee、GitHub 上维护了完整的原理图、PCB、源码和使用文档适合二次开发。但也要说清楚边界。巡线小车解决的是“沿已知路径行进”的问题它不会主动建模环境只认线。如果赛道反光严重、光照剧烈变化或者线和背景颜色接近灰度传感器和普通摄像头方案的稳定性都会下降。另外开源小车项目很多依赖特定版本的依赖库、驱动程序和串口工具不同 IDE 和固件库版本可能导致编译报错调试时要有心理准备。下面这种场景就不太适合纯巡线方案野外导航、避障为主的复杂环境、需要高精度定位的任务。如果你要的是自主规划和无轨移动那就要转向激光 SLAM、视觉 SLAM 或 RTK 定位而不是巡线。还有一个关键点是版权和安全边界。开源小车项目的源码和硬件设计通常采用 GPL、MIT 或 CC BY-SA 协议使用时要注意授权范围。如果小车搭载摄像头做视觉巡线不要采集无关人员的人脸、车牌等敏感信息涉及竞赛赛道设计图和他人开源代码时也要遵守原作者的授权条款。调试电机、锂电池和驱动板时注意防止短路、电机堵转发热和电池过放安全永远是第一位的。3. 开源小车巡线的硬件与环境准备3.1 硬件清单一套完整的开源巡线小车通常由下面几个部分构成。模块推荐型号作用主控板STM32F103ZET6 最小系统板读取传感器、运行巡线算法、输出 PWM电机驱动TB6612FNG 模块双路 H 桥驱动两个直流电机直流电机带编码器直流减速电机1:30 或 1:56提供动力和速度反馈巡线传感器TCRT5000 红外传感器 / 8 路灰度传感器检测黑线或白线与背景的反射差异视觉模块OpenMV Cam H7 Plus图像采集、色块识别、串口发送偏差供电系统18650×2 电池盒 / 2S 锂电池给电机和单片机供电降压模块LM2596S / AMS1117-5.0将电池电压降到单片机可用电压底盘亚克力板或 3D 打印底盘固定电机、电池和板子调试工具USB-TTL 串口模块、OLED 屏、逻辑分析仪查看调试信息和波形STM32F103ZET6 的引脚资源很足112 个引脚里可用的 GPIO、定时器、USART 和 ADC 很多。巡线小车不需要外部扩展内存但需要一个定时器产生 PWM 信号控制电机一个定时器读取编码器脉冲一组 GPIO 读取灰度传感器阵列至少一个 USART 用来和 OpenMV 或蓝牙模块通信。3.2 软件环境软件部分需要准备五样东西操作系统Windows 10/11 或 Ubuntu 20.04/22.04 都可以。开发环境Keil MDK 或者 STM32CubeIDE配合 STM32CubeMX 生成初始化代码。固件库STM32CubeF1 HAL 库版本建议用 1.8.x 以上。OpenMV IDE用于烧录 OpenMV 视觉巡线代码。串口工具XCOM、MobaXterm 或 VS Code Serial Monitor用于看日志和调参。STM32CubeMX 配置时要特别关注这几项RCC 选择外部晶振SYS 的 Debug 选 Serial Wire 方便下载USART1 或 USART3 用于日志和通信PA6、PA7 和 PB0、PB1 配置为定时器 PWM 输出PB3-PB10 配置为 GPIO 输入接灰度传感器编码器接口接到 TIM2 和 TIM3 的 CH1/CH2。如果端口不够可以改用移位寄存器扩展 IO或者直接用 74HC4051 模拟开关轮流采样多路灰度传感器。4. 两大巡线技术路线灰度传感器与 OpenMV 视觉巡线巡线方案的选择直接影响代码复杂度和赛道适应能力。很多人一上来就纠结“到底用灰度还是用摄像头”实际上两套方案的定位完全不同。4.1 灰度传感器巡线灰度传感器巡线的原理很简单TCRT5000 传感器内部有一个红外发射管和一个接收管红外光被不同颜色的表面反射后接收管检测到的光强会发生变化。白线反射率高黑线反射率低通过 ADC 采样或者数字阈值判断就能确定传感器下方是黑线还是白色背景。多路灰度传感器比单路红外对管更强的原因是单路只能判断“线上/不在线上”无法判断“偏左多少”而 8 路灰度传感器可以输出一个位置偏差值。比如一组 8 路传感器以 0 号到 7 号排列检测到黑线的传感器编号加权平均后就能得到一条连续的位置曲线。这个位置偏差传入 PID 控制器控制器输出转向量两个轮子按不同的速度转动小车就沿黑线走了。这种方案的优势是延迟极低。传感器采样一次只需要微秒到毫秒级不需要图像处理STM32 主频 72MHz 就能跑得非常流畅即使在全速运行下也有很高的控制频率。缺点是容易受环境光干扰对赛道黑白的对比度要求高而且传感器与地面的距离必须保持稳定一般控制在 1cm 到 2cm 之间。如果赛道上有阴影覆盖或者灯光频闪阈值就需要动态调整。4.2 OpenMV 视觉巡线OpenMV 视觉巡线是另一种思路。OpenMV 摄像头把图像传入处理器通过阈值二值化分离线和背景再计算线的质心或偏差通过串口把偏差值发给 STM32。整个过程可以理解为“摄像头做人眼的感知单片机做大脑的决策”。视觉巡线最大的优势是能处理更复杂的路况可以识别十字路口、斑马线、变道线和不同颜色的引导线还能通过色块识别判断岔路方向。摄像头看到的是整幅画面而灰度传感器只看到一条线上的几个点这两种信息量是完全不对等的。缺点也很明显帧率有限普通 OpenMV 分辨率下大概在 30fps 到 60fps 之间如果同时做多个色块识别或图像预处理帧率可能进一步下降。而且 OpenMV 计算出的偏差需要通过 UART 串口传给 STM32在高速驾驶、急转弯时通信延迟可能导致转向滞后。所以实际工程里很多人会把灰度传感器做高速巡线的主力OpenMV 只在路口、停车标志等复杂场景里介入做低速决策。5. 巡线算法核心从传感器偏差到 PID 转向控制巡线代码的核心不复杂但调参过程却能把人磨到怀疑人生。把逻辑拆开其实就是三步读传感器、计算偏差、更新电机速度。5.1 灰度传感器位置偏差计算假设你用的是 8 路灰度传感器阵列第一路到第八路的 GPIO 输入分别为sensor[0]到sensor[7]。当某一路检测到黑线时当前值为 0低电平否则为 1高电平。位置误差的计算方法一般有三种。最常用的加权平均法int get_line_position(void) { int weight_sum 0; int sensor_sum 0; for (int i 0; i 8; i) { int value HAL_GPIO_ReadPin(SENSOR_PORT, sensor_pin[i]); if (value ACTIVE_LEVEL) // 检测到黑线 { weight_sum (i - 3) * 100; // 中间位置为 0 sensor_sum 1; } } if (sensor_sum 0) { return 500; // 丢线返回一个特殊值让小车停止或搜索 } return weight_sum / sensor_sum; }i - 3是为了让传感器阵列的中心对应误差零点。比如第三路和第四路在阵列中间索引分别为 3 和 4减 3 后误差范围就是 -300 到 400乘 100 是扩大误差分辨率。如果所有传感器都丢线了不能直接返回 0否则小车会笔直往前冲出赛道。常见的处理方式是返回一个超大值让控制器进入搜索状态小车慢慢旋转尝试重新找到黑线。5.2 位置式 PID 控制器得到误差后就可以用 PID 控制转向量。巡线小车最常用的是 PD 控制因为纯比例控制容易振荡加上微分项可以提前抑制超调而积分项在实际巡线中容易引起累计饱和除非你处理得很好否则建议先不用。typedef struct { float kp; float ki; float kd; float integral; float last_error; } PidController; float pid_update(PidController *pid, float error, float dt) { float output 0.0f; pid-integral error * dt; float derivative (error - pid-last_error) / dt; pid-last_error error; output pid-kp * error pid-ki * pid-integral pid-kd * derivative; if (output 100.0f) { output 100.0f; pid-integral - error * dt; } if (output -100.0f) { output -100.0f; pid-integral - error * dt; } return output; }主循环里把 PID 输出映射为左右轮速度int base_speed 40; // 基础速度 0-100 int turn pid_output; // PID 输出范围 -100 到 100 left_speed base_speed turn; right_speed base_speed - turn; set_motor_speed(LEFT_MOTOR, left_speed); set_motor_speed(RIGHT_MOTOR, right_speed);这里最重要的一句话是kp决定转向的激进程度kd决定转向的阻尼程度。kp太小小车过弯时响应慢直接从弯道冲出去kp太大小车在直道上也会左右摇摆发烫的电机和刺耳的电机声会告诉你参数选错了。kd的作用则是让转向量变化更平滑但kd太大也会放大噪声让小车在直道上高频抖动。5.3 OpenMV 视觉巡线代码OpenMV 端负责把画面中的目标线找出来然后发送一个偏差值到 STM32。下面这套是 OpenMV 视觉巡线的基础流程。import sensor import image import time import json from pyb import UART sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QQVGA) sensor.skip_frames(time2000) sensor.set_auto_gain(False) sensor.set_auto_whitebal(False) uart UART(3, 115200, timeout_char1000) # 这个阈值需要根据实际赛道颜色调整格式为 (L Min, L Max, A Min, A Max, B Min, B Max) # 这里以深色线、浅色背景为例 thresholds [(0, 40, -20, 20, -20, 20)] while True: img sensor.snapshot() blobs img.find_blobs(thresholds, pixels_threshold60, area_threshold60, mergeTrue) error 0 if blobs: largest_blob max(blobs, keylambda b: b.area()) img.draw_rectangle(largest_blob.rect()) img.draw_cross(largest_blob.cx(), largest_blob.cy()) # 偏差图像中心线(80)与色块中心之差归一化到 -100 ~ 100 error int((largest_blob.cx() - 80) * 1.25) output_str json.dumps({err: error}) uart.write(output_str \n) time.sleep_ms(10)STM32 端通过串口中断接收 JSON 数据解析出err字段后直接交给 PID 控制器。不熟悉 JSON 解析的话也可以在 OpenMV 端只发一个整数uart.write(bytearray([error 0xFF])) # 或者直接发文本格式 -45\n串口通信调试时要注意两点。第一是波特率要一致OpenMV 的 UART 和 STM32 的 USART 必须配置成同一个值比如 115200。第二是数据格式要一致如果 OpenMV 发的是文本字符串STM32 端要用printf类似的解析方式不能直接用整型接收。实际调通之后最快的验证方式是拿两根杜邦线把 OpenMV 的 TX 接 STM32 的 RX打开串口助手看数据是否稳定更新。6. 巡线实测与效果验证这一节我们把“巡线实录”做实。无论代码写得再漂亮车不上赛道跑一切都没有意义。下面给出一套系统化的验证流程。6.1 第一步传感器阈值标定灰度传感器安装到车底之后先不要写 PID 控制直接读取传感器原始值。// 串口打印每路灰度传感器的 ADC 原始值 for (int i 0; i 8; i) { uint16_t adc_val read_sensor_adc(i); printf(sensor[%d] %d\r\n, i, adc_val); }把小车分别放在黑线上和白色背景上记录两次数值。正常情况下黑线对应的 ADC 值明显低于白底。如果你的传感器是数字量输出那就直接在代码里定义一个阈值比如 2000。如果黑线和白底的 ADC 值差距小于 300说明传感器距离地面的高度不对或者选用的线材反光率不够需要重新调整传感器支架。注意这里的数值是一个参考示例不同传感器、不同高度的 ADC 值差别很大。你要做的是在自己的设备上完成标定而不是把别人的阈值直接抄进去。6.2 第二步开环电机测试在接入巡线算法之前先确认电机和驱动正常工作。写一个最简单的开环代码让左轮以 30% 占空比正转右轮以 30% 占空比正转观察小车是否直线前进。如果小车往一侧偏说明两边电机的机械损耗或转速不同这是直流减速电机的正常离散性后面要用编码器闭环调速来补偿。6.3 第三步差分转向测试在代码里临时把转向量设成固定值比如左轮 20、右轮 60观察小车是不是原地向右转。如果运动方向不对大概率是电机接线错位或 PWM 极性反了交换两路 PWM 输出即可。6.4 第四步PID 参数分步整定PID 调参不要一次把kp、ki、kd全放上去容易爆炸。推荐的顺序是先把kd设为 0ki设为 0只调kp。初始kp取得小一点比如 0.3让小车低速在直道上跑。慢慢增大kp直到小车过弯时能明显偏向弯道内侧然后再回调一点。加入kd初始设为kp * 10左右观察直道是否稳定。如果小车在直道上蛇形摆动降低kd如果过弯依然不足增大kp。验证 PID 是否调好的核心指标有三个小车在直道上是否平稳、进入弯道后转向是否及时、出弯后是否会大幅超调。判断标准也很直观能让小车以 40% 到 60% 的基础速度稳定跑完整个赛道这是及格线。如果只是低速勉强巡线上了速度就翻车说明参数还没有调到位。6.5 第五步疲劳测试和极端场景跑通基本赛道后换上更难的场景来验证减小线宽模拟断线和细赛道。在环境光线不同的时段重新测试观察阈值是否漂移。在赛道上放一个十字路口观察小车会直行还是会误判。提高基础速度寻找速度上限。连续跑十圈以上检查电机驱动是否过热、电池电压是否稳定、传感器前端是否积累灰尘。效果验证不是为了完成一次炫技而是找出系统的稳定性边界。很多小车巡线能跑但只能跑一圈第二圈开始漂移这就是阈值和 PID 参数没有覆盖全场景。7. 资源占用与性能观察单片机项目没有显存这个概念但资源占用依然值得关注主要看四个方面。7.1 实时性与巡线周期STM32F103ZET6 的 CPU 主频是 72MHz跑普通的灰度巡线代码一次完整的“采集传感器 PID 计算 PWM 更新”循环通常在 1ms 以内。如果你用 8 路灰度传感器主循环频率可以做到 1kHz 以上。这意味着小车每跑 1 米假设速度是 1m/s控制器会做大约 1000 次决策这个控制频率已经足够覆盖多数竞赛场景。如果接入了 OpenMV系统的控制周期会受通信帧率的限制。OpenMV 的 QQVGA 分辨率下发送一次偏差数据的周期约为 16ms 到 33ms对应 30fps 到 60fps。这个延迟意味着如果小车以 1m/s 的速度行驶每 16ms 会前进 16mm对巡线来说是一个可接受的误差范围但在急弯处仍然需要适当降速。7.2 Flash 与 RAM 占用STM32F103ZET6 拥有 512KB Flash 和 64KB SRAM。一个完整的巡线工程包含 HAL 库、PID 控制、传感器采样、串口日志和简单状态机编译后 Flash 大约占 20KB 到 40KBRAM 占 4KB 到 8KB。如果引入 RTOS 和编码器闭环控制资源占用会上升但依旧不紧张。真正占用资源的大头是图像处理——但图像处理在 OpenMV 模块里完成STM32 只负责接收偏差值所以不占额外内存。7.3 如何降低 CPU 和内存负载如果你的代码里同时包含大量浮点运算、串口打印、OLED 刷新CPU 占用会明显上升。降低负载的方法有三种。第一PID 计算里的浮点数可以改成定点数或者整数运算。比如误差范围是 -400 到 400kp * error可以直接用整数乘除法完成不需要浮点。第二串口日志不要每个循环都打印只在调试模式下每 100ms 打印一次避免printf阻塞主循环。第三OLED 显示频率可以降到 5Hz 到 10Hz人眼已经能看清状态不会拖累巡线循环。7.4 如何观察实时性能和波形开启编码器闭环后可以用 OLED 实时显示左右轮转速值也可以用蓝牙把数据发到上位机画速度曲线。调试 PID 时不推荐只看串口数字人脑很难从数字流里判断振荡趋势。更高效的方法是接一个逻辑分析仪把 PWM 输出引到通道上观看占空比变化波形。转向量剧烈振荡时波形上会看到明显的锯齿或高频抖动。真实的显存或内存数据需要以你自己的编译结果为准不同库版本和编译选项会导致 10% 到 20% 的差异。这个差异对巡线项目没有实际影响重点还是控制周期和转向稳定性。8. 开源小车巡线常见问题与排查方法下面是我整理的最常见问题和排查思路基本覆盖从零搭建到跑赛道的大部分坑。问题现象可能原因排查方式解决方案编译报错找不到 HAL 库工程目录引用了错误的固件库路径检查 Keil 的 Include Paths 设置重新添加 STM32CubeF1 固件库路径烧录后小车无反应主频初始化失败或供电电压不足检查电源指示灯和 3.3V 输出确认电池有电降压模块输出 5V 正常电机不转驱动板逻辑电压未接 / PWM 引脚错误用万用表测驱动板输入引脚电平查原理图核对 PWM 引脚和使能引脚配置电机一直往一个方向转差分转向逻辑反了单独测试左右电机交换左右轮 PWM 输出或者改代码方向标志灰度传感器一直读到 1 或 0阈值设置错误或传感器距离地面太高串口打印 ADC 原始值重新标定阈值调整传感器高度到 1cm-1.5cm在直道上蛇形走位kp过大 /kd过小串口观察偏差值振荡降低kp或增大kd过弯直接冲出去基础速度过高 /kp不足低速测试同一弯道降速或增大kp确认转向限幅没有过小OpenMV 串口数据乱码波特率不一致或 TX/RX 接反检查 OpenMV 和 STM32 波特率配置统一波特率交换串口接线OpenMV 偶尔丢包串口线过长或电磁干扰缩短杜邦线加接地线改用防静电屏蔽线或 SPI 通信跑第二圈开始走偏电池电压下降导致电机转速变低测量电池电压换高放电倍率电池或者加入速度闭环摄像头帧率低分辨率设置过高检查set_framesize配置使用 QQVGA 或 QVGA关闭不用的图像处理传感器上积灰导致误判车底传感器被灰尘遮挡擦拭传感器表面加装挡板或定期维护在调试流程上还有一个通用原则一次只改一个变量。很多新手调 PID 时同时改kp、kd和基础速度一旦出问题根本不知道是哪项导致的。正确的做法是固定其他参数只调整一项跑完一圈记录结果再改下一项。9. 开源小车巡线最佳实践从长期维护和二次开发的角度看有几个实践经验值得保留。9.1 代码模块化无论用什么主控巡线程序都应该分成独立的模块。至少包括motor.c、sensor.c、pid.c、uart.c和main.c。这样做的直接好处是换传感器型号时只改sensor.c换控制算法时只改pid.c串口调试代码不会污染主循环。很多开源项目代码写成一坨几百行全塞在main里后续想移植到 STM32F407 或者 ESP32改动成本会非常大。9.2 保留一套最小可运行配置把“传感器阈值 PID 参数 电机方向标志”单独做成一个头文件比如config.h。这样你可以随时切回上一版能跑的参数不会因为一次调参失败而无法回到稳定状态。#ifndef CONFIG_H #define CONFIG_H // 灰度传感器阈值 #define LINE_THRESHOLD 2000 // 电机方向标志 #define LEFT_MOTOR_DIR 1 #define RIGHT_MOTOR_DIR 1 // PID 参数 #define PID_KP 0.4f #define PID_KI 0.0f #define PID_KD 3.0f // 基础速度 #define BASE_SPEED 40 #endif9.3 做好日志和复现跑赛道之前打开串口记录把每一圈的偏差值、PID 输出和控制周期存下来。一旦小车跑飞回放日志就能定位是哪一段赛道、哪个偏差值触发的问题。批量采集传感器数据时也可以用脚本把串口输出的多路灰度值存成 CSV 文件在电脑上离线分析阈值分布比在单片机上看数字要直观得多。9.4 安全性合规提醒再强调一次合规问题。开源小车如果用于课程设计、竞赛或技术展示要遵守比赛规则和学校的安全管理规定。搭载摄像头做视觉巡线时不要在无人授权的情况下拍摄他人或车外环境。电路接线前务必断电操作锂电池充电时使用专用充电保护器不要在无人看管状态下长时间充电。这些安全边界不是套话而是实际工程项目里必须遵守的底线。10. 总结与下一步开源小车巡线项目的核心价值在于它用一套成本可控的硬件演示了嵌入式系统从感知、决策到执行的完整闭环。灰度传感器方案适合调试算法逻辑OpenMV 视觉方案适合拓展复杂赛道识别能力PID 控制是贯穿两者的核心。任何一个人能把这套链路跑通再去看 ROS 小车、AGV 物流车、麦克纳姆轮底盘都会发现底层的控制思想是通用的。第一次尝试时先不要追求速度。先把传感器标定好把小车的直线行驶调试好再依次加入 PID 和视觉模块。最容易踩的坑就是阈值漂移和 PID 参数没有配合赛道环境做标定这两个问题不要等上了赛道才后悔。如果小车已经能在低速下稳定巡线下一步可以按这个顺序进阶加入编码器速度闭环让小车在电量下降时保持稳定加入 OLED 屏幕和按键菜单不用每次重新编译就能调参数接入蓝牙模块用手机小程序远程切换模式和显示速度最后把 OpenMV 和灰度传感器组合起来灰度负责高速巡线视觉负责识别路口标志两者通过一个简单的状态机切换。开源小车巡线只是一个起点。真正有意思的不是让车沿着黑线走而是理解“为什么它能在黑线上走稳定”这件事背后的控制逻辑。当你能解释清楚 PID 每一项的作用能在不同赛道上随手调出合适的参数这个开源项目的价值才真正被吸收。建议把这份记录收藏备用下一辆车、下一个赛道你还会用到它。

相关新闻

最新新闻

掼蛋7分牌实战:出牌权控制与首发策略详解

掼蛋7分牌实战:出牌权控制与首发策略详解

打掼蛋时,一手牌的实力到底该怎么看?很多人把注意力全放在“有没有炸弹”“王多不多”上,结果真正开局后还是输。更常见的情况是:手里明明是一副不错的牌,却被对手压着打,出牌权从头到尾没拿回来过几次&…

2026/8/31 7:29:46
Ubuntu24安装PostgreSQL和PgVector

Ubuntu24安装PostgreSQL和PgVector

Ubuntu24安装PostgreSQL和PgVectorPostgreSQL的安装PgVecotr的安装PostgreSQL的安装 在Ubuntu上安装PostgreSQL数据库,你可以通过几种不同的方法进行,包括使用Ubuntu的软件包管理器(APT)或通过源代码编译安装。下面将介绍如何使用…

2026/8/31 7:29:46
从创意到技术实践:短视频开发与DevOps方向解析

从创意到技术实践:短视频开发与DevOps方向解析

抱歉,这个标题内容属于娱乐向的粉丝二次创作素材,不是技术博客能够覆盖的话题范围。 我目前只能围绕 软件开发、工程实践、AI 工具、框架集成、数据库、运维部署等 CSDN 技术方向 来撰写文章。如果你手上有一个真实的技术项目,哪怕只是零散…

2026/8/31 7:29:46
HarmonyOS 多设备短视频开发 :23 — @Monitor 与 @Computed:计算与监听

HarmonyOS 多设备短视频开发 :23 — @Monitor 与 @Computed:计算与监听

23 — Monitor 与 Computed:计算与监听 一、引言 在状态管理 V2 中,Trace 解决了"数据可观察"的问题,但"数据变化后要做什么"仍需要一种显式机制:Monitor 监听 Trace 属性变化并触发业务逻辑,Comp…

2026/8/31 7:29:46
HarmonyOS 多设备短视频开发: 22 — 状态管理 V2 装饰器体系

HarmonyOS 多设备短视频开发: 22 — 状态管理 V2 装饰器体系

22 — 状态管理 V2 装饰器体系 一、引言 状态管理 V1 存在对象深度观察受限、Prop 只同步一层、装饰器职责边界模糊等问题。HarmonyOS 5.0 起推出的状态管理 V2 以更清晰的职责划分、更强的类型约束和更细的观察粒度重塑了这套体系。本项目 multi-short-video 的 UI 层&#xf…

2026/8/31 7:29:46
Obsidian-skills 实用上手指南:在 Obsidian 里写、跟、沉淀项目战略

Obsidian-skills 实用上手指南:在 Obsidian 里写、跟、沉淀项目战略

Obsidian-skills 实用上手指南:在 Obsidian 里写、跟、沉淀项目战略 【免费下载链接】obsidian-skills Agent skills for Obsidian. Teach your agent to use Obsidian CLI and open formats including Markdown, Bases, JSON Canvas. 项目地址: https://gitcode.…

2026/8/31 7:24:46