news 2026/9/3 4:55:18

Arduino智能小车三模切换:红外传感器与状态机实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Arduino智能小车三模切换:红外传感器与状态机实战教程

在实际嵌入式课程设计和电子竞赛项目中,智能小车是一个经典的综合实践载体。它融合了微控制器编程、传感器数据采集、电机驱动控制以及简单的决策算法,是检验学生硬件连接、软件调试和系统集成能力的绝佳平台。本文将以“红外三模智能切换小车”为具体目标,详细讲解如何基于 Arduino 平台,利用红外传感器实现小车的三种工作模式(如循迹、避障、遥控)的智能识别与切换。文章面向具备 Arduino 基础语法和简单电路知识的开发者,旨在提供一个从零搭建、代码可读、问题可查的完整项目教程。通过本文,你将掌握多传感器信息融合的逻辑设计、状态机在嵌入式系统中的应用,以及如何让一个小车系统根据环境“智能”地改变自身行为。

1. 理解“红外三模智能切换”的核心设计思路

在开始动手焊接和写代码之前,必须先厘清项目的核心逻辑。所谓“三模智能切换”,其本质是一个基于环境输入(红外传感器信号)的有限状态机(Finite State Machine, FSM)。小车不应是三种模式的简单堆叠,而应能根据实时感知到的外部条件,自动、平滑地在不同模式间转换。

1.1 三种典型模式的界定与传感器需求

通常,智能小车的三种基础模式是:循迹模式、避障模式和遥控模式。每种模式依赖不同的红外传感器及其布局。

  • 循迹模式:小车沿着预设的黑色轨迹线行驶。这需要地面红外反射传感器(或称红外循迹模块)。通常在小车底部前方并排安装2-5个此类传感器,用于检测地面反射率,从而判断车身是否偏离轨迹。
  • 避障模式:小车在自由空间行进,遇到前方障碍物时自动转向避开。这需要前方红外避障传感器(或称红外接近开关)。通常在小车前方左、中、右位置安装,用于检测一定距离内是否有障碍物。
  • 遥控模式:小车接收来自红外遥控器的指令(如前进、后退、左转、右转、停止)。这需要红外接收头(如 VS1838B)和配套的红外遥控器。它解析来自遥控器的特定编码信号。

“智能切换”意味着小车需要一套决策逻辑,来判定当前应处于何种模式。一个简单的策略是优先级设计:遥控模式拥有最高优先级(一旦接收到有效遥控信号,立即接管控制);若无遥控信号,则检测前方是否有障碍物,若有则进入避障模式;若既无遥控也无前方障碍,则默认进入循迹模式,寻找地面轨迹。

1.2 系统硬件架构与信号流

理解信号流是硬件连接和软件调试的基础。整个系统的信息流动可以概括为“感知 -> 决策 -> 执行”。

  1. 感知层:各类红外传感器将物理世界的光信号转换为电信号(数字电平或模拟电压),输入到 Arduino 的数字或模拟输入引脚。
  2. 决策层:Arduino 主控板(如 Uno)持续轮询或中断读取这些引脚的电平。根据预设的切换逻辑(状态机),判断当前应运行的模式,并计算出对应的电机控制指令(如左轮速度、右轮速度)。
  3. 执行层:控制指令通过 Arduino 的数字输出引脚,发送给电机驱动模块(如 L298N、TB6612),驱动直流减速电机,最终实现小车的运动。

这个过程中,红外遥控信号的解码是一个特殊环节,它通常使用 Arduino 的IRremote库,通过中断方式读取红外接收头的数据,解码为具体的按键值。

2. 硬件准备与电路连接

一个可靠的项目始于清晰、正确的硬件连接。下面列出核心组件清单和连接示意图。

2.1 核心组件清单

组件名称型号示例数量主要用途
主控板Arduino Uno R31系统大脑,处理传感器数据,发出控制指令
电机驱动模块L298N 或 TB6612FNG1提供足够电流驱动直流电机,并接收 Arduino 的 PWM 和方向信号
直流减速电机TT马达(带轮)2驱动小车左右轮,实现移动和转向
地面红外循迹模块TCRT5000(数字输出)3-5检测地面黑白线,通常输出数字信号(检测到黑线为高/低电平)
前方红外避障模块E18-D80NK(可调距离)2-3检测前方障碍物,输出数字信号(检测到障碍为低电平)
红外接收头VS1838B1接收并解调红外遥控器发出的信号
红外遥控器NEC编码通用遥控器1发送控制指令
电源18650电池盒(7.4V)1为电机驱动和 Arduino 供电
车体底盘亚克力或金属底盘套件1承载所有组件
杜邦线公对公、公对母若干连接电路

注意:电机驱动模块的选择很重要。L298N 较经典但效率较低、发热大;TB6612FNG 效率高、体积小,更推荐用于电池供电的小车。确保电池电压在电机和驱动模块的额定范围内。

2.2 电路连接详解

连接遵循“电源独立,信号共地”的原则。假设我们使用 Arduino Uno 和 L298N 驱动模块。

电源部分:

  1. 电池正负极接入 L298N 的电源输入端子(+12V, GND)。这是电机的动力源。
  2. L298N 上的+5V输出端子(如果启用)可以给 Arduino 供电,但更稳妥的做法是:将电池正极通过一个降压模块(降至5V)或直接使用另一组电池,为 Arduino 的VIN引脚供电。务必确保 Arduino 和 L298N 的GND用导线连接在一起,形成共同的参考地。

传感器信号线连接(示例):

  • 循迹模块(3个):分别连接至 Arduino 数字引脚 D2, D3, D4。模块的OUT引脚接 Arduino 引脚,VCC接 Arduino5VGND接 ArduinoGND
  • 避障模块(2个,左、右):分别连接至 Arduino 数字引脚 D5, D6。接线方式同循迹模块。
  • 红外接收头:信号线接 Arduino 数字引脚 D11(IRremote库常用引脚),VCC5VGNDGND

电机驱动控制线连接:

  • L298N 的ENAENB分别接 Arduino 的 PWM 引脚 D9, D10,用于控制电机速度。
  • L298N 的IN1IN2控制电机A(假设为左轮)方向,接 Arduino D7, D8。
  • L298N 的IN3IN4控制电机B(右轮)方向,接 Arduino D12, D13。

最终引脚定义表:

Arduino 引脚连接组件说明
D2, D3, D4循迹模块 OUT数字输入,检测地面
D5, D6避障模块 OUT数字输入,检测障碍
D11红外接收头信号数字输入,接收红外信号
D9 (PWM)L298N ENAPWM输出,左轮速度
D10 (PWM)L298N ENBPWM输出,右轮速度
D7, D8L298N IN1, IN2数字输出,左轮方向
D12, D13L298N IN3, IN4数字输出,右轮方向

3. 软件环境搭建与核心库安装

代码的编写和上传依赖于 Arduino IDE 和必要的库文件。

3.1 Arduino IDE 基础配置

  1. 安装 Arduino IDE:从 Arduino 官网下载并安装最新稳定版 IDE。
  2. 安装驱动:如果使用 CH340 芯片的 Arduino 兼容板,需要在电脑上安装对应的 CH340 驱动程序,才能在 IDE 中识别到串口。
  3. 选择开发板与端口:在 IDE 的工具->开发板中选择Arduino Uno。在工具->端口中选择对应的串口(如 COM3, COM4)。

3.2 关键第三方库的安装

本项目需要IRremote库来解码红外信号。在 Arduino IDE 中,点击项目->加载库->管理库...,在库管理器中搜索 “IRremote”,选择由Arduino-IRremoteshirriff维护的版本进行安装。

常见坑点:网络上存在多个不同作者开发的IRremote库,它们可能使用不同的引脚或函数。务必使用库管理器安装的主流版本,并参考其自带的示例代码。如果遇到编译错误,检查是否与其他红外库冲突。

4. 代码实现:从模块驱动到状态机整合

代码结构应采用模块化设计,先实现各个独立功能,再整合状态机逻辑。

4.1 引脚定义与全局变量

首先,将硬件连接映射为代码中的常量,并定义状态变量。

// ====== 引脚定义 ====== // 循迹传感器引脚 (假设黑线输出 LOW) #define TRACK_LEFT 2 #define TRACK_MID 3 #define TRACK_RIGHT 4 // 避障传感器引脚 (假设检测到障碍输出 LOW) #define OBSTACLE_LEFT 5 #define OBSTACLE_RIGHT 6 // 红外接收引脚 #define IR_RECV_PIN 11 // 电机控制引脚 #define MOTOR_LEFT_SPEED 9 // ENA #define MOTOR_LEFT_IN1 7 #define MOTOR_LEFT_IN2 8 #define MOTOR_RIGHT_SPEED 10 // ENB #define MOTOR_RIGHT_IN3 12 #define MOTOR_RIGHT_IN4 13 // ====== 全局变量与对象 ====== #include <IRremote.h> IRrecv irrecv(IR_RECV_PIN); decode_results results; // 用于存储解码结果 // 定义小车工作模式 enum CarMode { MODE_TRACKING, // 循迹模式 MODE_AVOIDING, // 避障模式 MODE_REMOTE // 遥控模式 }; CarMode currentMode = MODE_TRACKING; // 初始模式为循迹 // 遥控器按键值定义 (需要根据实际遥控器解码结果修改) #define REMOTE_KEY_UP 0xFF629D #define REMOTE_KEY_DOWN 0xFFA857 #define REMOTE_KEY_LEFT 0xFF22DD #define REMOTE_KEY_RIGHT 0xFFC23D #define REMOTE_KEY_OK 0xFF02FD

4.2 基础电机控制函数

编写控制小车基本动作的函数,这是所有模式执行的基础。

// 电机初始化:设置引脚模式 void motorInit() { pinMode(MOTOR_LEFT_SPEED, OUTPUT); pinMode(MOTOR_LEFT_IN1, OUTPUT); pinMode(MOTOR_LEFT_IN2, OUTPUT); pinMode(MOTOR_RIGHT_SPEED, OUTPUT); pinMode(MOTOR_RIGHT_IN3, OUTPUT); pinMode(MOTOR_RIGHT_IN4, OUTPUT); stopCar(); // 初始状态停止 } // 控制小车动作的函数 void setMotor(int leftSpeed, int rightSpeed, bool leftDir, bool rightDir) { // leftDir/rightDir: true=前进, false=后退 digitalWrite(MOTOR_LEFT_IN1, leftDir ? HIGH : LOW); digitalWrite(MOTOR_LEFT_IN2, leftDir ? LOW : HIGH); analogWrite(MOTOR_LEFT_SPEED, leftSpeed); digitalWrite(MOTOR_RIGHT_IN3, rightDir ? HIGH : LOW); digitalWrite(MOTOR_RIGHT_IN4, rightDir ? LOW : HIGH); analogWrite(MOTOR_RIGHT_SPEED, rightSpeed); } void goForward(int speed) { setMotor(speed, speed, true, true); } void goBackward(int speed) { setMotor(speed, speed, false, false); } void turnLeft(int speed) { setMotor(speed / 2, speed, true, true); // 左轮慢,右轮快 } void turnRight(int speed) { setMotor(speed, speed / 2, true, true); // 右轮慢,左轮快 } void stopCar() { setMotor(0, 0, true, true); // 速度设为0 }

4.3 各模式独立功能实现

为每种模式编写独立的核心决策函数。

// 循迹模式逻辑 void trackingMode() { int leftSensor = digitalRead(TRACK_LEFT); int midSensor = digitalRead(TRACK_MID); int rightSensor = digitalRead(TRACK_RIGHT); // 假设传感器在黑线上为LOW,白地为HIGH if (midSensor == LOW) { // 中间传感器在黑线上,直行 goForward(150); } else if (leftSensor == LOW && rightSensor == HIGH) { // 只有左边压线,向左微调 turnLeft(150); } else if (rightSensor == LOW && leftSensor == HIGH) { // 只有右边压线,向右微调 turnRight(150); } else if (leftSensor == HIGH && rightSensor == HIGH) { // 都没压线,可能脱线,停止或原地旋转寻找 stopCar(); // 或者添加寻线算法 } } // 避障模式逻辑 void avoidingMode() { int obstacleLeft = digitalRead(OBSTACLE_LEFT); int obstacleRight = digitalRead(OBSTACLE_RIGHT); if (obstacleLeft == HIGH && obstacleRight == HIGH) { // 左右都无障碍,直行 goForward(120); } else if (obstacleLeft == LOW) { // 左边有障碍,向右转 turnRight(150); delay(300); // 转向一段时间 } else if (obstacleRight == LOW) { // 右边有障碍,向左转 turnLeft(150); delay(300); } else { // 左右都有障碍,后退然后转向 goBackward(100); delay(500); turnLeft(180); delay(400); } } // 遥控模式逻辑 void remoteMode(unsigned long keyValue) { switch (keyValue) { case REMOTE_KEY_UP: goForward(180); break; case REMOTE_KEY_DOWN: goBackward(150); break; case REMOTE_KEY_LEFT: turnLeft(180); break; case REMOTE_KEY_RIGHT: turnRight(180); break; case REMOTE_KEY_OK: stopCar(); break; default: // 未定义的按键,保持原状态或停止 // stopCar(); break; } }

4.4 状态机与模式切换决策逻辑

这是“智能切换”的核心,在loop()函数中不断运行。

void loop() { // 第一步:检查最高优先级信号——红外遥控 if (irrecv.decode(&results)) { unsigned long irValue = results.value; irrecv.resume(); // 准备接收下一个信号 // 如果收到有效的遥控信号,立即切换到遥控模式,并执行对应动作 if (irValue != 0xFFFFFFFF) { // 过滤掉重复码 currentMode = MODE_REMOTE; remoteMode(irValue); // 遥控模式下,一次按键动作持续一段时间,这里可以加延时或保持状态 delay(100); // 简单的按键响应延时 return; // 本次循环结束,优先响应遥控 } } // 第二步:若非遥控模式,则检查避障传感器 if (currentMode != MODE_REMOTE) { int obstacleLeft = digitalRead(OBSTACLE_LEFT); int obstacleRight = digitalRead(OBSTACLE_RIGHT); // 如果任意一个避障传感器触发,切换到避障模式 if (obstacleLeft == LOW || obstacleRight == LOW) { currentMode = MODE_AVOIDING; } else { // 没有障碍物,也没有遥控信号,则切换到循迹模式 currentMode = MODE_TRACKING; } } // 第三步:根据当前模式执行相应动作 switch (currentMode) { case MODE_TRACKING: trackingMode(); break; case MODE_AVOIDING: avoidingMode(); break; case MODE_REMOTE: // 遥控模式的动作已在收到信号时执行,此处可空或处理持续状态 // 例如,如果没有持续收到信号,一段时间后自动停止 break; } // 一个小延时,防止loop运行过快 delay(50); }

4.5 初始化设置

setup()函数中完成所有初始化工作。

void setup() { Serial.begin(9600); // 用于调试输出 // 初始化传感器引脚 pinMode(TRACK_LEFT, INPUT); pinMode(TRACK_MID, INPUT); pinMode(TRACK_RIGHT, INPUT); pinMode(OBSTACLE_LEFT, INPUT); pinMode(OBSTACLE_RIGHT, INPUT); // 初始化电机 motorInit(); // 初始化红外接收 irrecv.enableIRIn(); Serial.println("红外三模智能小车初始化完成!"); }

5. 系统调试与功能验证

代码上传后,必须分模块、分模式进行系统化调试,而不是直接让小车跑起来。

5.1 传感器单体测试

编写简单的测试程序,验证每个传感器是否工作正常。

void sensorTest() { Serial.print("循迹 L,M,R: "); Serial.print(digitalRead(TRACK_LEFT)); Serial.print(", "); Serial.print(digitalRead(TRACK_MID)); Serial.print(", "); Serial.println(digitalRead(TRACK_RIGHT)); Serial.print("避障 L,R: "); Serial.print(digitalRead(OBSTACLE_LEFT)); Serial.print(", "); Serial.println(digitalRead(OBSTACLE_RIGHT)); if (irrecv.decode(&results)) { Serial.print("红外解码: 0x"); Serial.println(results.value, HEX); irrecv.resume(); } delay(500); }

loop()暂时改为只调用sensorTest()。打开串口监视器,观察:

  • 用手或黑纸片靠近地面传感器,看输出是否变化。
  • 用手在避障传感器前晃动,看输出是否变化。
  • 按下遥控器按键,看是否输出十六进制编码(如0xFF629D)。记录下各个方向键和确认键的编码,并更新代码中的REMOTE_KEY_XXX定义。

5.2 电机与驱动测试

单独测试电机驱动,确保接线正确,电机能正反转。

void motorTest() { Serial.println("前进2秒"); goForward(150); delay(2000); Serial.println("停止1秒"); stopCar(); delay(1000); Serial.println("左转2秒"); turnLeft(150); delay(2000); Serial.println("右转2秒"); turnRight(150); delay(2000); stopCar(); Serial.println("测试结束"); while(1); // 停止在此处 }

将小车架起,使轮子悬空,运行测试程序,观察轮子转向和转速是否符合预期。

5.3 分模式集成测试

将完整的代码上传,但通过串口打印当前模式,进行实地测试。

  1. 测试循迹模式:在地面放置黑胶带轨迹。不操作遥控器,无前方障碍。观察小车是否能稳定循迹,并通过串口确认currentModeMODE_TRACKING
  2. 测试避障模式:在空旷地面,用手或书本在小车前方制造障碍。观察小车是否转向避开,并打印切换到MODE_AVOIDING
  3. 测试遥控模式:按下遥控器任意方向键。观察小车是否立即响应遥控指令,并打印切换到MODE_REMOTE。松开按键后,根据你的逻辑(如上述代码中遥控指令后return),小车可能会停止或保持最后状态,直到其他传感器触发模式切换。

6. 常见问题排查与优化

在实际组装和调试中,一定会遇到各种问题。下面是一个快速排查清单。

问题现象可能原因检查与解决思路
小车完全不动,电机不转1. 电源未接通或电压不足。
2. 电机驱动模块使能端未激活。
3. Arduino 与驱动模块间信号线未接或接错。
4. 代码中电机速度设置为0。
1. 用万用表测量电池电压、驱动模块和 Arduino 的 VCC。
2. 检查 L298N 的ENAENB跳线帽是否接上,或代码中 PWM 引脚是否有输出。
3. 对照引脚定义表,逐根检查信号线连接。
4. 在motorTest()中逐步增大speed值测试。
小车只能一个方向转或原地转圈1. 左右电机接线反了。
2. 某个电机的两根方向控制线接反。
3. 左右轮机械阻力差异大。
1. 交换左右电机在驱动板上的接线。
2. 交换某个电机的IN1IN2(或IN3IN4)。
3. 检查轮子是否安装过紧,尝试调整setMotor函数中左右轮速度补偿值。
循迹不稳定,左右摇摆或跑飞1. 传感器距离地面高度不合适。
2. 传感器阈值未调节好。
3. 控制算法过于敏感或迟钝。
4. 环境光干扰。
1. 调整传感器支架高度,通常距地面 1-2cm。
2. 调节传感器上的电位器,使其能稳定区分黑白。
3. 调整trackingMode()中的判断逻辑和转向速度/时间。
4. 避免强光直射,或为传感器增加遮光罩。
避障模式误触发或不触发1. 避障传感器检测距离未调节。
2. 传感器安装角度不对。
3. 障碍物颜色或材质不易被红外检测。
1. 调节传感器上的电位器,改变检测距离(通常 3-80cm 可调)。
2. 确保传感器正对前方,无遮挡。
3. 使用表面粗糙、非黑色的物体测试。
遥控无反应1. 红外接收头引脚接错。
2. 遥控器电池没电。
3. 使用的IRremote库与接收头型号不兼容。
4. 遥控器编码格式不匹配。
1. 确认接收头信号线接在了支持外部中断的引脚(如 D11)。
2. 更换遥控器电池。
3. 尝试使用库管理器中的其他红外库版本。
4. 运行库自带的示例程序IRrecvDumpV2,查看你的遥控器实际发出的编码,并更新代码中的键值定义。
模式切换混乱1. 传感器状态读取有误。
2. 状态机优先级逻辑有缺陷。
3. 遥控信号处理占用了过多时间,导致其他传感器无法及时响应。
1. 使用sensorTest()确认每个传感器的实时状态。
2. 审查loop()中的if-else逻辑,确保符合“遥控 > 避障 > 循迹”的优先级设计。
3. 确保遥控信号处理(remoteMode)后尽快返回主循环,或使用非阻塞式的时间管理。

7. 项目优化与扩展方向

基础功能实现后,可以从稳定性、智能性和功能性三个方面进行优化和扩展。

7.1 稳定性优化

  • 电源去耦:在 Arduino 的电源入口和电机驱动模块的电源附近并联一个 100uF 的电解电容和一个 0.1uF 的瓷片电容,以滤除电机启停引起的电压波动。
  • 软件消抖:对于数字传感器输入,可以添加简单的软件消抖逻辑,避免因接触不良或干扰导致的误触发。
    bool readSensorDebounce(int pin) { bool stableState = digitalRead(pin); delay(5); // 短暂延时 if (digitalRead(pin) == stableState) { return stableState; } return !stableState; // 状态不稳定,返回相反值或原值 }
  • 异常保护:在代码中添加看门狗(Watchdog)定时器,防止程序跑飞。Arduino 可以通过<avr/wdt.h>库实现。

7.2 智能性提升

  • PID 循迹:将简单的if-else循迹升级为 PID 控制算法,使小车转向更平滑,速度可自适应。
  • 多传感器融合避障:增加超声波传感器或TOF激光测距模块,与红外避障互补,提高测距精度和可靠性。
  • 模式记忆与平滑过渡:当从遥控模式退出时,不要立即执行避障或循迹,可以有一个短暂的停止或减速过程,避免动作突变。

7.3 功能性扩展

  • 增加蓝牙/Wi-Fi 控制:引入 HC-05 蓝牙模块或 ESP8266/ESP32,实现手机 APP 或网页控制,与红外遥控形成互补。
  • 添加状态指示:使用 RGB LED 或 OLED 屏幕,实时显示当前模式、速度、传感器状态等信息。
  • 实现路径记录与回放:通过记录遥控操作或传感器数据,让小车学习一段路径并自动重复运行。

这个项目成功的关键不在于代码有多复杂,而在于对硬件信号的准确理解、对系统状态的清晰定义,以及耐心细致的调试。从分模块测试到系统联调,每一步遇到的问题都是学习嵌入式系统开发的宝贵经验。建议在完全理解并调通基础版本后,再选择一两个扩展方向进行深入研究,从而真正掌握从需求分析到功能实现的完整工程流程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 4:54:06

多智能体辩论系统:用对抗性验证提升AI答案可靠性的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 4:54:00

AI技术博客写作指南:从OCR到ComfyUI的实践

抱歉&#xff0c;我无法根据这个标题生成 CSDN 技术博客正文。原因很直接&#xff1a;标题内容是横滨冠军赛国乒男队相关报道&#xff0c;属于体育赛事话题&#xff0c;与我的角色&#xff08;AI 模型/本地部署/开发工具的 CSDN 技术写作&#xff09;不匹配&#xff0c;也不在我…

作者头像 李华
网站建设 2026/9/3 4:52:55

STM32F0标准外设库V1.5.0:搭建最小工程与避坑指南

简介&#xff1a;嵌入式开发中&#xff0c;固件库的选择直接影响项目进度与维护成本。STM32F0作为入门级Cortex-M0芯片&#xff0c;广泛用于成本敏感的控制器设计&#xff0c;其标准外设库&#xff08;StdPeriph&#xff09;通过封装寄存器操作&#xff0c;提供GPIO、USART等通…

作者头像 李华
网站建设 2026/9/3 4:52:05

基于STM32F103C8T6的三相SPWM逆变电源:从硬件设计到软件实现全解析

简介&#xff1a;本资源是一套基于STM32F103C8T6单片机实现的三相SPWM逆变电源完整开发套件&#xff0c;面向嵌入式电力电子方向的本科生、研究生及硬件工程师&#xff0c;解决三相正弦波脉宽调制驱动、IGBT功率级控制与PCB工程落地等核心实践难题。压缩包共385个文件&#xff…

作者头像 李华
网站建设 2026/9/3 4:51:34

AI电影级Skill:从文本蓝图到视频创作的结构化流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华