DIY可控制互联网的独立无人机。 关于软件的第2部分

这是自主无人机故事的延续。 第一部分谈论硬件,这一部分将谈论软件。 首先,一个关于操作员与直升机互动的小型教育计划。 这是大多数自组装无人机的典型布局:

图片

这是高级无人机的方案:

图片

这是玩具无人机的工作方式,可通过智能手机进行控制:

图片

您可以通过互联网控制无人机(如果您的SIM卡具有静态IP地址):

图片

或者,如果IP地址是动态的:

图片

为了确保通信通道的可靠性和冗余性,可以将后一种选项开发为以下状态:

图片

接下来,我将描述Emlid Navio 2飞行控制器和Raspberry Pi 3微型计算机的设置过程。

图片
但是,只需稍作修改,这些设置便适用于任何飞行控制器,您可以通过MAVLink协议与Linux操作系统系列中的任何计算机进行通讯。

图片

重要! 必须在速度控制器的电源关闭的情况下进行设置,以免发动机意外启动。

适用于PC和平板电脑的无人机控制软件


为了控制无人机,使用了特殊的GCS(地面控制站)程序。 在下文中,我将使用该缩写。 我喜欢QGroundControl ,这是一个开放源代码的多平台(Windows,Linux,MacOS,iOS,Android)GCS,它已成为DroneCode项目的一部分。 但是,还有其他免费和商业选择: APM PlannerMissionPlannerUgCSLibrePilotOpenPilot ,Android的Tower (DroidPlanner), MAVPilot (iOS)和SidePilot (iOS)。 以及控制台MAVProxy

在SD卡上安装OS映像


对于正常的自动驾驶操作,强烈建议使用“快速” SD卡(10级)。 慢速存储卡即使在低频下也没有时间保存自动驾驶仪日志,结果导致它们慢速甚至根本没有被写入。 这可能是“ 无IO心跳 ”错误的证据,可以在MAVLink控制台中观察到此错误(下面将介绍如何观看MAVLink控制台)。 购买时,请考虑写入4K视频的能力:最有可能是快速SD。 不幸的是,我是在无人机坠落后才发现这一点的,当时有必要分析日志并找出原因。 几个GCS无法读取日志。 在飞行中关闭电机的原因实在是太平庸了:我忘记在故障安全操作的设置中调整电池的最小电压。

因此,请从原始说明页面从Emlid下载带有预装Ardupilot和ROS的Raspbian Stretch成品图像。 然后我们使用Etcher或任何类似程序将其写入存储卡。

为了在打开后立即将Raspberry连接到您的WiFi网络,您需要在SD卡的根目录中编辑wpa_supplicant.conf文件。 它应包含以下几行:

network={ ssid="_wifi_" psk="_wifi_" } 

您也可以使用以太网电缆将单板计算机连接到路由器,从而在不使用WiFi的情况下对其进行配置。 现在,从PC上卸下SD卡,将其插入Raspberry,然后打开电源。 半分钟后,它应显示在已连接设备页面上路由器的管理面板中(navio 主机名 )。

更新分发套件并安装必要的软件包


打开SSH客户端并连接到Raspberry(本地navio IP地址,而不是RASPBERRY_IP_ADDRESS ):

 ssh pi@RASPBERRY_IP_ADDRESS 

标准密码: 树莓 。 首先,有必要将操作系统的文件系统扩展到SD卡的整个卷中:

 sudo raspi-config --expand-rootfs 

并重新启动:

 sudo reboot 

重新启动后,再次连接并更新发行版:

 sudo apt-get update && sudo apt-get dist-upgrade -y 

安装其他软件包:

 sudo apt-get install autoconf automake libtool pkg-config libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libraspberrypi-dev gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad 

并为gstreamer和Raspicam本机相机编译gst-rpicamsrc包装器

 git clone https://github.com/thaytan/gst-rpicamsrc.git rpicamsrc cd rpicamsrc chmod +x autogen.sh ./autogen.sh --prefix=/usr --libdir=/usr/lib/arm-linux-gnueabihf/ make sudo make install 

检查摄像机是否工作(创建视频文件test.h264):

 gst-launch-1.0 rpicamsrc bitrate=1000000 ! filesink location=test.h264 

如果gstreamer启动,请等待几秒钟以录制视频。 您可以通过按Ctrl + C中断该过程 如果有视频,则说明相机正在工作。

配置并启动Ardupilot


Emlid的新版本发布的Ardupilot的发布有些晚。 如果最新版本提供了必要的功能,则可以使用此说明从源代码中安装它。

Navio开发人员在其传感器中添加了一个简单便捷的Emlid工具实用程序 ,用于检查传感器和设置Ardupilot。 首先,检查Raspberry是否看到Navio控制器:

 emlidtool info 

如果响应此命令会产生类似以下内容:

 Vendor: Emlid Limited Product: Navio 2 Issue: Emlid 2018-06-05 831f3b08594f2da17dccae980a2e3659115ef71f Kernel: 4.14.34-emlid-v7+ RCIO firmware: 0xcaec2284 

这意味着他看到了。 检查传感器的状态(显示列表和状态):

 emlidtool test 

和Linux内核中的PWM控制器驱动程序:

 cat /sys/kernel/rcio/status/alive 

0 =不工作,1 =工作。

PWM控制器的固件更新如下:

 sudo emlidtool rcio update 

现在配置Ardupilot:

 sudo emlidtool ardupilot 

带有逐步菜单的文本GUI将在终端中打开。 我们选择最新版本的直升机,键入arducopter ,在启动时自动启动( 在启动时:boot ),在配置后启动( Ardupilot:start )。

图片

我们通过退出菜单项退出

检查Ardupilot是否已启动:

 sudo systemctl status arducopter 

请注意,由于已配置copter选项,因此systemd中的启动文件称为arducopter

现在我们需要配置Ardupilot,以便它向我们发送遥测数据。 为此,请编辑配置文件:

 sudo nano /etc/default/arducopter 

它应包含以下几行:

 TELEM1="-A udp:127.0.0.1:14550" ARDUPILOT_OPTS="$TELEM1" 

保存文件( Ctrl + X ,然后是Y )并重新启动Ardupilot:

 sudo systemctl daemon-reload sudo systemctl restart arducopter 

您可以使用以下命令检查Ardupilot进程的状态:

 sudo systemctl status arducopter 

通过这些设置,Ardupilot将遥测( MAVLink数据包)传输到本地UDP端口14550。接着, MAVProxy脚本(如下所述)将从那里进行遥测,并将其发送到GCS或脚本,以及使用反方向的命令发送数据包。

您可以在本地网络上记录PC或平板电脑的IP地址,而不用本地地址和端口,并且数据包将立即在那里广播。

图片

但是,如果遥测数据未在其他任何地方使用且具有GCS的设备具有静态IP地址,则此方法是合理的。 否则,每次必须在设置中注册新的Ardupilot。 为了通过TCP与自动驾驶仪通信,车载计算机上的多个具有动态地址的GCS和其他脚本可以同时使用,使用MAVProxy更为方便。

图片

该脚本(用Python编写)可以接收到本地UDP地址的MAVLink数据包,并将它们通过UDP和TCP中继到几个本地或远程IP地址。 数据包被双向发送到Ardupilot⇔GCS。 此外,MAVProxy是成熟的GCS,但具有文本界面。

MAV代理


Navio映像中已经安装了MAVProxy。 也可以将其安装在PC(Windows,Linux,MacOS)上,以便在控制台模式下与自动驾驶仪进行进一步的通信。

确保Ardupilot正常运行后,使用以下命令在Raspberry上运行MAVProxy脚本:

 mavproxy.py --master=udp:127.0.0.1:14550 

--master = udp:127.0.0.1:14550参数设置脚本的数据源。 这是在Ardupilot配置文件中注册的本地UDP端口。 运行命令后,MAVProxy将连接到此端口并显示自动驾驶仪消息,类似于我的:

 pi@navio:~ $ mavproxy.py --master=udp:127.0.0.1:14550 Connect udp:127.0.0.1:14550 source_system=255 Failed to load module: No module named adsb. Use 'set moddebug 3' in the MAVProxy console to enable traceback Log Directory: Telemetry log: mav.tlog Waiting for heartbeat from 127.0.0.1:14550 MAV> online system 1 STABILIZE> Mode STABILIZE fence breach GPS lock at 0 meters APM: APM:Copter V3.5.5 (88a1ecdd) APM: Frame: UNKNOWN APM: PreArm: RC Roll not configured APM: PreArm: Compass not calibrated APM: PreArm: 3D Accel calibration needed APM: PreArm: check firmware or FRAME_CLASS APM: PreArm: Throttle below Failsafe 

由于自动驾驶仪尚未经过校准且尚未完全调整,因此消息也雄辩地谈到了这一点。 在这种模式下,您可以通过命令与自动驾驶仪通信。 如果将无人机完全调好,那么两个命令的顺序将导致引擎启动,并且无人机起飞到20 m的高度:

 arm throttle takeoff 20 

未经校准的自动驾驶仪将不会飞行,但会显示消息,说明其无法执行此操作的原因。

与局域网上的无人机建立通信


停止脚本( Ctrl + C )并以这种形式再次运行它:

 mavproxy.py --master=udp:127.0.0.1:14550 --out=tcpin:0.0.0.0:5762 

使用附加参数--out = tcpin:0.0.0.0:5762, MAVProxy将在端口5762上侦听来自GCS的传入TCP连接。 GCS连接后,数据包将开始在无人机和GCS之间移动。 让我们尝试从PC连接:

图片

如果连接成功,则GCS将显示一堆消息,要求校准传感器并使用其当前值加载板载参数:

图片

图片

传感器校准和自动驾驶仪参数调整


自动驾驶仪校准几乎可以在任何GCS中完成。 Ardupilot文档对其进行了详细描述。 首先,我们设置框架的类型。 我有一个标准的4电机布局,所以这是QuadX。

图片

在手动模式下,第一次飞行还是更好。 我们连接并校准无线电控件(接收器和发射器)。

图片

仍然需要校准加速度计和指南针。

图片

为了使Ardupilot查看并考虑来自外部传感器的数据,请设置必要的参数:

对于PX4Flow传感器本身的校准和固件更新

FLOW_ENABLE = 1 (Enabled)
FLOW_ADDR = 0 (0 = 042)


激光测高仪VL53L0X (使用说明

RNGFND_TYPE = 16 (VL53L0X)
RNGFND_ORIENT = 25 ( )
RNGFND_ADDR = 41 (I2C- ). - 0x29, = 41.
RNGFND_SCALING = 1
RNGFND_MIN_CM = 5
RNGFND_MAX_CM = 120
RNGFND_GNDCLEAR = 15 ( , )


对于IRLock详细说明Wiki IR-Lock

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1


对于前视图声纳( 说明

RNGFND2_TYPE = 2 (MaxbotixI2C sonar)
RNGFND2_ORIENT = 0 ( )
RNGFND2_MAX_CM = 700 ( )


Ardupilot 选项的完整列表

现在从GCS菜单重新启动Ardupilot,重新连接到开发板并打开MAVLink检查器窗口以查看来自传感器的数据。

图片

不幸的是,IR-Lock的读数在这里看不到,为了对其工作进行分析,您必须查看机载日志。 在此说明如何执行此操作。

仍然需要配置安全性设置,您可以启动无人机:

图片

如何配置陀螺仪悬架并详细控制主相机我将在以下文章之一中进行介绍, 此处概述要点。

视频播放


让我们检查一下视频广播在WiFi网络中的工作方式。 使用此命令,可以使用Raspicam相机的本机raspivid实用程序在Raspberry上的TCP端口中运行视频:

 raspivid -t 0 -hf -fps 25 -w 640 -h 480 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=0.0.0.0 port=5001 

但是此命令执行相同的操作,仅对gstreamer使用先前编译的rpi-camsrc包装器:

 gst-launch-1.0 rpicamsrc sensor-mode=4 ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=0.0.0.0 port=5001 

在这两种情况下,都可以在端口5001的Raspberry IP地址上进行h264广播。

您可以通过在PC上运行这样的命令来查看它(必须安装gstreamer ),而不是RPI_ADDRESS,而是在网络上指定Raspberry地址:

 gst-launch-1.0 -v tcpclientsrc host=RPI_ADDRESS port=5001 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false 

结果,带有视频的窗口应打开。

几乎所有GCS都有一个内置的视频播放器,可以显示RTSP视频流。 要从Raspberry制作RTSP服务器,可以使用VLC控制台播放器 。 安装方式:

 sudo apt-get install vlc 

视频广播开始如下:

 raspivid -o - -t 0 -n -w 320 -h 240 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/live}' :demux=h264 

该视频位于(而不是RPI_ADDRESS ,Raspberry地址):

rtsp://RPI_ADDRESS:8554/live

GCS设置:

图片

图片

流地址可用于连接不同设备上的多个播放器,但是由于Raspberry的视频捕获和广播是一个非常耗时的过程,因此对于多个视频用户而言,最好使用外部服务器(如下所述)。

互联网遥测


为了使GCS通过Internet连接到具有动态IP地址的无人机,需要具有静态IP的中间服务器,在该服务器上将启动MAVProxy脚本。 为此,我利用了一家知名提供商的云服务器租赁服务。 对于MAVProxy,最最小的配置是合适的,但是由于我将使用同一台服务器来中继视频,因此我选择了具有更多内存的选项(一个核心和1GB内存,Ubuntu 18.04)。 为了使板与GCS之间的数据传输延迟最小,服务器应位于无人机和GCS的最大地理位置附近。

图片

在服务器上安装MAVProxy。 首先依赖:

 sudo apt-get install python-dev python-opencv python-wxgtk3.0 python-pip python-matplotlib python-pygame python-lxml python-yaml 

然后通过PIP脚本本身:

 sudo pip install MAVProxy 

写下路径:

 echo "export PATH=$PATH:$HOME/.local/bin" >> ~/.bashrc 

并使用以下参数运行脚本:

 mavproxy.py --master=udp:0.0.0.0:15001 --out=tcpin:0.0.0.0:15002 

MAVProxy在端口15001上监听通过UDP从无人机传来的遥测数据包,在端口15002上监听从GCS传入的TCP连接。

在Raspberry上使用另一个参数运行MAVProxy,以便遥测也广播到服务器(而不是SERVER_IP服务器地址):

 mavproxy.py --master=udp:127.0.0.1:14550 --out=tcpin:0.0.0.0:5762 --out=udpout:SERVER_IP:15001 

在车载计算机上启动脚本后,来自自动驾驶仪的消息将出现在服务器控制台中。 如上所述,MAVProxy是具有文本界面的成熟GCS,在这种状态下,已经可以通过服务器控制台中的命令来编辑参数并控制无人机。

将PC或平板电脑上的GCS连接到服务器。 连接设置与本地网络相同,只是我们指定了服务器地址和端口15002而不是Raspberry IP地址。

图片

现在,您可以将4G USB调制解调器连接到Raspberry,并评估屏幕水平响应的延迟。

网络视频


图片

要中继视频,请在服务器上安装VLC播放器:

 sudo apt-get install vlc 

安装后,将其作为中继从RTSP通道SERVER_IP:8554 / live中的UDP端口5001运行:

 cvlc -vvv udp://@:5001 --sout '#rtp{sdp=rtsp://:8554/live}' :demux=h264 

在船上,我们将开始通过UDP(而不是SERVER_IP服务器地址)从摄像机到服务器的视频广播:

 gst-launch-1.0 rpicamsrc bitrate=1000000 ! video/x-h264,width=640,height=480,framerate=25/1 ! h264parse ! udpsink host=SERVER_IP port=5001 

现在,该流地址可以在GCS设置中用作视频源,也可以在任何支持此协议的播放器中打开。

现在,您可以计划飞行路线并通过互联网(例如,使用电话助手将其打开)来启动无人驾驶飞机。

显然,由于视频和遥测在网络上的旅行时间较长,因此该方法几乎不适合在障碍物之间以手动模式进行的FPV飞行。



后续出版物的主题:

  • 自动为我的禽舍中的无人机以及我停在哪的无人机充电的选项。
  • 使用MAVProxy,NodeJS,socket.io和媒体服务器来实现基于Web的GCS,以同时管理多个无人机。
  • 冗余通信渠道和无人机救援系统
  • 机器视觉和激光雷达,避免与障碍物碰撞

待续...

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


All Articles