前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESPcopter无人机初探(UWB定位+ESP8266MCU)

ESPcopter无人机初探(UWB定位+ESP8266MCU)

作者头像
云深无际
发布2021-01-21 15:04:01
1.9K0
发布2021-01-21 15:04:01
举报
文章被收录于专栏:云深之无迹云深之无迹

这个就是目前资料较为齐全而且已经有成品的

没有卖的地方,而且国内资料稀少

代码语言:javascript
复制
https://arikovani.com/en/projects/programlanabilir-mini-drone/detail

这个网站就是我们要关注

看它完成的样子,就是空心杯电机成品

可视化的平台,404了。嘤嘤嘤

开放了Arduino的一个库,那么我就可以从代码反推出设计

因为这个东西不难,而且就是这么个设计的办法

esp-12e,是其控制核心。mos管我看不见,一定有这个小东西

代码语言:javascript
复制
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一样

代码语言:javascript
复制
http://espcopter.com/code-release/
这个是我们要分析的代码

可以看到

ESPcopter将具有飞行控制软件,以使飞行稳定。这个

ESPcopterWebApp示例演示了ESPcopter具有以下附加功能:

充当独立的Web服务器。这将使你快速运行ESPcopter,你可以

通过手机,平板电脑或笔记本电脑上的网页对其进行控制。

代码语言:javascript
复制
/*
 * @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的库内,很简单的小玩意儿

代码语言:javascript
复制
https://remotexy.com/en/editor/
代码语言:javascript
复制
https://arikovani.com/en/projects/programlanabilir-mini-drone/detail
代码语言:javascript
复制
https://www.minixiazai.com/app/26220.html

这个就是WEB里面的头文件

可以推断出整机的硬件配置

代码语言:javascript
复制
https://github.com/thotro/arduino-dw1000

我先插一下这个MD的文件,这个东西比较高级。叫

UWD定位dwm1000测距模块,就是测距使用

这个是有人打扮焊接好的,Google电路图就有。国内资料缺乏

UWB即超宽频定位,一般用于室内离线定位,在众多离线定位方法中它算是精度最高的之一,其定位原理一般为TOA或者DOA。UWB定位,超宽频定位,本质上和GPS卫星定位的原理是一样的,它不过是将卫星放在了地面上,也就是自己搭建作为卫星的基站,然后去根据和GPS定位相同的算法计算出每个Anchor(基站)到Tag(移动站)的距离,从而解算出移动站的空间坐标,对于三维空间定位而言一般至少需要四个Anchor,Anchor的数量增加不但可以构建超定方程组使用一些算法提高精度,同时也可以作为通信质量不佳下的冗余设计,所以在可以接受的条件下,基站的数量一般越多越好。

淘宝,40块钱一个芯片。都是SPI的协议

这个是淘宝的价钱

代码语言:javascript
复制
http://dtysky.moe/article/Skill-2015_11_21_a
代码语言:javascript
复制
https://os.mbed.com/users/manumaet/code/DecaWave/
代码语言:javascript
复制
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之间的多次通信实现的,如下图:

  1. Anchor首先发给Tag一个包,同时记录下Anchor当前的时间信息,记为T1。
  2. Tag收到基站的信息,返回一个ACK。
  3. Anchor收到Tag的ACK,记录当前的时间信息,记为T2。
  4. 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的同一次广播包到达的时间是不同的,所以便有有以下算法:

  1. Tag发出一个广播包。
  2. 两个Anchor接收到同一个包,Anchor1接收到的时间为T1,Anchor2接收到的时间为T1。
  3. 计算时间差Td = T2 - T1。
  4. 对于至少四个Anchor,可以得到三组这样的两两之间的信息。
  5. 通过数学方法(multi-lateration)可以解算出Tag的空间坐标。

由于算法比较复杂,这里不再赘述。

由此可见,TDOA的优势首先在于一次定位的通信次数显著减少,其次由于是用时间差而非绝对时间进行测距,其精度也比TOA高出一些。但优势总是以一些代价换来的,TDOA系统中各个Anchor的时钟必须严格同步,由于这种定位本质上是依赖于光速的,所以1ns的固有时钟误差便可以造成30cm的固有距离误差,这一点显然是不可接受的。而要打造一个间距比较大的精确同步系统成本又是比较高昂的,所以从这个层面来讲,TDOA并非一般人或者公司可以玩得起的。 当然,DecaWave自身研究出了另一种TDOA的方式(详见APS003),也就是在时钟之外另外加了一个同步位用于同步,不过看起来也是比较复杂的。

这个定位方式,国内还没有出现使用的(可能是我low),可能大疆的机以及有了,比如教育系列的机器?有点憧憬~

继续看我们的文档,都忘了~

代码语言:javascript
复制
#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内存

下载工具:

代码语言:javascript
复制
https://github.com/esp8266/arduino-esp8266fsplugin/releases/download/0.5.0/ESP8266FS-0.5.0.zip

这种是用上面介绍的哪个自动生成安卓的布局软件控制

注意看这个连接过程

代码语言:javascript
复制
#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轴稳定开关

高度固定开关

具有运动稳定功能的光流模块

这三个是上面的翻译

代码语言:javascript
复制
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飞行器的时候,我就一直想知道内部的代码是互相交互的,以及传输进去指令如何干预这个精巧的小系统。这些都是我感兴趣的,恰好有这个项目,可以让我管中窥豹,看代码大呼过瘾。当然今天就是个开胃菜而已~感兴趣的朋友可以打赏我一下~~~或者一起玩耍也是极好的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 以下内容来自于这个博客,以及一个国外的项目,以及相关的代码,一起发到这里
  • 1.1 TOA/TDOA
    • 1.1.1 TOA
      • 1.1.2 TDOA
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档