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

Arduino避障小车:从HC-SR04超声波传感器到L293D电机驱动的完整实现

1. 项目概述与核心思路

避障机器人,听起来像是科幻电影里的东西,但其实它的核心逻辑非常直接,就是让一个能移动的装置自己“看”路,遇到障碍物就绕开。对于刚接触嵌入式开发和机器人学的朋友来说,这几乎是第一个会想到去实现的“智能”项目。它麻雀虽小,五脏俱全,涵盖了传感器数据采集、控制器逻辑决策、执行器驱动控制这三大机器人核心技术模块。

我这次要分享的,是基于Arduino Uno和HC-SR04超声波传感器的经典避障小车方案。选择这个组合,原因很简单:门槛低、成本可控、学习曲线平缓。Arduino有庞大的社区和库支持,哪怕你昨天才学会点亮一个LED,今天也能看懂控制电机的代码。HC-SR04超声波传感器价格便宜,原理直观(发射声波,接收回波,计算时间差),测距精度对于室内低速移动的小车来说完全够用。整个项目,我们从最基础的电路连接讲起,一直深入到代码逻辑的优化,最后还会在TinkerCAD这个免费的在线仿真平台上跑一遍,确保你不动手焊一根线,也能把整个流程和原理吃透。

这个项目适合谁呢?如果你是电子爱好者、机器人竞赛的入门选手、相关专业的学生,或者单纯是对“如何让机器自己动起来”感到好奇的朋友,那么跟着走一遍,你收获的将不仅仅是一辆能跑的小车,更是一套解决此类问题的通用方法论。我们会用最“说人话”的方式,把每一个电阻、每一条代码指令背后的“为什么”讲清楚。

2. 核心硬件选型与功能解析

做硬件项目,第一步永远是搞清楚你手里的“兵器”是干什么的,以及为什么选它。盲目堆砌元件,最后很可能是一团乱麻。我们这个小车的“大脑”、“眼睛”和“手脚”分别由以下核心部件担当。

2.1 控制核心:Arduino Uno的不可替代性

为什么是Arduino Uno,而不是更便宜的Nano,或者功能更强的Mega?这里面的考量,对于新手项目至关重要。

Arduino Uno在这个项目中扮演绝对的核心控制器角色。它是一块基于ATmega328P单片机的开发板。我选择Uno,首要原因是它的“教学友好性”“生态完整性”。它的引脚布局清晰,有独立的电源接口和USB编程口,不容易接错。市面上几乎所有的传感器、驱动模块的教程和库文件,都优先适配Uno。这意味着你在调试过程中遇到的绝大多数问题,都能在网上找到现成的解决方案。

从性能上看,ATmega328P主频16MHz,拥有32KB的Flash(存程序)、2KB的SRAM(运行内存)和1KB的EEPROM。对于避障小车这个级别的程序量(通常不超过10KB)和变量复杂度(几个距离值、几个状态标志),完全绰绰有余。它的14个数字I/O口和6个模拟输入口,也足够我们连接传感器、驱动模块,甚至为后续扩展(比如加个蓝牙模块遥控)留有余地。

注意:很多新手会纠结于“我是不是需要一块更快的板子?”。对于实时性要求极高的应用(比如高速平衡车),主频和中断响应速度是关键。但对于我们这种以“检测-决策-执行”为循环,且每个环节都有几十到几百毫秒延迟的避障小车,Uno的处理速度远远过剩。把精力花在优化算法逻辑上,比升级硬件带来的提升要大得多。

2.2 环境感知:HC-SR04超声波传感器工作原理

机器人的“眼睛”我们选用HC-SR04超声波传感器。它通过非接触的方式测量距离,原理模仿了蝙蝠:发出超声波,遇到物体反射回来,通过计算声波往返的时间来推算距离。

它的工作电压是5V,有四个引脚:VCC(电源)、GND(地)、Trig(触发)和Echo(回波)。具体工作序列如下:

  1. 控制器向Trig引脚发送一个至少10微秒的高电平脉冲,触发传感器发射一组8个40kHz的超声波。
  2. 超声波在空气中传播,遇到障碍物后返回。
  3. 传感器检测到回波后,会将Echo引脚置为高电平,高电平的持续时间就是超声波往返的时间。
  4. 控制器通过pulseIn()函数读取Echo引脚高电平的持续时间t(单位微秒)。
  5. 计算距离:距离 = (t * 声速) / 2。声速在常温下约340米/秒,即34000厘米/秒。因为t单位是微秒(10^-6秒),所以公式转化为:距离(厘米) = (t / 1000000) * 34000 / 2 = t * 0.034 / 2 = t / 58.0。这个58.0就是一个需要记住的换算系数。

为什么不用红外或激光传感器?红外传感器容易受环境光干扰,黑色物体吸收红外线会导致测距失败。激光传感器精度高但价格昂贵。超声波传感器成本低,不受光线影响,对大多数物体材质(除吸音材料外)反射效果都不错,在室内环境下是性价比最高的选择。它的主要缺点是波束角较大(约15度),测量的是一个小区域内的最近距离,无法精确分辨障碍物的边缘细节;同时声波传播速度受温湿度影响,但对室内小车的避障精度要求而言,可以忽略。

2.3 动力执行:L293D电机驱动模块与直流电机

机器人的“手脚”是一对直流减速电机,由L293D电机驱动模块来控制。Arduino的I/O引脚只能提供最大40mA的电流,而驱动电机需要几百mA甚至上A的电流,所以必须通过驱动模块来“放大”控制信号。

L293D是一颗经典的双H桥电机驱动芯片。所谓“H桥”,你可以想象成四个开关(晶体管)组成一个“H”形电路,通过控制这四个开关的不同通断组合,可以轻松让电机实现正转、反转和刹车。一个L293D芯片内部集成了两个独立的H桥,正好可以驱动我们小车的两个电机。

驱动模块通常将L293D芯片、必要的保护二极管、滤波电容以及便于接线的端子集成在一起。它需要两路电源:

  1. 逻辑电源(VCC1):通常接5V,用于给L293D内部的逻辑电路供电,这个可以接Arduino的5V输出。
  2. 电机电源(VCC2):给电机供电,电压根据你的电机额定电压来定,常用的是6V(4节AA电池)或7.4V(2节锂电池)。这里有一个关键点:电机电源必须和逻辑电源共地!即电池的负极、Arduino的GND、L293D模块的GND必须连接在一起,否则控制信号无法正确传递。

控制端非常简单,每个电机对应两个输入引脚(IN1, IN2)和一个使能引脚(EN)。以电机A为例:

  • IN1=HIGH, IN2=LOW:电机正转(前进)
  • IN1=LOW, IN2=HIGH:电机反转(后退)
  • IN1=IN2:电机刹车(快速停止)
  • EN引脚可以接PWM信号,通过调节占空比来无级调节电机速度。如果直接接高电平,则电机全速运行。

2.4 虚拟验证平台:TinkerCAD Circuits的优势

在动手焊接之前,我强烈推荐在TinkerCAD Circuits上完成整个电路的搭建和程序仿真。这是Autodesk提供的免费在线电子电路仿真平台,对教育用途极其友好。

它的核心优势有三点:

  1. 零成本试错:不用担心接错线烧坏宝贵的Arduino或传感器。你可以随意尝试各种连接方式,观察现象。
  2. 可视化编程与调试:除了支持文本代码,它还提供基于Blockly的图形化编程,非常适合理解程序逻辑。仿真运行时,你可以看到虚拟万用表、示波器的读数,以及程序变量的实时状态,这对调试有巨大帮助。
  3. 组件库丰富:包含了Arduino Uno、各种传感器、电机驱动模块、基础元器件等,足以完成我们这个项目。

在虚拟环境中成功跑通,意味着你的电路原理和程序逻辑基本没有问题,再转移到实物上,成功率会高很多,心理压力也小。

3. 电路系统搭建与连接详解

理论清楚了,我们开始“搭积木”。电路连接是项目的骨架,连接错误轻则功能失常,重则损坏元件。我会按照“电源系统 -> 信号系统”的顺序,把每一根线为什么这么接都讲明白。

3.1 电源分配与共地处理

电源是系统的血液,处理不好,整个系统会不稳定甚至瘫痪。我们这个系统有三处需要供电:

  1. Arduino Uno:可以通过USB口供电(5V),或者通过板上的DC插座供电(7-12V)。
  2. L293D电机驱动模块:需要逻辑电源(5V)和电机电源(6V或更高)。
  3. HC-SR04超声波传感器:需要5V电源。

最佳供电方案(实物搭建推荐)

  • 准备一个7.4V 2S锂电池组作为主电源。它的电压适合直接给Arduino的DC插座供电(在7-12V安全范围内),同时也能给电机提供足够的动力。
  • 将电池正负极接到Arduino的DC插座或VIN和GND引脚。
  • 从Arduino的5V引脚引出线,分别给L293D模块的VCC1(逻辑电源)和HC-SR04的VCC供电。因为Arduino板载了稳压芯片,可以将7.4V降压为稳定的5V输出。
  • 将电池的正负极(7.4V)直接接到L293D模块的电机电源输入端子(VCC2)。注意:此时电池的负极(GND)必须用一根线连接到Arduino的GND引脚上。这就是前面强调的“共地”,确保所有器件有一个共同的电压参考点。
  • HC-SR04的GND和L293D模块的GND,自然也都要接到这个共同的GND上。

TinkerCAD仿真中的简化方案: 在TinkerCAD中,我们可以直接用两个电压源来模拟:

  • 放置一个5V电压源,其正极同时连接到Arduino的5V引脚、L293D的VCC1、HC-SR04的VCC。负极连接到所有元件的GND。
  • 放置一个9V电池组(模拟我们的电机电源),其正极连接到L293D的VCC2,负极同样连接到公共GND。
  • 这样,我们就清晰地分离了逻辑电源(5V)和电机电源(9V),并且实现了共地。

3.2 信号线连接:控制与反馈回路

电源搞定后,信号线就是传递“思想”的神经了。连接时务必对照元件引脚定义图。

1. 超声波传感器连接:

  • HC-SR04.VCC->Arduino.5V
  • HC-SR04.GND->Arduino.GND
  • HC-SR04.Trig->Arduino.数字引脚 9(可自定义,代码需对应)
  • HC-SR04.Echo->Arduino.数字引脚 10(可自定义,代码需对应)

这里Trig和Echo为什么接9和10?没有特殊原因,只是我习惯把相关的传感器接在相邻的引脚,方便管理。你可以接任何数字引脚,但避免使用0和1(通常用于串口通信)。

2. L293D电机驱动模块连接:假设我们控制左侧电机为电机A,右侧电机为电机B。

  • L293D.ENA->Arduino.数字引脚 5(PWM引脚,用于调速)
  • L293D.IN1->Arduino.数字引脚 4
  • L293D.IN2->Arduino.数字引脚 3
  • L293D.IN3->Arduino.数字引脚 7
  • L293D.IN4->Arduino.数字引脚 8
  • L293D.ENB->Arduino.数字引脚 6(PWM引脚,用于调速)
  • L293D.电机A输出+/-->左侧直流电机两根线
  • L293D.电机B输出+/-->右侧直流电机两根线

实操心得:电机线序测试接好线后,先不要写复杂程序。写一个简单的测试代码,让一个电机正转2秒,停止1秒,再反转2秒。如果电机转向与预期相反,不要重新焊接!只需要将接到电机上的两根线对调一下即可。这是调试电机驱动时最快的方法。

3. 在TinkerCAD中完成连接:在TinkerCAD元件库中搜索并拖出所有元件。按照上述描述,使用导线工具进行连接。TinkerCAD的一个好处是,当你把线悬停在引脚上时,它会显示引脚名称,极大降低了接错的风险。连接完成后,你的虚拟工作区应该有一个清晰、不杂乱的电路图,电源线(红色)、地线(黑色)、信号线(其他颜色)最好能区分开,便于后续检查和排错。

4. 避障逻辑与代码实现深度剖析

电路是躯体,代码是灵魂。避障逻辑的优劣,直接决定了小车是“智能”地绕开障碍,还是“智障”地原地打转或反复撞墙。我们从最基础的状态机开始,逐步优化。

4.1 基础测距函数与滤波处理

首先,我们需要一个可靠、准确的测距函数。直接读取一次Echo时间就计算距离,很容易受到随机干扰产生跳变值。

// 定义引脚 const int trigPin = 9; const int echoPin = 10; // 定义安全距离阈值(厘米) const int safeDistance = 15; long getDistance() { // 发送一个10微秒的高脉冲触发测距 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取回波高电平持续时间(微秒) long duration = pulseIn(echoPin, HIGH); // 计算距离(厘米),使用之前推导的公式 long distance = duration / 58.0; // 或者 distance = duration * 0.034 / 2; return distance; }

这个函数是基础,但不稳定。一个重要的改进是加入软件滤波。例如,连续采样3次,去掉最大值和最小值,取中间值作为最终结果,可以滤除大部分偶然误差。

long getFilteredDistance() { long d[3]; for (int i = 0; i < 3; i++) { d[i] = getDistance(); delay(30); // 两次测量间稍作延迟,避免声波干扰 } // 简单的排序找中值 if (d[0] > d[1]) swap(d[0], d[1]); if (d[1] > d[2]) swap(d[1], d[2]); if (d[0] > d[1]) swap(d[0], d[1]); return d[1]; // 返回中值 }

4.2 核心状态机与决策逻辑实现

避障逻辑本质上是一个简单的状态机(State Machine)。小车只有几种状态:前进、左转、右转、后退、停止。我们的程序就是根据传感器读数和当前状态,决定下一个状态是什么。

我们采用最经典的“阈值法”逻辑:

  1. 持续测量前方距离。
  2. 如果距离 > 安全距离(如15cm),则状态为“前进”。
  3. 如果距离 <= 安全距离,则状态切换为“避障”。避障可以简单设计为:先停车,然后让一个轮子正转,另一个轮子反转,实现原地右转(或左转)一定角度或时间,然后再回到第1步。

以下是基于此逻辑的完整代码框架,包含了电机控制函数:

// 电机控制引脚定义 const int enA = 5; const int in1 = 4; const int in2 = 3; const int enB = 6; const int in3 = 7; const int in4 = 8; void setup() { // 初始化所有引脚模式 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); // ... 初始化其他电机控制引脚 // 初始化串口,用于调试输出距离值 Serial.begin(9600); } // 电机控制动作函数 void moveForward() { // 电机A正转 digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(enA, 200); // PWM调速,200/255的速度 // 电机B正转 digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enB, 200); } void turnRight() { // 电机A正转(右轮) digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(enA, 150); // 电机B反转(左轮) digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enB, 150); } void stopMotors() { // 两个电机刹车 digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void loop() { long dist = getFilteredDistance(); // 获取滤波后的距离 // 调试输出,在串口监视器查看 Serial.print("Distance: "); Serial.print(dist); Serial.println(" cm"); // 核心决策逻辑 if (dist > safeDistance) { // 前方安全,前进 moveForward(); Serial.println("State: Forward"); } else { // 检测到障碍,执行避障动作 Serial.println("State: Obstacle Detected! Turning Right..."); stopMotors(); delay(100); // 停稳 turnRight(); delay(500); // 右转500毫秒,这个时间需要根据小车速度和转弯半径实际调整 // 转弯后,循环会再次检测距离 } delay(100); // 主循环延迟,控制检测频率 }

4.3 在TinkerCAD中编写与调试代码

TinkerCAD的代码编辑器支持文本代码和图形化Blocks。对于学习,我建议先用Blocks搭建逻辑,再切换到文本模式查看生成的代码,这对理解程序结构很有帮助。

  1. 在TinkerCAD电路中,点击Arduino Uno,选择“代码编辑器”。
  2. 初始为Blocks模式。你可以从侧边栏拖出“超声波传感器读取距离”、“如果...否则...”、“设置数字引脚高低电平”等积木块,拼出上述逻辑。这个过程非常直观,你能看到每个判断分支和动作。
  3. 拼好后,点击右上角“Blocks + Text”或“Text”按钮,就能看到自动生成的C++代码。你可以在此基础上进行微调,比如修改引脚号、延迟时间等。
  4. 点击“开始仿真”,虚拟小车就会动起来!你可以用鼠标拖动一个障碍物(比如一个盒子模型)靠近超声波传感器,观察小车的反应。同时,打开串口监视器,能看到实时打印出的距离值和状态信息,这是调试的利器。

避坑技巧:TinkerCAD仿真延迟在TinkerCAD中,仿真是按“逻辑时间”进行的,delay()函数的效果会被等比缩放。你可能需要将代码中的delay(500)(实物中的500毫秒)在仿真中调整为delay(50)甚至更小,才能看到流畅的转弯动作。这只是一个仿真特性,实际烧录到实物Arduino时,要改回正常的毫秒数。

5. 从仿真到实物:部署与调优实战

虚拟世界一切顺利,但真正的挑战在把代码下载到实体硬件的那一刻开始。这一步会暴露所有连接、供电和机械上的问题。

5.1 硬件组装与布线规范

  1. 底盘与电机固定:选择一个合适的底盘,将两个直流减速电机用螺丝或扎带牢固固定。电机轴最好装上轮子。确保两个轮子轴线平行,否则小车会跑偏。
  2. 电源管理:强烈建议使用一个独立的电池盒为电机供电,而不是和Arduino共用USB电源。电机启动和堵转时电流很大,会造成电压骤降,导致Arduino重启(俗称“掉电复位”)。使用L293D模块,将电机电源(如4节AA电池的6V)接VCC2,同时电池负极与Arduino GND相连。Arduino可以通过另一组电池或USB单独供电。
  3. 布线整洁:使用杜邦线连接时,尽量用不同颜色的线区分电源(红色)、地(黑色)、信号(黄、绿等)。用扎带或胶带将线束整理好,避免缠绕进轮子或万向轮。超声波传感器最好用支架固定在小车前方,并保持传感器面朝前且水平。

5.2 参数校准与性能调优

下载代码后,小车可能表现得不尽如人意。别急,这是调参阶段。

  1. 安全距离校准safeDistance这个值不是固定的。它取决于小车的刹车距离和转弯半径。在空旷地方,让小车对着墙以常速前进,用串口监视器观察它停在离墙多远的地方。这个距离加上几厘米的余量,就是比较合适的safeDistance。通常设置在10-20cm之间。
  2. 转弯时间/角度调优:代码中turnRight()后的delay(500),决定了转弯角度。500ms可能转90度,也可能转120度,这取决于电机速度、轮距和地面摩擦力。你需要实测:让小车面对墙,触发右转,测量转弯后小车与墙的夹角,调整delay时间直到它大致转过90度。更高级的做法是使用编码器测量轮子转过的圈数来控制角度,但作为入门,时间控制简单有效。
  3. PWM速度调整analogWrite(enA, 200)中的200是PWM值(0-255)。值越大,电机越快。前进速度和转弯速度可能需要不同的PWM值。转弯时速度太快容易打滑,可以适当调低(如150)。你可以定义几个不同的速度常量,如speedForward=200,speedTurn=150,方便调整。
  4. 应对“死循环”陷阱:基础逻辑有个经典问题:如果小车转完后,侧面离障碍物仍然很近(小于安全距离),它会立刻又检测到障碍物,再次转弯,可能陷入对着一个墙角不停转圈的“死循环”。一个简单的改进是引入“状态记忆”或“多次尝试机制”。例如,检测到障碍后,不是只转一次,而是进入一个“探索”循环:右转 -> 检测距离,如果还近,就再转一点,直到找到开阔方向再前进。这需要更复杂的状态机,是下一步优化的方向。

5.3 扩展思路与进阶优化

当基础避障运行稳定后,你可以尝试以下扩展,让小车更智能:

  1. 多传感器融合:在左侧和右侧各加一个超声波或红外传感器,实现“左-中-右”三方向测距。这样,当中间检测到障碍时,可以比较左右哪边距离更大,然后选择更开阔的一侧转弯,而不是固定右转。
  2. 增加“倒车”逻辑:如果三面都被围住(比如钻进了死胡同),可以加入“后退-转向”的复合动作。
  3. 速度分级控制:根据障碍物距离动态调整速度。距离远时全速前进,距离变近时减速,低于阈值时转向。这会让运动看起来更平滑、更智能。
  4. 引入PID控制:如果你希望小车能沿着墙边保持固定距离行走(沿墙走),这就需要用到PID算法来动态调整左右轮速差,这是一个从“反应式”到“控制式”的飞跃。
  5. 上位机监控:通过蓝牙或Wi-Fi模块(如HC-05、ESP8266)将小车的传感器数据(距离、电机状态)发送到电脑或手机APP上,实现远程监控和调试。

从一块单片机、两个电机和一个传感器开始,到实现一个能自主应对简单环境的小车,这个过程充满了乐趣和挑战。每一次调试,每一次对参数的微调,都是对“感知-决策-执行”这一机器人核心循环的深入理解。这个项目就像一把钥匙,打开了通往更广阔机器人世界的大门。当你看到自己亲手搭建的小车灵巧地绕过地上的水瓶时,那种成就感,就是驱动我们不断探索下去的最大动力。

http://www.gsyq.cn/news/1449736.html

相关文章:

  • 手把手教你用AWR2944开发板配置DDMA波形:从Lua脚本到Matlab数据处理全流程
  • FastReport WPF 2024.1.3实战:5分钟搞定从数据库到PDF报表的完整流程
  • 告别依赖地狱:用鱼香ROS脚本一键搞定CARLA-ROS桥接(ROS2 Foxy版)
  • 3分钟搞定OpenCore EFI配置:智能黑苹果助手OpCore-Simplify深度解析
  • 如何用Mousecape彻底改变你的macOS鼠标光标体验:完整免费指南
  • 工业级选择:NoMachine如何成为嵌入式开发和设备调试的局域网远程控制神器?
  • 高通RB5机器人套件到手后,除了刷系统还能玩什么?聊聊视觉与5G夹层板的实战应用
  • 免费获取股票数据的终极指南:3个步骤用Python构建你的量化分析系统
  • 新乡沙发翻新换皮换布哪家好、匠阁、御匠、锦修三大品牌哪个靠谱公司推荐、怎么选沙发翻新服务商 - 卓一科技
  • 智慧职教刷课脚本:3大平台智能学习自动化解决方案
  • 昆山装修公司如何选?本地化交付能力与拎包入住实现路径深度解析 - 资讯焦点
  • 猫抓Cat-Catch技术解密:浏览器资源嗅探扩展的架构剖析与异步处理机制深度解析
  • 最新消息!2026年618专属国补全面爆发:31日至6月3日开启跳水模式,国补京东买手机、苹果、数码、家电领取教程汇总.照做能省出一台iPhone17 - 资讯焦点
  • 大模型时代模型注册已失效?2024最新AI工具整合框架(支持LoRA/Quant/Adapter多范式注册)
  • 量子热态制备:绝热演化与噪声鲁棒性研究
  • 从Gershgorin圆盘定理看矩阵的‘性格’:一个可视化理解特征值分布的趣味指南
  • 昆山装修公司售后服务哪家好?业主选公司的判断标准与参考 - 资讯焦点
  • 2026年广东不良资产律师及律师事务所综合推荐 债权债务处置与执行难题破解指南 - 资讯焦点
  • 基于透明OLED堆叠与SPI通信的体积显示器TENEX项目全解析
  • 量子强化学习与QMDP:动态电路与Grover算法应用
  • 基于NFP算法与遗传优化的矢量嵌套解决方案:工业制造材料利用率提升技术实践
  • 基于TTP223与Arduino的智能触摸灯:从电容感应原理到安全控制实践
  • 从农田到工厂:盘点那些正在落地的CV项目,给你的毕设找点“接地气”的灵感(含数据集获取)
  • 解决Linux内核模块依赖:从EXPORT_SYMBOL到Module.symvers的完整协作流程
  • 昆山装修公司设计风格选择多要看哪些维度 - 资讯焦点
  • ESP32入门实战:从按钮控制LED理解数字I/O与GPIO编程
  • 从‘移动一个方块’开始:用Blender 4.0 基础操作快速搭建你的第一个简易书架场景
  • 保姆级教程:在Win10/Linux上搞定GLIP(Swin-T)的编译与预测(避坑CUDA 11/12和PyTorch高版本)
  • UE4蓝图实战:5分钟搞定物体高亮轮廓线(附免费闪烁材质)
  • 昆山装修公司哪家比较靠谱?本地化交付能力是关键判断标准 - 资讯焦点