如何使用Android*智能手机开发智能自主无人机





5.00/5 (6投票s)
对于有兴趣开发自己“智能”无人机的各位,本文将提供使用 Android* 智能手机、OpenCV*、C++ 和 Java* 制作智能自主无人机的简易说明。
引言
玩弄小型民用无人机很有趣。自己制造它们更有趣!对于有兴趣开发自己“智能”无人机的各位,本文将提供使用 Android* 智能手机、OpenCV*、C++ 和 Java* 制作智能自主无人机的简易说明。这仅仅是开始。一旦您掌握了这些说明,还可以利用其他程序来进一步改进您的无人机。请访问 Intel® 软件学术计划 [1] 以获取有关 Intel® 开放课程材料自学的信息。
材料和方法
自主和智能?
无人机要实现自主飞行,必须内置所有必需的传感器、处理能力和通信芯片。虽然这听起来不多,但这实际上淘汰了目前市场上许多面向公众的商用民用无人机。
您是否看到了由 Lexus 和 KMEL Robotics [2] 创作的 无人机广告,其中展示了小型超精确无人机的编队飞行?它们之所以能够实现编队飞行,是因为通过放置在房间周围的强大传感器来精确控制它们在房间内的空间位置。您可能也知道无人机可以通过 GPS 进行导航,因为无人机最近受到了广泛关注。GPS 很方便,而且由于它是数字化的,因此非常易于访问,这就是为什么飞机在巡航阶段在高空导航时使用它的原因。但是,±2.5 米的精度和重要延迟将无法让无人机将披萨送到您家门口,因为 2.5 米太近,无人机就会撞到您的房子,或者 2.5 米太偏左或太偏右,它也会坠毁。是的,这些无人机具有独立导航功能,但它们并不算非常“智能”。
要被称为“智能”,您的无人机必须具备足够的嵌入式处理能力,例如,实时捕获视频并分析 QR 码(简单)、形状或运动(困难)等目标。您甚至可以测量体积并实时重建空间,正如 MIT UAV [3] 所做的那样。然而,所有这些“升级”都需要强大的处理器以及加速度计和 GPS 等传感器,并且可能需要不时能够通过 3G/4G 网络进行通信。您可能还希望所有这些都轻巧、易于编程,并且由良好的电池供电。最终,我们得到了一个功能非常强大的手机,它可以反过来为无人机的飞行能力提供动力。
我们最近开发了一种使用 Android 智能手机的无人机遥控设备,在我们这里使用的是 ZTE V975 Geek,配备 Intel® Atom™ 处理器 Z2580。使用 Android 可以轻松开发软件并在 PC 和智能手机之间共享代码。即使是 Intel® Integrated Performance Primitives (Intel® IPP) [4] 或 OpenCV [5] 等原生库,也可以在 Intel Android 智能手机和 PC 上使用。因此,无需重新发明轮子——智能手机具备所有必需的组件:摄像头、GPS、加速度计和 3G。
电机控制
一旦选择了嵌入式计算机,我们就准备连接电机。我们选择了 Pololu Maestro* 伺服控制器,价格约为 5 欧元,通过 USB 连接,甚至可选配蓝牙串行接口实现蓝牙*功能。此卡用于控制标准伺服电机。无论您是在操控四旋翼飞机还是其他类型的无人机,只需用 Android 智能手机和此 Pololu 卡替换无线电控制部分,即可将其制成智能自主无人机。这个方案可以无限次复用。很简单,对吧?
通过几行代码并使用 Android USB 标准包,我们可以控制伺服电机,从而控制飞机的运动。通过更多的代码,我们可以访问 GPS,拍照,并通过 3G 发送。在软件层面,使用 Android 可以快速改进您的设计。
从 UsbDeviceConnection
调用 controlTransfer
import android.hardware.usb.UsbDeviceConnection;
// …
private UsbDeviceConnection connection;
// …
connection.controlTransfer(0x40, command, value, channel, null, 0, 5000);
该卡允许您移动伺服电机,确定目标位置、速度和加速度,这对于平稳运动至关重要。“command”参数可以是这三个值之一
public static final int USB_SET_POSITION = 0x85;
public static final int USB_SET_SPEED = 0x87;
public static final int USB_SET_ACCELERATION = 0x89;
您必须选择相应的值,并通过“channel”对准正确的伺服电机。完整的源代码和应用程序清单中 USB 访问配置包含在 ZIP 文件 [1] 中。
四旋翼飞机的特殊情况
到目前为止一切顺利。硬件即插即用,代码简单,一切都在 Android 中完成。但嵌入式系统的开发仍具有一些特殊之处,正如我们将要看到的四旋翼飞机。多旋翼无人机与遥控汽车或飞机等简单模型在理解上存在很大差异。如果您驾驶 RC 电动汽车,您只需要一个用于加速的电子速度控制器 (ESC) 伺服和一个用于转向的伺服。但多旋翼飞机需要持续的平衡引擎来维持所需的位置。幸运的是,四旋翼飞机自带稳定卡。与其直接连接到 Pololu 卡和四旋翼飞机的四个 ESC 电机,并在 Android 上用 C/C++ 或 Java 编写复杂的稳定软件,不如将稳定卡连接到 Pololu 卡,让该稳定卡管理四个引擎,这样更容易。您需要管理的所有其他内容都可以通过简单的 Java 命令完成,例如 +/- altitude
、+/- speed/
、+/- inclination
和 +/- direction
。我们选择在 Android 智能手机上完成所有操作,因为它拥有强大的处理器,但引擎的平衡则留给一个成本仅为几欧元的专用小卡片。作为开发者,了解这张卡片以及我们决定使用它的原因很重要,但您也会欣赏它只需要初始校准,一旦完成,您就可以忽略它。
第一阶段结论
在自主四旋翼飞机开发初始阶段结束后,硬件链是
手机 <> micro USB-USB 主适配器 <> USB-mini USB 线缆 <> Pololu Maestro 卡 <>
4 根 JR 线缆 <> 稳定卡 <> JR 线缆 <> ESC <> UAV 发动机
相比之下,更简单的无人机的硬件链是
手机 <> micro USB-USB 主适配器 <> USB-mini USB 线缆 <> Pololu Maestro 卡 <> JR 线缆 <> ESC <> UAV 发动机
另外,您还可以控制其他伺服电机,例如连接到四旋翼飞机的 2 通道直接 3D 摄像头。或者,如果您愿意,可以控制襟翼、起落架等。Pololu Maestro 卡可以控制 6 到 24 个电机,这比本项目实际需要的要多得多,但提供了极大的灵活性。
到目前为止,我们已经讨论了构成我们嵌入式项目组件的首选软件和硬件。在下一部分,您将看到如何开发图像分析软件,使其成为智能无人机。
计算机视觉
虽然我们已经确定我们的无人机需要良好的嵌入式处理能力才能变得智能和自主,但仍然缺少的是利用这种潜力的代码。那么,让我们给无人机装上“眼睛”吧!
为什么?
一些无人机可以使用 GPS 进行导航,但 GPS 的精度和延迟不允许它们在建筑物、人群或树木之间进行精确的轨迹飞行。其他无人机可以在实验室中精确灵巧地飞行,但它们从房间周围复杂的摄像头和传感器获取定位线索。这种技术无法在户外扩展。
在实际条件下,无人机必须能够“看见”,例如,识别和跟踪标记或视觉识别人类。那么,剩下的就是能够从 Android 捕获图像并使用 OpenCV 对其进行分析。
如何做到?
OpenCV 是一个开源的图像分析编程函数库,是众多计算机视觉和虚拟现实项目的基础。OpenCV 最初由 Intel 开发,现在支持许多硬件和操作系统平台。您可以在 PC 上开发代码,并将其部署到服务器、智能手机或物联网 (IoT) 平台。
为了练习,我们将首先尝试识别一个简单的标记,例如一个圆圈,并通过智能手机进行导航,以便我们能以固定距离位于该圆圈前方。想象一下,无人机能够通过 GPS 导航到跑道的全局位置(约 3 米)。它必须能够识别地面或路面上的标记,以便精确地定位于着陆位置上方,并保持固定高度。然后,无人机将以几厘米的误差降落在标记点上。为了简化测试,我们将把飞行控件放在屏幕上,您将通过手动移动手机来模拟无人机的运动。
原生 Java 项目+
OpenCV 不是 Java 在 Android 上直接可用的库之一。它是一个原生库,通常从 C++ 调用,因此您需要使用 Android NDK。图像捕获和显示部分将使用 Java,Java 和 C++ 之间的通信将使用 JNI。我们需要安装 Android NDK、Android SDK,创建上述“Circles”项目,添加 C/C++ 组件,并更改项目设置以使用 OpenCV 库,这些都已在以下 Eclipse 屏幕截图中捕获。
最后,我们的项目将拥有
Java 主文件 « Src/MainActivity.java »
XML 布局文件 « Res/layout/activity_main.xml » 和清单
两个 Makefiles « Jni/Android.mk » 和 « Jni/Application.mk »
cpp 代码 « Jni/ComputerVision_jni.cpp » 和头文件 « Jni/ComputerVision_jni.h »
硬件架构
与 Java 不同,C++ 必须为特定的处理器编译。通过编辑 Application.mk
文件中的 APP_ABI
变量即可进行此调整。对于我们基于 Intel Atom 处理器的智能手机,正确的值是“x86”;NDK 将处理其余部分。
部署
OpenCV 是无数 Android 应用使用的库,每个应用都可以使用不同版本的库。作为应用开发者,您可以将所需的 OpenCV 版本与您的应用捆绑在一起,但有一个更好的方法:使用名为“OpenCV Manager”的依赖项管理器。这是一个 Android 应用程序,它可以检测何时需要 OpenCV、需要哪个版本以及/或需要安装帮助,然后加载 OpenCV。您的应用将需要与 OpenCV Manager 建立连接,其余的将“自动”完成。
C++/Java 交互和算法
我们希望在 OpenCV 中检测圆圈,确定中心和半径,然后向智能手机操作员发送指令,以实现完美居中、大小合适的圆圈。以下 Java 代码使用 Android 的 Java API 从相机检索图像。它通过 JNI 调用 C++,并将指向内存中图像的指针附加到其中。C++ 代码随后执行图像处理以检测圆圈。Java 被调用以显示检测到的圆圈并在图像上添加注释。
远程操作
在测试期间,我将手机移到一张打印的纸前面。为了模拟无人机的最终位置,我选择了一个距离,以观察它根据我手机摄像头的光学效果有多宽。例如:我在纸上画了一个 10 厘米的圆圈,我将手机放在距离纸张 20 厘米处,圆圈的宽度看起来是 300 像素。这就是它看起来需要多宽才能达到正确的距离。如果圆圈太大,我将向后移动;如果太小,我将向前移动。最终,无人机将以精确的距离位于圆圈内。
我们的第一个测试案例非常简单:1 个圆圈 = 1 个距离。但是,您也可以做得更进一步,使用几个同心圆:大圆圈可以从很远的距离轻松检测到,当中圈无人机太近而无法看到大圆圈时,将使用中圈,无人机最终将降落在最小的内圈上。如果圆圈不够精确,您也可以使用更复杂的形状,如箭头。
将圆圈置于智能手机图像的中心,以模拟无人机正好位于着陆标记上方的中心定位。这种控制实际上很简单,并且与其他信息(如颜色、GPS 位置以及可能的深度)相结合,可以非常轻松地实现。
Java 代码
…
// capture images from the camera
import org.opencv.Android.CameraBridgeViewBase;
// load OpenCV native dependancy
import org.opencv.Android.OpenCVLoader;
…
public void onResume()
{
super.onResume();
// OpenCV loading with a callback
// non typical code specific to OpenCV
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
…
// once the OpenCV manager link established,
// we can load the dynamic library
System.loadLibrary("jni_part");
…
C++ 代码
…
// typical for JNI : Java class method name
// pointer to RGB image as argument
JNIEXPORT int JNICALL Java_com_example_circles_MainActivity_process
(JNIEnv *jenv, jobject obj, jlong addrGray, jlong addrRgba)
…
// Get the bitmap from pointer
Mat& mRgb = *(Mat*)addrRgba;
// blur, required before detecting circles
medianBlur(mGr,mGr,5);
// OpenCV detection – Hough transformation
HoughCircles(mGr, //grayscale input image
*circles, //output vector
CV_HOUGH_GRADIENT, //detection method to use
4, //inverse ratio of the accumulator resolution to the image
mGr.rows/8, //min distance between centers of detected circles
220, //higher threshold of the two passed intern canny edge detector
200, //accumulator threshold 100
20, //min radius
mGr.cols/8 //max radius
);
性能和后续步骤
从 Google Play* [6] 安装 OpenCV Manager,并从 Eclipse* [7] 安装您的应用程序 APK 文件。启动您的应用程序,让它引导您完成设置;它将检测视野中的圆圈,并引导您将圆圈置于预定直径的中心。
检测圆圈非常基础。最好从背景简洁、对比度高的地方开始,以便于观察。简单的计算机视觉函数处理简单的形状,就像幼儿玩简单的形状一样:圆形、正方形、星形——所有由向量定义的几何图元。但先进的计算机视觉函数可以处理任何照片输入,而不仅仅是简单的几何图元。此类库用于增强现实应用程序;它们可以检测另一张照片中任何照片的存在,即使照片有扭曲。例如:给定一个食品包装的照片,一个应用程序将检测该包装在更大照片中的位置和 3D 方向。大多数计算机视觉应用通过将一个物体移到固定的手机前面来工作。该物体被检测到,并且可以通过 3D 对象进行增强,如本视频所示:http://www.dailymotion.com/video/xco8xm_la-realite-augmentee-par-total-imme_tech [8]。
当然,我们的无人机不需要玩食品包装。但是,可以使用相同的库以不同的方式进行操作,仍然使用一个固定的照片图案进行检测,但使用无人机上移动的手机。例如:一旦我给无人机提供着陆点的照片,无人机就能检测到它,非常精确地了解它相对于图案在空间中的位置,并准备视觉进近。相同的库,不同的用例。
要控制无人机,只需将显示的指令替换为向携带摄像头的无人机发送“power”、“roll”、“pitch”和“yaw”命令。幸运的是,用于驾驶无人机的命令与打印命令完全匹配,因此从室内手动测试迁移到户外飞行将很容易。
在我们测试的智能手机上,我们每八分之一秒捕获和处理一张图像,即每秒 12.5 帧。这证明了在有限的开发时间/处理器/能源预算下,可以轻松地为无人机添加计算机“视觉”功能,这对于小型无人机来说是合理且现实的。所有计算都是独立进行的,无需将任何计算转移出去。
可以做得更多。OpenCV 是一个开源库,并且具有广泛的便携性。此外,Intel IPP [5] 替换了一些低级 OpenCV 调用,并通过注入为 Intel 处理器高度优化的例程来加速您的代码。您可以保持代码的可移植性以及对开源库的依赖,同时享受 Intel IPP 性能带来的可选优势。
最后,使用基于 Intel 处理器的 Android 智能手机控制无人机是一种结合了性能、耐用性和易开发性的解决方案。这个第一个项目为您提供了选项,如果您的智能手机不再足够使用或您希望转向更大的无人机,可以迁移到另一个操作系统或更强大的硬件平台。再次,请查看其他软件程序 [1],它们展示了无人机和机器人领域其他可用的软件开发说明。
关于作者
作者: Paul Guermonprez, Nicolas Vailliet, Cedric Andreolli
链接: http://intel-software-academic-program.com/pages/courses#drones
联系方式: paul.guermonprez@intel.com
团队: Intel Software Academic Program for EMEA-Russia, Paris, France
参考资料和资源
[1] Intel Software Academic Program: http://intel-software-academic-program.com/pages/courses#drones
[2] The Mill: Lexus "Swarm" Behind The Scenes: http://vimeo.com/78549177
[3] Autonomous Robotic Plane Flies Indoors at MIT: http://www.youtube.com/watch?v=kYs215TgI7c
[4] Intel® Integrated Performance Primitives (Intel® IPP): http://software.intel.com/en-us/intel-ipp
[5] OpenCV: https://opencv.ac.cn
[6] Google Play: https://play.google.com/store
[7] Eclipse: https://www.eclipse.org
[8] www.dailymotion.com: La réalité augmentée, par Total Immersion. http://www.dailymotion.com/video/xco8xm_la-realite-augmentee-par-total-imme_tech