Skip to content

Latest commit

 

History

97 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

视觉控制小车 · Vision-Sense Car

一套 AI 视觉 + 手机遥控 + 直驱运动控制 的智能小车工程:ESP32-S3-CAM 采集画面,板载直调云端多模态模型解析目标并生成控制指令,经软件 I2C 直接驱动哪吒扩展板的电机与舵机,手机 App 负责图传、操控与 AI 目标下发。

手机 App ──BLE 配网 / WiFi 图传+指令──▶ 视觉大脑板(ESP32-S3) ──软件 I2C──▶ 哪吒扩展板 ──▶ 电机/舵机/灯
        ◀──────────── WS 状态 / exec_status 上行 ────────────────┘

当前为开发进行中版本:BLE 配网、WS 指令/状态、UDP 图传、软件 I2C 直驱(四轮电机 / 四个舵机 / 三路灯光)均已接通可跑;板载 DIRECT AI(ai_goal)已实现,任务级闭环真机联调中。

⚠️ 本项目已取消独立的 STM32 执行板(原 Stm32-Executor/,因硬件问题裁撤),改由视觉板直驱。旧的 UART 帧协议与双板架构只存在于 git 历史。


1. 功能特性

  • 📷 实时图传:WiFi UDP 推流 JPEG 帧(低延迟、分片自愈),App 内查看画面并框选/标注目标。
  • 🎮 遥控操控:虚拟摇杆 + 指令面板,小车前进/后退/转向(可切换原地旋转式转向)、机械臂升降/移爪/夹爪、三路灯光开关、一键回正。
  • 🎯 指定点移动 / 插话:/move to <x> <y> [global](词表 goto)让板子自行导航到地面坐标;AI 任务进行中输入非空文本即为插话(ai_chat),补充要求而不打断闭环。
  • 🧠 板载 AI 视觉控制:手机下发文字/区域目标 → 板子直调云端多模态模型 → 指令 → 直驱落地(任务级迭代闭环,ai_goal / ai_oneshot)。板端维护画面标定(单应)+ 物体空间记忆 + 车姿态累积,并按需带上上一帧做运动对比。
  • 🧭 标定网格:图传可叠加标定网格(/grid),配合板端单应标定读屏幕 (u,v) 与实测地面距离取标定点。
  • 🦾 机械臂二连杆 IK:给末端目标位姿(轴前方 cm + 地面以上 cm),板载反解并联动左右两舵机。
  • 📶 BLE 一次性配网:App 扫描广播名 VisionS3 后写入 WiFi 账号,板子 NVS 存储、在线换网生效(不重启)。
  • 🧩 哪吒协议直驱:绕过任何执行板,软件 I2C 直接下发舵机 PWM / 电机 PWM / 灯光字节。

2. 系统架构

整体角色与通信链路如下(详见各子工程 CLAUDE.md):

┌────────────────────┐    ① BLE 配网 / 兜底控制(GATT,广播名 VisionS3)
│  手机 App           │ ◀───────────────────────────────────────┐
│ Mobile-RemoteCtrl  │   ② WiFi WebSocket(端口 81):           │
│  (Godot / Android) │      指令 JSON / 状态 / 消息(文本)        │
│                    │   ③ WiFi UDP:图传 JPEG 分片(二进制)      │
└────────────────────┘ ◀───────────────────────────────────────▶│
                                                                 ▼
┌──────────────────────────┐         ┌──────────────────────────────────────┐
│  云端多模态 AI             │ ④ai_goal │ 视觉/控制大脑板 Stm32-Vision           │
│  (DeepSeek 等,可配)       │ ────────▶│ ESP32-S3-CAM(N16R8) + OV3660         │
│                          │          │ 抓帧 · 图传 · 配网 · 词表分发          │
│                          │          │ 板载 AI 闭环 · exec 直驱执行层         │
└──────────────────────────┘          └────────────────┬─────────────────────┘
                                                       ⑤ 软件 I2C(SCL=GPIO47 / SDA=GPIO14)
                                                          从机 0x80,无 MCU 中转
                                                       ▼
                                       ┌──────────────────────────────────────────┐
                                       │ 哪吒(NeZha)扩展板                        │
                                       │ 4 路电机 PWM · 4 路舵机 PWM · 灯带          │
                                       │ → 4×N20 四轮 · 4×MG90S(转向+机械臂)        │
                                       └──────────────────────────────────────────┘
# 链路 说明
① BLE 手机 → 大脑板:一次性配网(WiFi SSID/密码、AI 接口参数)+ 兜底控制。连接后让出 2.4G 射频,断线自动恢复
② WiFi WebSocket 大脑板 ⇄ 手机:指令 JSON 下行 + status/ai_result/exec_status/log(调试)/state(查询回包)上行
③ WiFi UDP 大脑板 → 手机:JPEG 图传分片(每数据报 14B 大端头 + 载荷)
④ 云端 AI 大脑板 ⇄ 模型:DIRECT 直调(板子自己上传画面、解析指令、执行闭环)
⑤ 软件 I2C 大脑板 → 哪吒板:舵机/电机/灯光命令,本板即执行器

词表 JSON(CommandProto)只由手机 App 持有;「词表 → 哪吒 I2C 命令」的翻译在大脑板 command + direct_exec 模块。

软件构成

仓库目录 角色 语言 / 工具链 说明
Stm32-Vision/ 视觉大脑板 兼执行器 C++ · Arduino IDE / arduino-cli(esp32 core 3.3.x) 摄像头抓帧、WS/UDP 图传、BLE 配网、词表分发、板载 AI、软件 I2C 直驱
Mobile-RemoteCtrl/ 手机遥控 App GDScript · Godot 4.7.1 mono(Android) 三通道通信、虚拟摇杆、图传显示、图片标注、BLE 配网界面、聊天指令区

⚠️ 大脑板依赖自编译内核库(esp32 core 3.3.11,用 esp32-arduino-lib-builder 在 WSL 自编译后覆盖到 Arduino15): ① mbedTLS SSL 收发缓冲设 8192B(CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN / CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN),否则 AI 直连 TLS 握手因内部堆碎片化失败(-17040/-32512); ② lwIP TCP 缓冲上调(CONFIG_TCP_SND_BUF_DEFAULT=32768 / CONFIG_TCP_WND_DEFAULT=16384),否则 40KB 级请求体发送 write() 超时。

3. 硬件选型(BOM)

整车 = ESP32-S3-CAM 大脑板 + 淘宝现成的小车/机械臂套件(驱动板 + 骨架 + 电机 + 舵机 + 电池)。

3.1 部件清单

分类 部件 选型 / 规格 数量 作用与接入
视觉计算 视觉大脑板 ESP32-S3-CAM(N16R8):ESP32-S3 + 16MB Flash + 8MB PSRAM 1 抓帧/图传/配网/指令分发/板载 AI + 直驱执行器;camera.h 顶部 CAMERA_MODEL_ESP32S3_EYE
视觉计算 摄像头 OV3660(换装,非板载 OV2640) 1 画面采集;默认倒置与镜像已在 camera.cpp init 回正(画面所见即真实方位)
驱动 驱动板 哪吒(NeZha)扩展板,I2C 从机地址 0x80 1 4 路电机 PWM + 4 路舵机 PWM + 灯带;大脑板软件 I2C 直驱(SCL=GPIO47 / SDA=GPIO14)
执行机构 直流减速电机 N20 直流电机(四轮驱动,无编码器) 4 哪吒板 Motor1–4;轮位 M1 左后 / M2 右后 / M3 右前 / M4 左前
执行机构 舵机 MG90S 模拟舵机(180°,PWM 50..250) 4 哪吒板 Servo1=转向;Servo2=移爪 / Servo3=夹爪 / Servo4=抬落(机械臂)
结构 车轮 套件配套轮 4 装于四个 N20 电机
结构 车架 + 机械臂 套件骨架(小车底盘 + 3 自由度机械臂) 1 套 承载上述部件
供电 电池组 12V / 1200mAh 1 底盘动力与逻辑供电
连接 杜邦线 若干 — 哪吒板 ↔ 大脑板(I2C)、电机/舵机走线
紧固 螺丝螺帽 若干 — 结构装配

接线要点(大脑板 ↔ 哪吒扩展板)

信号 大脑板 GPIO 哪吒板
软件 I2C SCL GPIO47 SCL
软件 I2C SDA GPIO14 SDA
电源 5V / GND 5V / GND

⚠️ 无编码器 ⇒ 无里程计:直驱固件不做定距/定角闭环,move 的 distance_cm 与 spin 的 angle_deg 按实测标定表的时长近似到点自停(粗用,供微操/标定);arm 的 dist_cm 按「每 cm ≈ 固定拍数」近似。原执行板上的速度 PID、里程计、到位判定随执行板一并裁撤。

3.2 舵机 / 电机标定值(固件实测)

部件 值
转向 Servo1 150 正前 / 120 左死 / 180 右死
移爪 Servo2 中位 200,行程 120..250
夹爪 Servo3 夹紧 50 / 张开 140(中位即张开)
抬落 Servo4 中位 180,行程 115..250
机械臂几何 二连杆 L1=L2=7.5cm,肩轴离地 9.5cm,可达半径 4..15cm
灯光 前灯 / 氛围灯 / 尾灯(左右一起)

3.3 硬件配图

① 视觉大脑板 ESP32-S3-CAM

ESP32-S3-CAM 商品页截图

② 小车 / 机械臂套件(驱动板 + 骨架 + 电机 + 舵机)

小车机械臂套件商品页截图

4. 成品实拍(预留)

把整车/细节照片以对应文件名存入 docs/img/build/ 即替换占位。

整车正面(docs/img/build/car-front.png)

整车正面照(预留)

整车侧面(docs/img/build/car-side.png)

整车侧面照(预留)

内部走线 / 板载布置(docs/img/build/car-internal.png)

内部走线与板载布置(预留)

动作演示抓取(docs/img/build/car-action.png)

动作演示(预留)

App 界面(遥控 / 图传)(docs/img/build/app-screenshot.png)

App 截图(预留)

5. 部署与校准(装机后按实际重校)

固件内置的是默认出厂实测值;换镜头、移相机、换电机/舵机、改底盘后,以下几处手动校准需要重做。所有校准数据集中在 Stm32-Vision/Calibration.h(Calibration.cpp 提供机械臂散点接入),改完重新编译烧录即生效(数据只进 flash、不占运行内存),无需动其它源文件。

校准项 为什么需要手动校准 在哪改(Calibration.h)
画面坐标 ↔ 实际坐标映射 屏幕归一化像素 (u,v) 与车头系地面厘米依靠实测标定点拟合单应;相机角度/高度或换镜头都会变,标定不准会让 AI 的像素观测失真 kGroundCal:每行 {u, v, x右, y前},≥4 点、尽量覆盖整个屏幕
机械臂移动 机械臂夹心目标位姿(x,h) ⇄ 移爪/抬落两舵机 PWM 是非线性映射,靠实测散点做 IDW 插值;舵机压力/装配都会影响,错位或末端对不准要重测 kArmPts:每点 {移爪PWM, 抬落PWM, x车前, h离地};连续动作步长与定距在 ARM_STEP_CM、ARM_CNT_PER_CM
小车定距前进 电机无编码器,move distance_cm 只能按时长近似,需按油门实测车速与起停余量 MV_SPEED_X/Y、MV_COAST_X/Y(按油门插值表)
小车定角原地转向 同理,spin angle_deg 按时长近似,需按转速实测毫秒/度 SPIN_MSDEG_X/Y、必要时调整 SPIN_MIN_SPEED

🔧 校准提示

  • 舵机限位/回中也在此文件:STEER/REACH/GRIP/LIFT_*_CENTER/_LO/_HI,首次装机或换舵机后按实际行程复核。
  • 画面标定点:App 图传开 /grid 叠加网格,读网格交点屏幕坐标 (u,v),再用直尺/米测出对应地面 (x,y) 填入 kGroundCal。
  • 机械臂标定点:把臂摆到若干到位姿,记录两个舵机 PWM 与实测夹心 (x 车前、h 离地) 填入 kArmPts。
  • 定距/定角:让车前进设定距离、原地旋转设定角度,实测实际位移/转角,按油门/转速填 MV_* / SPIN_MSDEG_* 表。
  • 上表均有默认值可直接跑;仅当某处行为不对或硬件变更时才需重校。

6. 上手流程

  1. 烧录大脑板 → 上电后板子广播 BLE VisionS3。
  2. App 配网:连接该广播,写入 WiFi 账号密码与 AI 接口参数(URL/Key/模型)。
  3. 连上 WiFi:App 经 WebSocket(端口 81)取得指令/状态通道,按需开启图传(UDP)。
  4. 遥控:摇杆驱车(可在「关于」页切换为原地旋转式转向)、按钮控机械臂/灯光;或在聊天区直接输入文字下发 AI 目标。
  5. 调试:/log exec on 看板端状态推送与执行日志、/log ai on 看 AI 时序日志、/log all on 转发板端全部串口输出(聊天区内容统一落盘 user://logs/app.log)、/grid on 叠加图传标定网格。

主要面向本人维护迭代的工程文档;各子目录由各自仓库独立演进,本仓库为统一收纳视图。

About

手机app通过esp32 s3 cam向ai发送指令,ai根据画面来控制小车及机械臂运动以完成用户目标的项目。(目前仍在开发中)

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Contributors

Languages