跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

ESP32 + 大功率双向 ESC 机器人底盘动力控制方案

基于 ESP32 和大功率双向 ESC 的机器人底盘动力控制方案。方案利用 ESP32 的高算力处理复杂控制逻辑,通过双向 ESC 驱动 BLDC 电机,提供强劲动力、双向控制及再生制动功能。文章详细阐述了电源管理、EMC 抗干扰、散热设计等注意事项,并提供了 CAN 总线、UART、SPI 等多种通信协议的代码示例,涵盖基础 PWM 控制、PID 闭环速度控制及多电机差速转向。此外,还讨论了 OTA 升级、安全保护机制及 ESP32 双核优势利用,适用于重载 AGV、巡检机器人及科研竞赛平台。

JavaCoder发布于 2026/4/5更新于 2026/7/2262 浏览
ESP32 + 大功率双向 ESC 机器人底盘动力控制方案

基于 Arduino 的 BLDC 机器人底盘动力控制方案,采用 ESP32 作为主控并搭配大功率双向电子调速器(ESC),是一种面向高性能移动机器人的架构。该方案利用 ESP32 的高算力与丰富通信接口处理复杂的控制逻辑与传感器数据,通过大功率双向 ESC 驱动 BLDC 电机提供强劲且高效的驱动力。

主要特点

强劲动力与高效驱动

大功率双向 ESC 与 BLDC 电机的组合,为机器人提供了卓越的机动性与负载能力。

  • 高扭矩与大电流输出:大功率 ESC 通常支持 40A、60A 甚至更高的持续电流,能够驱动高 KV 值的无刷电机,为机器人底盘提供强大的起步扭矩和爬坡能力。
  • 双向控制:区别于仅支持单向旋转的普通 ESC,双向 ESC 允许电机正反转。这对于差速转向底盘至关重要,它使得机器人无需换挡即可实现前进、后退及原地转向,极大地提升了运动灵活性。
  • 再生制动:双向 ESC 支持将电机在减速或下坡时产生的动能转化为电能回馈至电池,不仅提高了系统整体能效,还提供了强大的电磁制动效果。

高性能主控与复杂算法处理

ESP32 凭借其 32 位双核处理器与丰富的外设资源,成为处理底盘控制算法的理想选择。

  • 高精度 PWM 信号生成:ESP32 具备多路高分辨率硬件定时器,可生成频率稳定、占空比精确的 PWM 信号,用于控制 ESC 的转速。
  • 实时闭环控制能力:ESP32 的高主频足以运行复杂的 PID 控制算法。它可实时读取编码器、IMU 等传感器数据,实现速度闭环、位置闭环等高级控制策略。
  • 多传感器数据融合:ESP32 强大的数据处理能力可对陀螺仪、加速度计、电流传感器等异构数据进行融合,实现更智能的运动控制。

丰富的通信与远程监控能力

ESP32 内置的无线通信模块为机器人提供了强大的连接性。

  • Wi-Fi 与蓝牙通信:利用 Wi-Fi,机器人可接入局域网或云端,实现远程遥控、实时视频传输或数据上报。
  • ESP-NOW 协议:这是一种低延迟的点对点通信协议。在多机器人协同或需要极低控制延迟的场景下,ESP-NOW 可以实现毫秒级数据传输。
  • OTA 在线升级:支持通过无线网络对 ESP32 进行固件更新,无需物理连接 USB 线,极大地方便了机器人的后期维护与功能迭代。

在这里插入图片描述

应用场景

  1. 重载工业 AGV/AMR:在仓储物流中心,该方案可驱动承载数百公斤货物的自动导引车。大功率电机确保机器人能稳定运输重物,ESP32 则负责处理导航算法及通信调度。
  2. 特种作业与排爆机器人:在消防、排爆等危险环境中,机器人需要具备强大的越障能力和可靠的远程控制。
  3. 大型户外巡检机器人:用于光伏电站、油田或农业大棚的巡检机器人,BLDC 电机的高效率延长了续航,ESP32 的无线通信保障了巡检数据的实时回传。
  4. 高校科研与竞赛平台:在大学生机器人大赛或科研项目中,该方案因其高性能、高开放性和低成本,成为验证先进控制算法的理想硬件平台。

注意事项

电源管理与功率去耦

  • 独立供电与共地:大功率电机启动瞬间会产生巨大的电流冲击,极易导致 ESP32 因电源电压跌落而复位。必须使用独立的电源模块为 ESP32 提供稳定的 3.3V/5V 逻辑电源,严禁直接使用电机电池供电。同时,逻辑地与电机地必须在电源端单点共地。
  • 大容量储能电容:在 ESC 的电源输入端必须并联大容量低 ESR 的电解电容或钽电容,以吸收电机换向时产生的反向电动势和电流尖峰。

电磁兼容(EMC)与信号抗干扰

  • 布线规范:强电(电机线、电池线)与弱电(ESP32 信号线、传感器线)必须分开走线,严禁平行走线,最好呈 90°垂直交叉。
  • 硬件滤波:在 ESP32 的 GPIO 输入引脚上串联小电阻并并联对地电容,构成硬件低通滤波器,滤除高频噪声干扰。
  • 隔离措施:在极端干扰环境下,可考虑使用光耦或磁耦隔离器件对控制信号进行隔离传输。

散热设计与硬件保护

  • ESC 与 MOSFET 散热:大功率 ESC 在持续大电流工作时发热量巨大。必须为其安装足够尺寸的散热片,必要时加装风扇进行强制风冷。
  • 软件保护机制:在 ESP32 程序中设置完善的保护逻辑,包括软件看门狗、电流异常检测、电压监测及紧急停止功能。

双向控制与死区处理

  • 信号映射与死区消除:双向 ESC 通常接受 1000μs-2000μs 的 PWM 信号,其中 1500μs 为中心点。在程序中需精确映射正反转的占空比范围,并设置合理的死区,防止在零速附近因信号微小抖动导致电机频繁启停。
  • 换向延时:在正反转切换瞬间,为防止 ESC 内部上下桥臂直通或电机产生巨大电流冲击,软件中应加入微小的延时,先将速度归零,再施加反向指令。

代码示例

1、ESP32 + 标准双向 ESC 的 CAN 总线控制

场景:中型机器人底盘,需要高功率和精确速度控制。核心逻辑:ESP32 通过 CAN 总线发送 DShot 协议指令,控制多个 ESC 同步。

#include <SimpleFOC.h>
#include <CAN.h>
#include <esp32-hal-timer.h>

// BLDC 电机对象
BLDCMotor motor1 = BLDCMotor(7);
BLDCMotor motor2 = BLDCMotor(7);

// ESC 参数
#define ESC_MIN_PULSE 1000
#define ESC_MAX_PULSE 2000
#define ESC_NEUTRAL 1500

// CAN ID
#define CAN_ID_ESC1 0x101
#define CAN_ID_ESC2 0x102

// DShot 协议参数
#define DSHOT_CMD_MOTOR_STOP 0
#define DSHOT_ESC_ARM 6

// CAN 总线设置
#define CAN_TX_PIN GPIO_NUM_5
#define CAN_RX_PIN GPIO_NUM_4

hw_timer_t* dshotTimer = NULL;
volatile uint32_t dshotPacket1 = 0;
volatile uint32_t dshotPacket2 = 0;

void setup() {
  Serial.begin(115200);
  // 1. CAN 总线初始化
  CAN.setPins(CAN_RX_PIN, CAN_TX_PIN);
  if (!CAN.begin(1000E3)) {
    Serial.println("CAN 初始化失败!");
    while (1);
  }
  Serial.println("CAN 总线就绪");
  
  // 2. 电机 FOC 初始化
  motor1.init();
  motor2.init();
  motor1.initFOC();
  motor2.initFOC();
  
  // 3. DShot 定时器初始化
  dshotTimer = timerBegin(0, 80, true);
  timerAttachInterrupt(dshotTimer, &dshotISR, true);
  timerAlarmWrite(dshotTimer, 5, true);
  timerAlarmEnable(dshotTimer);
  
  // 4. ESC 上电自检
  escArmSequence();
  Serial.println("系统初始化完成");
}

void loop() {
  float throttle = getThrottleInput();
  float steering = getSteeringInput();
  
  // 差速计算
  float leftPower = throttle + steering;
  float rightPower = throttle - steering;
  
  // 限制和死区处理
  leftPower = constrain(leftPower, -1.0, 1.0);
  rightPower = constrain(rightPower, -1.0, 1.0);
  if (abs(leftPower) < 0.05) leftPower = 0;
  if (abs(rightPower) < 0.05) rightPower = 0;
  
  // 转换为 ESC 指令
  uint16_t escCmd1 = powerToDshot(leftPower);
  uint16_t escCmd2 = powerToDshot(rightPower);
  
  // 发送 CAN 帧
  sendDshotOverCAN(CAN_ID_ESC1, escCmd1);
  sendDshotOverCAN(CAN_ID_ESC2, escCmd2);
  
  // 更新 FOC 内部状态
  motor1.move(leftPower);
  motor2.move(rightPower);
  
  // 读取 ESC 遥测数据
  if (CAN.parsePacket()) {
    processESCTelemetry(CAN.read());
  }
  delay(5); // 200Hz 控制频率
}

uint16_t powerToDshot(float power) {
  if (power == 0) return 0;
  uint16_t pulse = ESC_NEUTRAL + (int16_t)(power * 500);
  pulse = constrain(pulse, ESC_MIN_PULSE, ESC_MAX_PULSE);
  uint16_t dshotValue = map(pulse, ESC_MIN_PULSE, ESC_MAX_PULSE, 0, 2047);
  dshotValue = constrain(dshotValue, 48, 2047);
  return dshotValue;
}

void sendDshotOverCAN(uint32_t id, uint16_t command) {
  uint16_t packet = (command << 1) | 0x1;
  uint8_t crc = (packet ^ (packet >> 4) ^ (packet >> 8)) & 0x0F;
  uint16_t dshotPacket = (packet << 4) | crc;
  CAN.beginPacket(id, 2);
  CAN.write((uint8_t)(dshotPacket >> 8));
  CAN.write((uint8_t)(dshotPacket & 0xFF));
  CAN.endPacket();
}

void escArmSequence() {
  Serial.println("ESC 解锁中...");
  for (int i = 0; i < 3; i++) {
    sendDshotOverCAN(CAN_ID_ESC1, 0);
    sendDshotOverCAN(CAN_ID_ESC2, 0);
    delay(100);
  }
  sendDshotOverCAN(CAN_ID_ESC1, DSHOT_ESC_ARM);
  sendDshotOverCAN(CAN_ID_ESC2, DSHOT_ESC_ARM);
  delay(200);
  Serial.println("ESC 解锁完成");
}

void IRAM_ATTR dshotISR() {
  // DShot 时序生成
  static uint8_t bitCount = 0;
  // 实现 DShot600 时序
}

2、ESP32 + VESC 6.0 高性能 FOC 控制

场景:大功率机器人底盘,需要最高性能的 FOC 控制与能量回馈。核心逻辑:ESP32 通过 UART 与 VESC 通信,使用 VESC Tool 协议。

#include <SimpleFOC.h>
#include <VescUart.h>

VescUart vescLeft;
VescUart vescRight;

#define UART_LEFT_NUM UART_NUM_1
#define UART_RIGHT_NUM UART_NUM_2
#define UART_LEFT_TX 17
#define UART_LEFT_RX 16
#define UART_RIGHT_TX 5
#define UART_RIGHT_RX 4

struct VescTelemetry {
  float rpm;
  float current;
  float duty;
  float voltage;
  uint32_t tachometer;
};
VescTelemetry telemetryLeft, telemetryRight;

void setup() {
  Serial.begin(115200);
  vescLeft.setSerialPort(&Serial1);
  vescRight.setSerialPort(&Serial2);
  Serial1.begin(115200, SERIAL_8N1, UART_LEFT_RX, UART_LEFT_TX);
  Serial2.begin(115200, SERIAL_8N1, UART_RIGHT_RX, UART_RIGHT_TX);
  
  delay(1000);
  setVescMode(VESC_MODE_CURRENT, 30.0);
  ledcSetup(0, 500, 8);
  ledcAttachPin(25, 0);
  startSafetyMonitor();
  Serial.println("VESC 6.0 动力系统就绪");
}

void loop() {
  static uint32_t lastControlTime = 0;
  uint32_t now = millis();
  
  if (now - lastControlTime >= 50) {
    float throttle = getThrottleCommand();
    float steering = getSteeringCommand();
    float leftCurrent = throttle + steering;
    float rightCurrent = throttle - steering;
    
    leftCurrent = constrain(leftCurrent, -30.0, 30.0);
    rightCurrent = constrain(rightCurrent, -30.0, 30.0);
    
    vescLeft.setCurrent(leftCurrent);
    vescRight.setCurrent(rightCurrent);
    lastControlTime = now;
  }
  
  handleRegenerativeBraking();
  monitorSafety();
}

void setVescMode(uint8_t mode, float limit) {
  switch(mode) {
    case VESC_MODE_CURRENT:
      break;
    case VESC_MODE_DUTY:
      break;
    case VESC_MODE_RPM:
      break;
  }
}

void handleRegenerativeBraking() {
  if (telemetryLeft.rpm > 100 && telemetryLeft.current < -2.0) {
    float brakePower = abs(telemetryLeft.current) * telemetryLeft.voltage;
    if (brakePower > 50.0) {
      vescLeft.setCurrent(-5.0);
    }
  }
}

void monitorSafety() {
  if (telemetryLeft.voltage < 20.0 || telemetryRight.voltage < 20.0) {
    emergencyShutdown("电池电压过低!");
  }
  if (abs(telemetryLeft.current) > 35.0 || abs(telemetryRight.current) > 35.0) {
    emergencyShutdown("电流过载!");
  }
}

3、ESP32 + 多 ESC 同步的 SWD 调试与 OTA 升级

场景:四轮全向移动机器人,需要精确同步和远程维护。核心逻辑:ESP32 通过 SPI 控制多个 ESC,集成 SWD 调试和 OTA 功能。

#include <SimpleFOC.h>
#include <Update.h>
#include <WiFi.h>
#include <WebServer.h>

BLDCMotor motorFL, motorFR, motorRL, motorRR;

#define ESC_SPI_HOST SPI2_HOST
#define ESC_SPI_MISO 19
#define ESC_SPI_MOSI 23
#define ESC_SPI_SCLK 18
#define ESC_CS1_PIN 15
#define ESC_CS2_PIN 2
#define ESC_CS3_PIN 4
#define ESC_CS4_PIN 5

spi_device_handle_t esc_spi;

WebServer server(80);
const char* ssid = "Robot_AP";
const char* password = "robot1234";

struct SyncControl {
  float targetSpeed[4];
  float actualSpeed[4];
  uint32_t syncCounter;
  bool syncEnabled;
};
SyncControl syncCtrl;

void setup() {
  Serial.begin(115200);
  spi_bus_config_t buscfg = {
    .mosi_io_num = ESC_SPI_MOSI,
    .miso_io_num = ESC_SPI_MISO,
    .sclk_io_num = ESC_SPI_SCLK,
    .max_transfer_sz = 4096
  };
  spi_bus_initialize(ESC_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO);
  
  initESCDevice(ESC_CS1_PIN, 0);
  initESCDevice(ESC_CS2_PIN, 1);
  initESCDevice(ESC_CS3_PIN, 2);
  initESCDevice(ESC_CS4_PIN, 3);
  
  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP: ");
  Serial.println(IP);
  server.on("/", handleRoot);
  server.on("/update", HTTP_POST, handleUpdate, handleUpload);
  server.begin();
  
  syncCtrl.syncEnabled = true;
  startSyncTimer();
  Serial.println("多 ESC 同步系统就绪");
}

void loop() {
  server.handleClient();
  if (readControlInput()) {
    calculateMecanumKinematics();
    if (syncCtrl.syncEnabled) synchronizeESCs();
    sendSPICommands();
    readTelemetrySPI();
  }
  monitorSystem();
}

void synchronizeESCs() {
  static uint32_t lastSync = 0;
  uint32_t now = micros();
  float dt = (now - lastSync) / 1e6;
  if (dt >= 0.01) {
    float speedErrors[4];
    for (int i = 0; i < 4; i++) {
      speedErrors[i] = syncCtrl.targetSpeed[i] - syncCtrl.actualSpeed[i];
    }
    float avgError = (speedErrors[0] + speedErrors[1] + speedErrors[2] + speedErrors[3]) / 4.0;
    for (int i = 0; i < 4; i++) {
      syncCtrl.targetSpeed[i] += (avgError - speedErrors[i]) * 0.1;
    }
    lastSync = now;
    syncCtrl.syncCounter++;
  }
}

void handleUpdate() {
  HTTPUpload& upload = server.upload();
  if (upload.status == UPLOAD_FILE_START) {
    Serial.printf("更新开始:%s\n", upload.filename.c_str());
    if (!Update.begin(UPDATE_SIZE_UNKNOWN)) {
      Update.printError(Serial);
    }
  } else if (upload.status == UPLOAD_FILE_WRITE) {
    if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
      Update.printError(Serial);
    }
  } else if (upload.status == UPLOAD_FILE_END) {
    if (Update.end(true)) {
      Serial.printf("更新成功:%u 字节\n", upload.totalSize);
      server.send(200, "text/plain", "更新成功,系统将重启");
      delay(1000);
      ESP.restart();
    } else {
      Update.printError(Serial);
    }
  }
}

4、基础双向 ESC 控制(PWM 信号)

功能:通过 ESP32 的 PWM 控制大功率双向 ESC,实现机器人底盘的正反转、加速/减速及停止。

#include <Arduino.h>
#include <driver/timer.h>

#define ESC_PIN 23
#define PWM_FREQ 50

void setup() {
  Serial.begin(115200);
  ledcSetup(0, PWM_FREQ, 10);
  ledcAttachPin(ESC_PIN, 0);
  
  Serial.println("ESC Calibration Start...");
  ledcWrite(0, 512); // 最大油门
  delay(2000);
  ledcWrite(0, 102); // 最小油门
  delay(2000);
  Serial.println("Calibration Done!");
}

void loop() {
  // 正转
  for (int i = 102; i <= 512; i += 10) {
    ledcWrite(0, i);
    delay(100);
  }
  // 停止
  ledcWrite(0, 306);
  delay(1000);
  // 反转
  for (int i = 306; i >= 102; i -= 10) {
    ledcWrite(0, i);
    delay(100);
  }
}

5、基于编码器的闭环速度控制(PID)

功能:通过编码器反馈实现电机速度闭环控制,解决大功率电机启动冲击问题。

#include <Encoder.h>
#include <PID_v1.h>

#define MOTOR_PWM_PIN 23
#define ENCODER_PIN_A 16
#define ENCODER_PIN_B 17

Encoder enc(ENCODER_PIN_A, ENCODER_PIN_B);
double setpoint = 1000;
double input, output;
PID pid(&input, &output, &setpoint, 2.0, 0.5, 0.1, DIRECT);

void setup() {
  Serial.begin(115200);
  pinMode(MOTOR_PWM_PIN, OUTPUT);
  pid.SetMode(AUTOMATIC);
  pid.SetOutputLimits(-1023, 1023);
}

void loop() {
  long encValue = enc.read();
  input = (encValue / 20.0) * 60.0;
  pid.Compute();
  int pwmValue = (int)output;
  
  if (pwmValue > 0) {
    ledcWrite(0, map(pwmValue, 0, 1023, 306, 512));
  } else {
    ledcWrite(0, map(abs(pwmValue), 0, 1023, 306, 102));
  }
  delay(100);
}

6、多电机差速转向控制(机器人底盘运动)

功能:通过双电机差速实现机器人底盘的前进、后退、转向及原地旋转。

#include <Encoder.h>

#define ESC1_PIN 23
#define ESC2_PIN 22

Encoder enc1(16, 17);
Encoder enc2(4, 5);

void setMotorSpeed(int motor, int speed) {
  int pwmValue = map(speed, -100, 100, 102, 512);
  if (motor == 1) {
    ledcWrite(0, pwmValue);
  } else {
    ledcWrite(1, pwmValue);
  }
}

void moveRobot(float linearVel, float angularVel) {
  float leftSpeed = (linearVel - (angularVel * 0.5)) / 0.1;
  float rightSpeed = (linearVel + (angularVel * 0.5)) / 0.1;
  setMotorSpeed(1, leftSpeed);
  setMotorSpeed(2, rightSpeed);
}

void setup() {
  ledcSetup(0, 50, 10);
  ledcSetup(1, 50, 10);
  ledcAttachPin(ESC1_PIN, 0);
  ledcAttachPin(ESC2_PIN, 1);
}

void loop() {
  moveRobot(0.5, 0);
  delay(1000);
  moveRobot(0, 1.0);
  delay(500);
  moveRobot(0, 0);
  delay(1000);
}

要点解读

  1. 通信协议的选择决定系统性能上限

    • CAN 总线:工业级可靠性,支持多节点同步,1Mbps 速率满足实时控制。DShot over CAN 是高端 ESC 的常见配置。
    • UART:VESC 标准协议,带宽足够,提供丰富的遥测和配置参数。
    • SPI:最高速率,可实现微秒级同步,适合多 ESC 精确协同,但布线要求高。
  2. ESC 的配置模式与控制策略

    • DShot 数字协议:替代传统 PWM,抗干扰强,分辨率高,支持遥测请求。
    • VESC 的电流控制模式:最精确的扭矩控制,直接控制相电流。
    • 同步控制必要性:多 ESC 的毫秒级不同步会导致底盘'扭动'。通过交叉耦合补偿算法,让多个 ESC 的速度误差相互补偿。
  3. 大功率系统的安全与保护

    • 电流限制:必须硬件(保险丝、断路器)和软件双重保护。
    • 能量回馈处理:双向 ESC 在减速时会将动能转化为电能回充电池,必须限制回馈电流,防止电池过充。
    • 温度监控:大功率 ESC 的 MOSFET 温度需实时监控,超过 85°C 应降额运行。
  4. ESP32 的双核优势利用

    • Core 0:运行控制循环(FOC 算法、运动学计算),必须保证实时性。
    • Core 1:处理 WiFi、OTA、HTTP 服务器等非实时任务。
  5. 系统集成与远程维护

    • OTA 升级:实现完整的 Web 端固件更新,这对于现场部署的机器人至关重要。
    • SWD 调试接口:通过 ESP32 的 JTAG 引脚可连接外部调试器,实现实时变量查看。

在这里插入图片描述

目录

  1. 主要特点
  2. 强劲动力与高效驱动
  3. 高性能主控与复杂算法处理
  4. 丰富的通信与远程监控能力
  5. 应用场景
  6. 注意事项
  7. 电源管理与功率去耦
  8. 电磁兼容(EMC)与信号抗干扰
  9. 散热设计与硬件保护
  10. 双向控制与死区处理
  11. 代码示例
  12. 1、ESP32 + 标准双向 ESC 的 CAN 总线控制
  13. 2、ESP32 + VESC 6.0 高性能 FOC 控制
  14. 3、ESP32 + 多 ESC 同步的 SWD 调试与 OTA 升级
  15. 4、基础双向 ESC 控制(PWM 信号)
  16. 5、基于编码器的闭环速度控制(PID)
  17. 6、多电机差速转向控制(机器人底盘运动)
  18. 要点解读
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Ubuntu 安装 Codex CLI 及 IDE 插件报 403 Forbidden 错误排查指南
  • 用 Java for 循环快速验证算法原型:3 个实用案例
  • VSCode 扩展工具 Copilot MCP 使用教程
  • C++ 二叉搜索树基础实现:增删查改详解
  • 前端模块化开发:从面条代码到结构化代码
  • C语言常用算法与数据结构基础
  • 使用 cpolar 内网穿透实现 OpenClaw 公网远程访问
  • 基于 OpenClaw 与 Claude 的自动化写作工作流搭建
  • C++ 虚函数表与虚指针详解
  • ASP.NET 图片上传与缩略图生成实战
  • Spring Bean 的作用域
  • VSCode + GitHub Copilot AI 编程实战指南
  • Python 机器学习:基于逻辑回归和决策树的寿险续保预测
  • 空洞卷积(Dilated Convolution)原理与基础架构解析
  • 华为云 DeepSeek 大模型部署与 Dify 实时翻译助手实战
  • SVD 奇异值分解原理、推导及应用实例
  • 2026 年前端、后端及算法岗位 AI 技能清单
  • LangChain 快速入门指南:从基础组件到服务部署
  • 在C语言中连接MySQL:用户创建、权限配置与查询示例
  • Layui 框架下 Unity WebGL Tab 切换黑屏解决方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online