UE5 3D高斯渲染完整教程:3种实用方法实现高质量实时效果
2025/12/25 10:32:02
以下是一个ESP32-S3连接HC-SR04P超声波传感器和SG90舵机实现避障运动的完整代码:
#include<ESP32Servo.h>// 引脚定义constintTRIG_PIN=5;// HC-SR04P Trig引脚constintECHO_PIN=6;// HC-SR04P Echo引脚constintSERVO_PIN=7;// SG90舵机信号引脚// 避障参数constintOBSTACLE_DISTANCE=20;// 障碍物距离阈值(cm)constintMAX_DISTANCE=200;// 最大测量距离constintSERVO_CENTER=90;// 舵机中间位置constintSERVO_LEFT=150;// 舵机左转角度constintSERVO_RIGHT=30;// 舵机右转角度Servo myServo;// 舵机对象// 运动控制引脚定义(根据实际连接修改)constintMOTOR_A_IN1=8;constintMOTOR_A_IN2=9;constintMOTOR_B_IN3=10;constintMOTOR_B_IN4=11;voidsetup(){Serial.begin(115200);// 初始化超声波传感器pinMode(TRIG_PIN,OUTPUT);pinMode(ECHO_PIN,INPUT);// 初始化舵机myServo.attach(SERVO_PIN);myServo.write(SERVO_CENTER);// 舵机回中// 初始化电机驱动引脚pinMode(MOTOR_A_IN1,OUTPUT);pinMode(MOTOR_A_IN2,OUTPUT);pinMode(MOTOR_B_IN3,OUTPUT);pinMode(MOTOR_B_IN4,OUTPUT);delay(1000);Serial.println("系统初始化完成");}// 超声波测距函数floatgetDistance(){digitalWrite(TRIG_PIN,LOW);delayMicroseconds(2);digitalWrite(TRIG_PIN,HIGH);delayMicroseconds(10);digitalWrite(TRIG_PIN,LOW);longduration=pulseIn(ECHO_PIN,HIGH,30000);// 最大等待30msfloatdistance=duration*0.034/2;if(distance>MAX_DISTANCE||distance<=0){returnMAX_DISTANCE;}returndistance;}// 舵机扫描并获取指定方向距离floatscanDirection(intangle){myServo.write(angle);delay(300);// 等待舵机稳定floatdist=getDistance();delay(50);// 等待测量稳定returndist;}// 运动控制函数(需要根据实际硬件实现)voidforward(){Serial.println("前进");// 示例:直流电机控制digitalWrite(MOTOR_A_IN1,HIGH);digitalWrite(MOTOR_A_IN2,LOW);digitalWrite(MOTOR_B_IN3,HIGH);digitalWrite(MOTOR_B_IN4,LOW);}voidbackward(){Serial.println("后退");digitalWrite(MOTOR_A_IN1,LOW);digitalWrite(MOTOR_A_IN2,HIGH);digitalWrite(MOTOR_B_IN3,LOW);digitalWrite(MOTOR_B_IN4,HIGH);delay(500);// 后退固定时间stopMoving();}voidleft(){Serial.println("左转");// 差速左转digitalWrite(MOTOR_A_IN1,LOW);digitalWrite(MOTOR_A_IN2,HIGH);// 左轮后退digitalWrite(MOTOR_B_IN3,HIGH);// 右轮前进digitalWrite(MOTOR_B_IN4,LOW);delay(300);// 转向时间stopMoving();}voidright(){Serial.println("右转");// 差速右转digitalWrite(MOTOR_A_IN1,HIGH);// 左轮前进digitalWrite(MOTOR_A_IN2,LOW);digitalWrite(MOTOR_B_IN3,LOW);// 右轮后退digitalWrite(MOTOR_B_IN4,HIGH);delay(300);// 转向时间stopMoving();}voidstopMoving(){Serial.println("停止");digitalWrite(MOTOR_A_IN1,LOW);digitalWrite(MOTOR_A_IN2,LOW);digitalWrite(MOTOR_B_IN3,LOW);digitalWrite(MOTOR_B_IN4,LOW);}// 避障决策函数voidobstacleAvoidance(){// 1. 先测量正前方距离floatfrontDist=scanDirection(SERVO_CENTER);Serial.print("前方距离: ");Serial.print(frontDist);Serial.println(" cm");// 2. 如果前方无障碍if(frontDist>OBSTACLE_DISTANCE){myServo.write(SERVO_CENTER);// 舵机回中forward();delay(100);// 前进一段时间stopMoving();}// 3. 如果前方有障碍else{Serial.println("检测到障碍物,开始扫描...");stopMoving();backward();// 先后退一点// 扫描左侧floatleftDist=scanDirection(SERVO_LEFT);Serial.print("左侧距离: ");Serial.print(leftDist);Serial.println(" cm");delay(300);// 扫描右侧floatrightDist=scanDirection(SERVO_RIGHT);Serial.print("右侧距离: ");Serial.print(rightDist);Serial.println(" cm");delay(300);// 舵机回中myServo.write(SERVO_CENTER);// 决策逻辑if(leftDist>rightDist&&leftDist>OBSTACLE_DISTANCE){Serial.println("左侧空间更大,向左转");left();}elseif(rightDist>leftDist&&rightDist>OBSTACLE_DISTANCE){Serial.println("右侧空间更大,向右转");right();}else{Serial.println("两侧都有障碍,后退并旋转");backward();delay(300);// 随机选择方向旋转if(random(2)==0){left();}else{right();}}}}voidloop(){obstacleAvoidance();delay(100);// 循环延迟}// 可选:手动控制测试函数voidtestAllMovements(){Serial.println("测试所有运动...");forward();delay(1000);stopMoving();delay(500);backward();delay(1000);stopMoving();delay(500);left();delay(500);right();delay(500);Serial.println("测试完成");}电源管理:
参数调整:
OBSTACLE_DISTANCE阈值安装位置:
PWM引脚注意:
ESP32-S3的多数GPIO都支持PWM,但某些引脚可能有使用限制
实现了基本的避障逻辑:前进时检测障碍,遇到障碍后扫描左右两侧,选择更空旷的方向转向。你可以根据实际需求调整避障策略和运动参数。