ESPcopter无人机初探(UWB定位+ESP8266MCU)
这个就是目前资料较为齐全而且已经有成品的
没有卖的地方,而且国内资料稀少
https://arikovani.com/en/projects/programlanabilir-mini-drone/detail
这个网站就是我们要关注
看它完成的样子,就是空心杯电机成品
可视化的平台,404了。嘤嘤嘤
开放了Arduino的一个库,那么我就可以从代码反推出设计
因为这个东西不难,而且就是这么个设计的办法
esp-12e,是其控制核心。mos管我看不见,一定有这个小东西
http://espcopter.com/wp-content/uploads/2016/09/espcopter-sdk.pdf
这个地方是一个pdf,让我们去研究一下
1.0.0的测试版
映入眼帘的是两个按钮,一个是开关,一个是重启
两边一共12个脚
看这个就非常好了,开始分析一波:
1:对于4个螺旋桨,直接是接在了芯片的IO脚上面,这个芯片脚的输出电流是多少,此时应该去看芯片手册
2:还可以看出有5个引脚当了通用的IO脚,而且还有一个串口。另外三个IO直接接了RGB灯来显示飞机的状态(有点浪费资源嗷)
3:以及一个ADC,右下角可以看到一些提示。引脚当前6ma,最大12ma。最睡眠状态,连接16和一个EXt的脚。这个是唤醒?看手册再说吧
可以看到扩展开发还是得Arduino
知道了串口芯片用的什么
可以看到我们最重要的资料出现了
上面的哪个PDF,我实在不认识了。就先不解读了
但是下面有英文版的,继续看
里面的这句意思,就是引脚的映射与NodeMCU的mapping一样
http://espcopter.com/code-release/
这个是我们要分析的代码
可以看到
ESPcopter将具有飞行控制软件,以使飞行稳定。这个
ESPcopterWebApp示例演示了ESPcopter具有以下附加功能:
充当独立的Web服务器。这将使你快速运行ESPcopter,你可以
通过手机,平板电脑或笔记本电脑上的网页对其进行控制。
/*
* @Author: your name
* @Date: 2021-01-20 20:27:47
* @LastEditTime: 2021-01-20 20:28:31
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \ESPcopter_1.1.0 BETA_\web.ino
*/
#define REMOTE_WEB_APP
#define WEB_APP_WIFI_SSID "ESPcopter" //ESPcopter WiFi名字
#define WEB_APP_WIFI_PASSWORD "12345678" //ESPcopter 密码
#include <espcopter.h>
void setup()
{
mainSetup();
}
void loop()
{
mainLoop();
}
小飞机还支持这个可视化的编程
这个地方也有一个渲染图,我也没有用过。有空看看
以及支持这个积木化的手机app
我随手搞搞,很有趣。直接生成Arduino的代码了
太花里胡哨了,我喜欢。嘤嘤嘤
可以加光流传感器
用Procrssing写的上位机
这个是激光避障传感器,精度为1米。我必须给我的小飞机做一个
以及这些传感器
ESPcopter Neopixel模块:
该圆形卡中有12个NeoPixels。它可以连接到ESPcopter的顶部输入引脚。
你可以在使用ESPcopter飞行时使用NeoPixel模块进行各种灯光表演。
ESPcopter蜂鸣器模块:
蜂鸣器模块中有一个蜂鸣器。它可以连接到ESPcopter的顶部输入引脚。
你可以在不飞行时通过蜂鸣器模块播放音乐,并且在飞行时可以听到警告声。
ESPcopter温度压力和湿度模块
该模块具有一个BEM280传感器。它可以连接到ESPcopter的顶部输入引脚。
你可以使用此模块记录飞行中的天气数据,也可以通过IoT项目中的Internet将这些数据发送到手机或计算机。
ESPcopter高度保持模块
该模块具有一个VL53L0x传感器模块。它可以连接到ESPcopter的底部输入引脚
使用此模块,你可以测量ESPcopter的高度至1.2米,并自动固定无人机的高度。
这些扩展都相应在Arduino的库内,很简单的小玩意儿
https://remotexy.com/en/editor/
https://arikovani.com/en/projects/programlanabilir-mini-drone/detail
https://www.minixiazai.com/app/26220.html
这个就是WEB里面的头文件
可以推断出整机的硬件配置
https://github.com/thotro/arduino-dw1000
我先插一下这个MD的文件,这个东西比较高级。叫
UWD定位dwm1000测距模块,就是测距使用
这个是有人打扮焊接好的,Google电路图就有。国内资料缺乏
UWB即超宽频定位,一般用于室内离线定位,在众多离线定位方法中它算是精度最高的之一,其定位原理一般为TOA或者DOA。UWB定位,超宽频定位,本质上和GPS卫星定位的原理是一样的,它不过是将卫星放在了地面上,也就是自己搭建作为卫星的基站,然后去根据和GPS定位相同的算法计算出每个Anchor(基站)到Tag(移动站)的距离,从而解算出移动站的空间坐标,对于三维空间定位而言一般至少需要四个Anchor,Anchor的数量增加不但可以构建超定方程组使用一些算法提高精度,同时也可以作为通信质量不佳下的冗余设计,所以在可以接受的条件下,基站的数量一般越多越好。
淘宝,40块钱一个芯片。都是SPI的协议
这个是淘宝的价钱
http://dtysky.moe/article/Skill-2015_11_21_a
https://os.mbed.com/users/manumaet/code/DecaWave/
https://os.mbed.com/users/manumaet/code/DecaWave//archive/b6120c152ad1.tar.gz
以下内容来自于这个博客,以及一个国外的项目,以及相关的代码,一起发到这里
1.1 TOA/TDOA
UWB定位的原理是TOA或者TODA,当然也有还有AOA等,不常见。
1.1.1 TOA
TOA即“到达时间”,这种方式定位是通过Anchor和Tag之间的多次通信实现的,如下图:
Anchor首先发给Tag一个包,同时记录下Anchor当前的时间信息,记为T1。
Tag收到基站的信息,返回一个ACK。
Anchor收到Tag的ACK,记录当前的时间信息,记为T2。
Anchor计算时间差Tr = T2 - T1,并且根据此计算出距离:
d = c * Tr / 2
其中c为光速。
当然,实际应用中为了更加靠谱,往往不仅仅是利用两次通信来测距,还会有更加复杂的多次通信来提高精度,详细的同样可以看DW1000的UserManual最后一节。
对于空间定位,只需要利用SX(球面相交法)便可以得出最后的坐标。
可见,为了一次定位,每个Anchor和Tag之间要进行两次通信,故DecaWave又将这种定位方式称为“Two-way-ranging”。这种定位的优势在于其实现的便捷性和对硬件的宽容,只需要有几个摆放在不同位置的Anchor和一个Tag便可进行定位,而缺点嘛...首先自然是定位速度了,其次,由于每次通信的质量无法保证,而一对Anchor/Tag又无法做自我的校准,精度自然也会受到相当的影响。
1.1.2 TDOA
TODA即“到达时间差”,这种方式的一次测距是由两个Anchor和一个Tag实现的。在这种模式下,多个时钟完全同步的Anchor同时接受来自一个Tag的包,对于不同位置的Anchor,同一个Tag的同一次广播包到达的时间是不同的,所以便有有以下算法:
Tag发出一个广播包。
两个Anchor接收到同一个包,Anchor1接收到的时间为T1,Anchor2接收到的时间为T1。
计算时间差Td = T2 - T1。
对于至少四个Anchor,可以得到三组这样的两两之间的信息。
通过数学方法(multi-lateration)可以解算出Tag的空间坐标。
由于算法比较复杂,这里不再赘述。
由此可见,TDOA的优势首先在于一次定位的通信次数显著减少,其次由于是用时间差而非绝对时间进行测距,其精度也比TOA高出一些。但优势总是以一些代价换来的,TDOA系统中各个Anchor的时钟必须严格同步,由于这种定位本质上是依赖于光速的,所以1ns的固有时钟误差便可以造成30cm的固有距离误差,这一点显然是不可接受的。而要打造一个间距比较大的精确同步系统成本又是比较高昂的,所以从这个层面来讲,TDOA并非一般人或者公司可以玩得起的。
当然,DecaWave自身研究出了另一种TDOA的方式(详见APS003),也就是在时钟之外另外加了一个同步位用于同步,不过看起来也是比较复杂的。
这个定位方式,国内还没有出现使用的(可能是我low),可能大疆的机以及有了,比如教育系列的机器?有点憧憬~
继续看我们的文档,都忘了~
#define REMOTE_WEB_APP
#define WEB_APP_WIFI_SSID "ESPcopter" //ESPcopter WiFi名字
#define WEB_APP_WIFI_PASSWORD "12345678" //ESPcopter 密码
#include <espcopter.h>
void setup()
{
mainSetup();
}
void loop()
{
mainLoop();
}
继续看这个代码,在上面就是浏览器连接无人机以后用浏览器控制
这个的实现应该是网页在ESP8266里面储存着
甚至存的这么多,WiFi连接飞行器。然后输入IP就有这些
这个是用就像Mind+那种软件编出的代码
设置的话,就是更改名字,密码什么的
聊聊技术实现:
什么是Spiffs Memory?
闪存文件系统(SPIFFS)是SPI闪存(64kBytes至3Mbyte)存储器ESP存储程序。该归档系统可用于不经常存储更改数据,例如;网页,配置,传感器校准数据等~
如何安装Spiffs内存
下载工具:
https://github.com/esp8266/arduino-esp8266fsplugin/releases/download/0.5.0/ESP8266FS-0.5.0.zip
这种是用上面介绍的哪个自动生成安卓的布局软件控制
注意看这个连接过程
#define REMOTEXY_WIFI_SSID “RemoteXY”
#define REMOTEXY_WIFI_PASSWORD “12345678”
#define REMOTE_XY_REMOTE
#include <espcopter.h> // library
void setup()
{
mainSetup(); // main flying setup
}
void loop()
{
mainLoop(); // main flying loop
}
放一点伪代码
此部分说的是飞机的校准。
也指出了必须有的传感器是:陀螺仪,加速度,地球磁场?就是指北用的
估计是提供相对的方向,在校准好以后。飞机的螺旋桨会短暂的启动
上面吐槽说人家浪费IO脚,没想到这个灯的作用有点强
这个里面是说的控制飞行器的方法,上面这些方法一次只有一个生效,其他的需要注释掉。
主要有,手机的app连接(WiFi),web端控制(wifi),MQTT(这个有点奇妙,第一次见用到控制),以及标准的航模PPM方式。很全面了~
这个是全局变量的一些定义
我们去搜索一下
这里的代码很有意思,我们稍微看看。有点IMU的味道
应该是用微调
也就是在三个方向进行微调
在第二个函数里面
这个是函数的开头,串口的波特率很高。写了个循环,来让串口正常工作。
9个引脚都是输出模式,接着除0以外的脚都是低电平
这个地方,我觉得不是Arduino的函数,而是esp的函数
果然是
然后就是PWM的启动,看来PWM的权重在系统里面很高
接着就是三个灯这是亮了应该是~
这个我猜不出来是什么意思
但是是调用了一次这个初始化的函数
我觉得应该是这个。我得看看IMU的传感器是什么
找到啦!是这个东西>.<
应该是和姿态相关的函数。就是初始的值,静止的感觉
这个就是PID的一些东西
你看在PID的实现里面。是初始值
这个是一个CPP的头文件,或者是一个类。是PID相关的函数,我后面研究
首先是电机控制,两个状态,开关。
Z轴稳定开关
高度固定开关
具有运动稳定功能的光流模块
这三个是上面的翻译
void setFlyMode_1(boolean x)
{
if (x == true)
{
flyMode_1 = 1;
}
else
{
flyMode_1 = 0;
}
}
void setFlyMode_2(boolean x)
{
if (x == true)
{
flyMode_2 = 1;
}
else
{
flyMode_2 = 0;
}
}
void setFlyMode_3(boolean x)
{
if (x == true)
{
flyMode_3 = 1;
}
else
{
flyMode_3 = 0;
}
}
void landing(boolean x)
{
if (x == true)
{
landingOff = 0;
}
else
{
landingOff = 1;
}
}
和SDK的参数对应。都在头文件里面了
电机的转速
电机的额定功率,我没有翻译错吧
三个方向上面的轴
看看是多少
应该是700MA
这个是电机的额定功率
在WEB_APP.h这个文件里面也找到这个。就是控制油门大小的。
另外三个航向都是一样的,不做解释了
这个是auto模式
首先是自动起飞,两个参数。高度,以及多久以后起飞
我找到了这个参数
这个是前向飞行~
自动飞行的函数,就是这么多
出现次数最多的是哪个函数,是这个延时函数
mission计数器 =
标准T,可能是秒吧(应该就是S)
自动悬停,借助于激光传感器
这个是上面哪个多距离传感器
蜂鸣器,以及灯什么的,
嗨~朋友,你还读的尽兴吗~我倒是写的还好。可能你读完我的文章得不到一个飞机,但是你可以学一些复杂系统之间的交互。我前些日子在使用Tello飞行器的时候,我就一直想知道内部的代码是互相交互的,以及传输进去指令如何干预这个精巧的小系统。这些都是我感兴趣的,恰好有这个项目,可以让我管中窥豹,看代码大呼过瘾。当然今天就是个开胃菜而已~感兴趣的朋友可以打赏我一下~~~或者一起玩耍也是极好的。