Python + Raspberry Pi + Pixhawk和直升机。 或者如何不制造机器人

哈Ha!

我叫Aleksey,七年来,我一直是伊热夫斯克一家大型定制开发公司中智能电视解决方案的领先开发商。 每年我们举办一场新年装饰比赛,每次我们都不装饰任何东西,但是我们削减了各种技术性的东西。 这次他们越过了无人机和智能电视应用程序。 以及它的结果-阅读下面。

这个想法很可行。 他们想以圣诞老人的雪橇的形式制作一种直升机,它将为员工送礼物到办公室听音乐。 同时,他必须借助ArUco标签分析在太空中导航,并与电视应用程序进行交互(用工作螺钉将管道中的烟雾“吹出”,驱赶动物以见面/看见直升机)。

而这三个月。 当然,我们没有时间。

尽管在不同时间有多达7个人参与该项目,但结果远非理想。 通常,我们只学习了如何发射直升机并编写了电视应用程序。 设置直升机与电视的交互。 但是首先是第一件事。



我不记得谁生病了(肯定不是在我的脑袋里,但这是不准确的),这个想法出现在办公室发射了一架直升机轰炸机。 这项任务是新任务,并非易事,但我们没有发现任何超出自身实力的东西。 是的,我们在互联网上翻找,目的是找到一个用于控制直升机控制器的库。 是的,有必要将流图像从网络摄像头传输到客户端,并在服务器上进行分析。 是的,有必要制造一个炸弹门。 是的,您通常必须编写一个将自身收集所有这些内容的外壳程序。 那又怎样 我们已经完成了所有这一切(控制控制器除外)。 因此,该项目获得了绿灯。

装置


原则上,直升机在您头顶上方嗡嗡嗡嗡嗡嗡叫的每个进化错误都由一套机制和方案组成。 这是:

  1. 控制者
  2. 螺旋桨马达
  3. 电池
  4. 速度控制器(ESC),
  5. 遥测天线
  6. GPS模块和指南针,
  7. 相机。

最后两点是可选的。 旋翼飞机朋友的电路图可以在这里看到:



这是一件好事。 但是,军团决定自己制造。 因为:

  • 留着小胡子的自己
  • 需要一个雪橇形式的船体,
  • 它已经非常昂贵了。

控制者




任何直升机幼虫中最重要的部分。 它具有三个轴的加速度计,软件固件,用于安装外围设备和连接电动机的输入以及用于控制的输出。 没有它,任何无人机都不会飞向空中。 该部件非常重要,以至于将其安装在特殊的减震平台上,以减少振动和冲击载荷的影响。 像这样:



我们选择了一个相对主要的控制器。 “相对”,因为那时我更仔细地看了为严重的叔叔准备的怪物。不过,该控制器具有GPS,指南针,自动驾驶仪以及各种其他好的面包,最多可支持8个引擎。

严格来说,这样的控制器不仅用于垂直飙升的兄弟会。 它们可以安装在任何移动平台上,从直升机,飞机到以汽车和轮船结尾。 一堆用例。 但是我们有些分心。

引擎




这些朋友很多。 圆形,正方形,曲线,倾斜,大,小,昂贵和便宜。 主要区别是:最大功耗,电流强度和每秒转数。 理想情况下,雪橇应该能够提起一罐啤酒(0.5千克)。 在估算了结构的总重量之后,我们计算了所需的近似提升力,并选择了高质量的强劲发动机。 后来发现,他们从未满负荷运行。 但是好多于少...

电瓶




潜在的神风敢死队将停留在空中的唯一能源。 在操作过程中,发现了几个有趣的地方。

首先,嗡嗡作响的技术存根将能量视为自由。 此罐目前已着陆,需要很长时间才能充电。

其次,他不仅吃饭,而且知道如何“保留”费用。 这个想法是好的,因为当达到阈值电压时,汽车会中断飞行并进行软着陆,但这体现为罐子可以更快地“着陆”。

调速器




很小的芯片,没有它们,引擎将无法正常工作。 设计用于从组到发动机的电压分配。 一个非常重要的事情,通常是购买的电动机附带的。

遥测天线




但是,实质上,没有它,外围设备将无法控制飞行物体发展的死角。 此外,遥测不仅用于控制,还用于传输来自摄像机的视频信号,因此通常有两个天线。 顺便说一下,遥测是通过将信号发送和发送到信道列表来进行的。 也可以通过程序控制它们,但是绝对不建议这样做,因为这实际上是我们放弃有线自动驾驶仪并编写自己的方式。 在膝盖上。 以及物质和棍棒。 在昨晚。 我们如何相爱。

GPS模块




在太空中放置飞行神经驱逐舰的主要方法,几乎​​是唯一方法。 通常,GPS模块还包含一个指南针。 为了不影响飞行中的人员,将模块放置在特殊的杆上,以使没有任何影响。 我们仅出于指南针的目的使用它,因为在房间里GPS并不是很擅长捕捉。 支持其他定位系统。

像任何自重的GPS一样,它也会出错。 误差从几米到几大洲不等。 但总的来说,这是街上远距离执行任务所必需的设备。

摄影机




为此,一切已完成。 英国机场的雷暴雨不仅只能在相机下聊天。 控制器可以稳定,远程控制它,并提供非常详细的设置和工具进行管理。 但是我们并没有全部使用。 再来一次

管理学


本质上,所有使用控制器的智能工程技术都由一个程序控制:Mission Planer。 看起来像这样:



在此处了解更多信息。

它提供了最广泛的功能和设置。 有飞行任务计划,地理位置,手动控制,各种设置和设备校准。

规则1:仅使用所需的内容


是的,该程序是必要且有用的。 原则上。 但这不是我们的任务,因为必须通过程序控制空气分配器,并且我们浪费了很多时间来处理此调度器。

您可以随心所欲地进行手动控制。 有遥控器和操纵杆的设置。 您可以在鼠标和键盘上显示控件。 主要要求是校准控制面板。 好吧,手动管理。 由于我们是懒惰的开发人员,因此我们不想手动进行管理。 我希望旋翼飞机自己飞行。

程序控制


在互联网上,他们只找到了库, 库旨在通过程序控制飞机的外观。 它是用python编写的(鼓卷)。 通常,对于2.x版以及在Python 3.5上,它都运行稳定。 该库具有丰富的功能和相对良好的文档。 但是,在开始编写大型控制无人机代码之前,首先需要...是,您需要连接到控制器。

Raspberry Pi微型计算机用作控制软件组件,在aiohttp框架上部署了Web服务器。

可以在此处找到连接“树莓”和控制器的方案和说明。

从示意图上看,它看起来像这样:



连接方法是这个。 控制器和覆盆子根据指定方案通过电线连接。 这样,就可以仿真控制器发送和接收的无线电信号。 在树莓上,您需要运行代理服务器,该服务器将附着在控制器上并从中传输数据。 可以通过遥测或USB进行连接。 他们使用不同的COM端口。 该图显示了通过遥测方法。

规则2:不完整的文档。 通常不写最明显的东西。


例如,要从python连接到控制器,必须指定地址和端口:connectionString ='127.0.0.1:14540'

但是事实证明,该地址和端口也必须在代理服务器的启动行中指定。 在这里:

mavproxy.py —master=/dev/ttyAMA0 —baudrate 921600 —aircraft MyCopter 

是的,这很明显,但从来都不是显而易见的。 我们花了很多时间来解决这个问题。

但是,即使在使用正确的行启动代理并且成功连接到python无人机之后,敌对技术的奇迹也不想启动。 也就是说,我们从直升机收到数据,我们看到了它们,但是未来人类面临的天堂威胁拒绝执行命令。 在最后一刻,事实证明,用于连接无人机的数据需要更多。 有条件的话,他应该开始将数据发送到所连接的遥测,否则,他根本就没有连接数据并感到满意。

因此,规则3:使用USB


是的,有关它的文档要少得多,但是连接的稳定性肯定会更高。 因为我不必使用树莓针。

试飞




突然发现:

  1. 直升机飞行不平稳
  2. 遥测误差±米或以上,
  3. 对于飞行而言,任务包括:爬10-20米,向北飞行100米,等等。

让我提醒您,这种设计是在电影《阿凡达》(Avatar)的直升机的影响下完成的,是在办公室墙壁内启动的,办公室的墙壁上悬挂着许多办公设备,灯具,通风设备和装饰。 好吧,也有员工。 通常,很快就可以清楚地知道,一次严重的室内飞行将充满160个被割断的头部。

规则4:使用正常测试条件


如果一个飞行箱的尺寸为50 x 60厘米,那么它在密闭空间中的空气中不可避免地会导致其损坏或附近人员的伤害。 理想的测试区域是健身房大小的房间。

电脑视觉


通往地狱的另一个门户是计算机视觉的任务。 想法是读取ArUco标签,每个标签在房间平面图中都有记录的位置,直升飞机相对于该位置确定其在空间中的位置,以及相对于路线当前点的位置。

标签示例:



为了实现,使用了openCV库。 它通常用于识别所有事物,尤其是:人的脸,物体,汽车号码以及我们的商标。 在树莓派操作系统Rasbian上安装该库成为一场噩梦,四人交替奋战。 尽管如此,我们还是成功解决了它,现在机器已经“学习”到了从网络摄像头识别视频流中的标记。 但是,再次没有足够的时间来配置所有内容。 例如,库从两个或多个标签中返回了所有标签的识别编号,而数据仅返回一个。 为什么这样 有一个很大的谜...

规则很重要:分配足够的时间来完善解决方案


其他感官


为了使伊卡洛斯翼的突变体不会陷入突然出现的障碍中,他们想使用距离传感器。 它们应该位于汽车的所有侧面,并且必须向障碍物发出信号,结果是直升机应该停下来,“走到侧面”并继续沿路线继续前进。

我们根本没有时间执行此功能。

路线


我们谈论了很多关于直升机的飞行路线。 他们是哪种动物? 我马上要说,此功能是一开始就完全实现的,但是...没有用。

运动路线是具有顶点的连接图,每个顶点在房间空间中具有其三维坐标。 因此,直升机必须从起点一直到终点,最后才执行飞行任务。 随后从当前顶点移动到下一个顶点。 因为对于每个顶点我们都知道它的坐标,而在直升机上我们知道它的位置(罗盘)和位置(标记),那么弄清楚在哪里飞行是纯粹的技术问题。 寻找起点和终点之间路径的任务是通过递归函数解决的。 路线,边缘和高峰存储在部署在覆盆子上的数据库中。

最后一条规则:仅执行您需要执行的操作


技术栈


直升机: Raspberry PiRasbianOpenCVPython 3.5aiohttpDroneKitRPi.GPIOSQLite

电视动态服务器: node.jsExpresssocket.io

电视应用程序: JavaScript ES6webpack 2Canvas

这里有直升机代码的存储库。 对于明星-业力加成。

用几个词来澄清术语(我请您考虑任何主观的评级)。

  • 树莓派。 功能齐全的微型计算机,带有可用的引脚和输出,用于特殊的摄像头和触摸屏。 它位于控制代码,Web服务器,openCV库上。 实际上,直升机就是飞行服务器。
  • 树莓派 树莓派的Linux操作系统。 它们有几种,通常可以放任何一种,但是最好放一些经过特殊设计的引脚,否则,例如使用相同的针脚与计算机设备进行交互时可能会出现问题。 甚至还有Windows 10的适应版本。
  • OpenCV。 用于识别视频流中元素的库。 还知道如何流传输视频流,该流在项目中用于向客户端发布图像。 (是的,直升机有自己的网络客户端)
  • Python 3.5。 巨蟒 3.5。 不是2. *。
  • Aiohttp。 用python编写的异步Web服务器框架。 由于某种原因,他更喜欢Django 。 但是有一个选择。
  • DroneKit。 用于从程序连接到直升机控制器的库。 非常丰富的功能,以及相对良好的文档。 在没有类似物的情况下-一个出色的工具。
  • RPi.GPIO。 用于与树莓针交互的Python库。 允许您打开和关闭引脚,收听其值。 无法传递0或1-ts以外的值。 还是我没有找到。
  • SQLite的 DBMS + DB +木柴合并为一个文件。 如果您不需要部署繁重的工作,则是培训和非销售项目的理想选择。 方便进行更改。
  • Node.js。 服务器端JavaScript
  • 快车 用node.js编写的Web服务器框架。 非常舒适和简约。
  • Socket.io。 用于实现webSocket协议的服务器和客户端库。 主要优点是工作的稳定性和所提供的广泛功能。

结论


在最初的表述中,该任务是可行的,尽管它需要大量的时间和精力。 由于自动驾驶仪和直升机的控制方法比完全绑定到GPS的方法略少,因此必须在直接向控制通道发出命令的方向上放弃它们。 这需要编写您的自动驾驶仪,这是要解决的任务。 然后-测试,测试和测试。

我个人很感兴趣。 而且我还是会做自动礼物轰炸机。 对于所有感兴趣的人,也许我会离开

唯一的规则是:设定高而艰巨的目标并去实现它们!


祝大家好运!

Source: https://habr.com/ru/post/zh-CN438496/


All Articles