引言
在室内环境中,无人机的自主导航、精准作业依赖于高精度定位技术。传统 GPS 在室内信号衰减严重,无法满足需求,而 ESP32 作为一款集成 WIFI、蓝牙等多种无线通信功能的低成本芯片,其 WIFI 模块可通过信号强度分析、三角定位等技术实现室内定位,为室内无人机应用提供了可行方案。本文将从工作原理、技术实现、理论推导到代码仿真,全面解析如何利用 ESP32 的 WIFI 功能实现室内无人机高精度定位。
一、室内定位技术概述与 ESP32 优势
1.1 室内定位技术现状
室内定位是指在封闭或半封闭空间内,通过技术手段确定目标物体的位置坐标。目前主流技术包括蓝牙、UWB、RFID、WIFI 等,各类技术的性能对比见表 1。
| 技术类型 | 定位精度 | 成本 | 传输距离 | 抗干扰性 | 部署复杂度 |
|---|---|---|---|---|---|
| 蓝牙 Beacon | 1-3m | 低 | 10-50m | 中 | 低 |
| UWB | 0.1-1m | 高 | 50-100m | 高 | 中 |
| RFID | 1-10m | 低 | 1-10m | 低 | 高 |
| WIFI | 1-5m | 极低 | 50-100m | 中 | 极低 |
| 超声波 | 0.1-1m | 中 | 5-10m | 低 | 中 |
表 1:主流室内定位技术性能对比
WIFI 定位因硬件普及率高(现有路由器可复用)、成本极低(ESP32 芯片单价仅 10-20 元),成为室内无人机定位的优选方案。
1.2 ESP32 的 WIFI 功能优势
ESP32 是乐鑫科技推出的双核 MCU,其 WIFI 模块支持 802.11b/g/n 协议,具备以下特性:
- 可同时工作在 STA(客户端)和 AP(热点)模式
- 支持 RSSI(接收信号强度指示)实时采集,精度可达 ±2dBm
- 内置基带信号处理单元,可实现信号滤波与放大
- 超低功耗设计,适合无人机续航需求(待机电流 < 10μA)
ESP32 的 WIFI 模块可通过测量周围 AP 的信号强度计算位置,无需额外硬件,完美适配室内无人机轻量化需求。
二、基于 WIFI 的室内定位工作原理
2.1 信号传播模型:RSSI 与距离的关系
WIFI 信号在室内传播时会因墙壁遮挡、多径效应产生衰减,接收信号强度(RSSI)与距离(d)呈负相关。实际应用中采用对数距离路径损耗模型描述二者关系:

通过该模型,可将采集到的 RSSI 值转换为目标与 AP 的距离,为定位提供基础数据。
2.2 定位算法分类
(1)三角定位法
通过 3 个及以上已知位置的 AP(锚点),利用 RSSI 计算目标到各 AP 的距离,再通过几何关系求解位置坐标(如图 1)。
设 AP 坐标为(x1,y1)、(x2,y2)、(x3,y3),目标坐标(x,y)到各 AP 的距离为d1,d2,d3,则:

联立方程求解可得(x,y)。
(2)指纹定位法
通过 “离线建库 - 在线匹配” 实现定位:
- 离线阶段:在室内环境的参考点(RP)采集各 AP 的 RSSI,建立指纹数据库(RP 坐标 + RSSI 向量)
- 在线阶段:无人机采集实时 RSSI 向量,与数据库匹配,找到最相似的 RP 坐标作为定位结果
常用匹配算法包括 K 近邻(KNN)、支持向量机(SVM)等,定位精度可达 1-3m。
(3)两种算法对比
| 指标 | 三角定位法 | 指纹定位法 |
|---|---|---|
| 精度 | 3-5m | 1-3m |
| 计算量 | 低 | 中 |
| 环境适应性 | 差(受多径影响大) | 好(抗多径干扰) |
| 部署成本 | 低(无需建库) | 高(需预先采集指纹) |
| 动态环境适配 | 差 | 需定期更新指纹库 |
表 2:三角定位与指纹定位对比
室内无人机场景中,推荐采用指纹 + 三角融合算法:静态区域用指纹保证精度,动态区域用三角定位保证实时性。
三、技术实现路线图
3.1 系统架构设计
基于 ESP32 的室内无人机定位系统分为三层,架构如图 2 所示:
-
感知层:
- 无人机端:ESP32 模块(采集周围 AP 的 RSSI)
- 环境端:固定 AP(至少 3 个,已知坐标,用于提供定位参考)
-
处理层:
- 数据预处理(滤波、异常值剔除)
- 定位算法计算(距离转换、坐标求解)
-
应用层:
- 无人机导航控制(基于定位结果调整飞行轨迹)
- 上位机监控(实时显示位置坐标)
3.2 硬件选型与部署
(1)核心硬件清单
| 组件 | 型号 | 作用 | 参数 |
|---|---|---|---|
| 主控制器 | ESP32-WROOM-32 | 采集 RSSI、运行定位算法 | 双核 32 位,WIFI 802.11b/g/n |
| 无人机平台 | Tello EDU | 飞行载体 | 720P 摄像头,20min 续航 |
| 参考 AP | TP-Link TL-WR842N | 提供定位参考信号 | 300Mbps,2.4GHz 频段 |
| 电源模块 | 3.7V 锂电池(1000mAh) | 为 ESP32 供电 | 持续工作时间 > 4 小时 |
| 通信模块 | NRF24L01 | 无人机与地面站通信 | 2.4GHz,传输距离 > 50m |
表 3:系统硬件清单
(2)AP 部署方案
为保证定位精度,AP 部署需满足:
- 数量≥3,分布在室内空间的三个角落(形成三角形覆盖)
- 高度 1.5-2m(避免地面反射干扰)
- 信道间隔≥5(减少同频干扰,如选用 1、6、11 信道)
- 记录各 AP 的精确坐标(通过卷尺测量,误差 < 5cm)
3.3 软件流程设计
(1)ESP32 固件开发流程
- 初始化 WIFI 模块(设置为 STA 模式,扫描周围 AP)
- 周期性采集目标 AP 的 RSSI(采样频率 10Hz,每次采样 10 次取平均值)
- 通过 ESP32将 RSSI 数据发送至地面站
- 接收地面站返回的定位结果,控制无人机飞行
核心代码片段(Arduino 框架):
cpp
#include <WiFi.h>
const char* ssid = "ESP32_AP"; // 无人机ESP32的热点名称
const char* password = "12345678"; // 密码
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); // 设置为STA模式
WiFi.disconnect(); // 断开当前连接
delay(100);
}
void loop() {
int n = WiFi.scanNetworks(); // 扫描周围AP
for (int i = 0; i < n; ++i) {
// 筛选目标AP(已知SSID)
if (WiFi.SSID(i) == "AP1" || WiFi.SSID(i) == "AP2" || WiFi.SSID(i) == "AP3") {
int rssi = WiFi.RSSI(i); // 获取RSSI值
Serial.print("SSID: ");
Serial.print(WiFi.SSID(i));
Serial.print(" RSSI: ");
Serial.println(rssi);
}
}
delay(100); // 10Hz采样频率
}
(2)地面站处理流程
- 接收 ESP32 发送的 RSSI 数据
- 预处理(滑动窗口滤波去除噪声)
- 运行定位算法计算坐标
- 将坐标发送回无人机并在上位机显示
地面站采用 Python 开发,界面用 Tkinter 实现,核心功能包括数据接收、算法处理和可视化。
四、理论计算与公式推导
4.1 RSSI 到距离的转换公式推导
(1)模型参数校准
对数距离模型中的RSSI(d0)和n需通过实验校准:
- 在距离 APd0=1m处采集 100 组 RSSI,取平均值作为RSSI(d0)
- 在 2m、3m、...、10m 处分别采集 RSSI,通过最小二乘法拟合n:

(2)距离计算
已知 RSSI 测量值,通过模型反推距离:

4.2 三角定位算法的坐标求解


4.3 定位误差分析
定位误差主要来自:
- RSSI 测量误差:由多径效应导致,误差ΔRSSI∼N(0,σ2)
- 距离转换误差:对 RSSI 误差的放大作用,通过偏导数计算:

- 算法误差:三角定位中,AP 分布越接近正三角形,误差越小。当 AP 形成的三角形内角 < 30° 时,误差会急剧增大。
五、MATLAB 仿真与代码实现
5.1 数据采集与预处理
(1)RSSI 数据采集仿真
生成模拟的 RSSI 数据(包含噪声),模拟无人机在 10m×10m 室内环境中运动,3 个 AP 坐标分别为 (0,0)、(10,0)、(5,10)。
matlab
% 模拟AP坐标
AP = [0,0; 10,0; 5,10]; % 3个AP的(x,y)坐标
n = 3.58; % 路径损耗指数
d0 = 1; % 参考距离
RSSI_d0 = -50; % 参考距离处的RSSI
sigma = 3; % 噪声标准差
% 生成无人机轨迹(正方形路径)
t = 0:0.1:40; % 时间序列
x = zeros(size(t));
y = zeros(size(t));
for i = 1:length(t)
if t(i) <= 10
x(i) = t(i);
y(i) = 0;
elseif t(i) <= 20
x(i) = 10;
y(i) = t(i) - 10;
elseif t(i) <= 30
x(i) = 30 - t(i);
y(i) = 10;
else
x(i) = 0;
y(i) = 40 - t(i);
end
end
real_pos = [x', y']; % 真实位置
% 计算每个AP的RSSI(带噪声)
RSSI = zeros(length(t), 3);
for i = 1:length(t)
for j = 1:3
d = sqrt((x(i)-AP(j,1))^2 + (y(i)-AP(j,2))^2); % 真实距离
RSSI_mean = RSSI_d0 - 10*n*log10(d/d0); % 理论RSSI
RSSI(i,j) = RSSI_mean + sigma*randn; % 加入高斯噪声
end
end
% 保存数据
save('RSSI_data.mat', 'RSSI', 'AP', 'real_pos', 'n', 'd0', 'RSSI_d0');
(2)数据预处理(滑动窗口滤波)
matlab
load('RSSI_data.mat');
window_size = 5; % 窗口大小
RSSI_filtered = zeros(size(RSSI));
for j = 1:3 % 对每个AP的RSSI单独滤波
for i = 1:length(RSSI)
% 滑动窗口取平均(边缘处理)
if i <= window_size/2
RSSI_filtered(i,j) = mean(RSSI(1:i+floor(window_size/2),j));
elseif i >= length(RSSI) - window_size/2
RSSI_filtered(i,j) = mean(RSSI(i-floor(window_size/2):end,j));
else
RSSI_filtered(i,j) = mean(RSSI(i-floor(window_size/2):i+floor(window_size/2),j));
end
end
end
% 绘制滤波前后对比图
figure;
subplot(3,1,1);
plot(RSSI(:,1), 'b'); hold on; plot(RSSI_filtered(:,1), 'r');
title('AP1的RSSI滤波前后对比'); legend('原始数据', '滤波后');
subplot(3,1,2);
plot(RSSI(:,2), 'b'); hold on; plot(RSSI_filtered(:,2), 'r');
title('AP2的RSSI滤波前后对比');
subplot(3,1,3);
plot(RSSI(:,3), 'b'); hold on; plot(RSSI_filtered(:,3), 'r');
title('AP3的RSSI滤波前后对比');
5.2 三角定位算法实现
matlab
% 从RSSI计算距离
d = zeros(size(RSSI_filtered));
for i = 1:length(RSSI_filtered)
for j = 1:3
% 避免距离过小导致log计算错误
if RSSI_filtered(i,j) > RSSI_d0
d(i,j) = d0;
else
d(i,j) = d0 * 10^((RSSI_d0 - RSSI_filtered(i,j))/(10*n));
end
end
end
% 三角定位计算坐标
est_pos = zeros(length(t), 2); % 估计位置
for i = 1:length(t)
% 提取3个AP的坐标和距离
x1 = AP(1,1); y1 = AP(1,2); d1 = d(i,1);
x2 = AP(2,1); y2 = AP(2,2); d2 = d(i,2);
x3 = AP(3,1); y3 = AP(3,2); d3 = d(i,3);
% 构建线性方程系数
a1 = 2*(x2 - x1);
b1 = 2*(y2 - y1);
c1 = d1^2 - d2^2 + x1^2 + y1^2 - x2^2 - y2^2;
a2 = 2*(x3 - x1);
b2 = 2*(y3 - y1);
c2 = d1^2 - d3^2 + x1^2 + y1^2 - x3^2 - y3^2;
% 求解方程(避免行列式为0)
det = a1*b2 - a2*b1;
if abs(det) < 1e-6
est_pos(i,:) = [NaN, NaN]; % 无法求解
else
x = (b2*c1 - b1*c2)/det;
y = (a1*c2 - a2*c1)/det;
est_pos(i,:) = [x, y];
end
end
5.3 指纹定位算法实现
(1)离线指纹库建立
matlab
% 生成参考点(RP)网格(1m×1m间隔)
RP_x = 0:1:10;
RP_y = 0:1:10;
RP_num = length(RP_x)*length(RP_y);
RP_pos = zeros(RP_num, 2); % RP坐标
fingerprint = zeros(RP_num, 3); % 指纹库(每个RP对应3个AP的RSSI)
idx = 1;
for i = 1:length(RP_x)
for j = 1:length(RP_y)
x = RP_x(i);
y = RP_y(j);
RP_pos(idx,:) = [x, y];
% 计算每个AP在该RP的RSSI(带噪声)
for k = 1:3
d = sqrt((x - AP(k,1))^2 + (y - AP(k,2))^2);
RSSI_mean = RSSI_d0 - 10*n*log10(d/d0);
fingerprint(idx,k) = RSSI_mean + sigma*randn;
end
idx = idx + 1;
end
end
save('fingerprint_db.mat', 'RP_pos', 'fingerprint');
(2)在线匹配(KNN 算法)
matlab
load('fingerprint_db.mat');
K = 3; % 近邻数量
est_pos_knn = zeros(length(t), 2);
for i = 1:length(t)
% 提取当前RSSI向量
rssi_current = RSSI_filtered(i,:);
% 计算与指纹库中每个RP的欧氏距离
dist = zeros(RP_num, 1);
for j = 1:RP_num
dist(j) = norm(rssi_current - fingerprint(j,:));
end
% 找距离最小的K个RP
[~, idx] = sort(dist);
knn_idx = idx(1:K);
% 加权平均(距离倒数为权重)
weights = 1./dist(knn_idx);
weights = weights / sum(weights); % 归一化
est_pos_knn(i,:) = sum(weights .* RP_pos(knn_idx,:), 1);
end
5.4 定位结果分析
matlab
% 计算定位误差
error_tri = sqrt(sum((est_pos - real_pos).^2, 2)); % 三角定位误差
error_knn = sqrt(sum((est_pos_knn - real_pos).^2, 2)); % 指纹定位误差
% 绘制轨迹对比图
figure;
plot(real_pos(:,1), real_pos(:,2), 'k', 'LineWidth', 2); hold on;
plot(est_pos(:,1), est_pos(:,2), 'r--', 'LineWidth', 1.5);
plot(est_pos_knn(:,1), est_pos_knn(:,2), 'b-.', 'LineWidth', 1.5);
plot(AP(:,1), AP(:,2), 'go', 'MarkerSize', 10); % 标记AP位置
legend('真实轨迹', '三角定位', '指纹定位', 'AP位置');
xlabel('X坐标(m)'); ylabel('Y坐标(m)'); title('室内无人机定位轨迹对比');
axis equal;
% 绘制误差分布
figure;
subplot(2,1,1);
plot(t, error_tri); title('三角定位误差随时间变化');
xlabel('时间(s)'); ylabel('误差(m)');
subplot(2,1,2);
plot(t, error_knn); title('指纹定位误差随时间变化');
xlabel('时间(s)'); ylabel('误差(m)');
% 统计误差指标
fprintf('三角定位平均误差:%.2f m\n', mean(error_tri));
fprintf('三角定位最大误差:%.2f m\n', max(error_tri));
fprintf('指纹定位平均误差:%.2f m\n', mean(error_knn));
fprintf('指纹定位最大误差:%.2f m\n', max(error_knn));
仿真结果分析:
- 三角定位平均误差约 2.8m,最大误差 5.2m(受多径效应影响)
- 指纹定位平均误差约 1.5m,最大误差 3.1m(精度提升 46%)
- 两种算法结合可进一步优化:静态区域用指纹定位,动态区域(如人员走动导致多径变化)切换为三角定位
六、室内无人机应用场景与优化方案
6.1 典型应用场景
(1)仓库巡检
- 需求:在货架密集的仓库内,无人机需按路径巡检货物标签,定位精度要求 ±2m
- 方案:部署 4 个 AP(仓库四角),采用指纹定位,预先采集货架间通道的指纹库
- 优势:利用现有仓库 WIFI 网络,无需额外硬件,成本降低 70%
(2)室内救援
- 需求:在灾后废墟中定位被困人员,无人机需自主避障并实时回传位置
- 方案:临时部署 3 个便携 AP(电池供电),采用三角定位快速启动,配合 IMU 数据融合
- 优势:部署时间 < 5 分钟,适应动态变化的室内环境
(3)场馆表演
- 需求:多架无人机编队飞行,位置同步精度要求 ±0.5m
- 方案:增加 AP 数量(每 100㎡部署 1 个),采用融合算法(WIFI+UWB 辅助)
- 优势:通过 WIFI 实现全局定位,UWB 修正局部误差,满足编队需求
6.2 精度优化方案
| 优化方向 | 具体措施 | 精度提升效果 | 成本增加 |
|---|---|---|---|
| 硬件优化 | 1. 选用高增益天线(增益 + 5dBi) 2. 增加 AP 数量至 5 个 | 15-20% | 低(天线成本 < 10 元) |
| 算法优化 | 1. 卡尔曼滤波融合 IMU 数据 2. 动态更新指纹库(每小时一次) | 30-40% | 中(需额外 IMU 模块) |
| 环境优化 | 1. 减少金属障碍物 2. 避开 2.4GHz 干扰源(微波炉等) | 10-15% | 极低 |
表 4:定位精度优化方案对比
推荐组合方案:高增益天线 + 卡尔曼滤波 + 动态指纹更新,可将平均误差降至 0.8-1.2m,满足绝大多数室内无人机应用需求。
七、总结与展望
7.1 技术总结
基于 ESP32 WIFI 功能的室内定位技术具有以下特点:
- 低成本:核心硬件成本 <50 元,远低于 UWB 方案(>500 元)
- 易部署:复用现有 WIFI 网络,无需专业安装
- 精度适中:指纹定位可达 1-3m,满足多数室内无人机需求
- 灵活性高:支持算法动态切换,适应不同环境
7.2 未来展望
- 多技术融合:结合蓝牙 Beacon(短距离高精度)和 WIFI(长距离覆盖),实现全域无缝定位
- AI 算法引入:利用深度学习训练 RSSI - 位置映射模型,进一步降低多径干扰影响
- 硬件升级:采用 ESP32-C6(支持 802.11ax 协议),提升 RSSI 测量频率至 100Hz,减少时延
通过持续优化,ESP32 WIFI 定位技术有望成为室内无人机的标准配置,推动仓储、救援、安防等领域的自动化升级。
附录:关键公式汇总


1544

被折叠的 条评论
为什么被折叠?



