1568
从Android智能手机的国产自主飞行机
有趣的具有自主飞机 - 是的,当然,有乐趣,但自己创建它们更多的乐趣!这篇文章是为那些谁想要开发自己的知识产权的直升机,并包含了一组关于如何实现与使用在Android上,OpenCV的,C ++和Java的智能手机的结果简单的指令写入。好吧,如果你能采取的第一个步骤,并希望进一步提高自己的管理 - 在文章的结尾,你会发现有用的链接以及一些精神食粮
。
自治和智能? H4>要直升机可以对自己的飞行,它必须包括所有必要的传感器,充足的计算能力和通信。喜欢,没有那么多,但几乎所有的商用机型没有。还有,例如,该模型动作确定位于该处的传感器。另一种选择 - 通过GPS控制。 GPS接收器价格便宜,使用方便,但长时间的延迟数据的可用性和不够准确。所有这一切,我们不会做。
携带“智能”的称号你的直升机必须能够感知和分析周围的现实。这不仅需要强大的处理器,大容量电池时,相机的质量和足够的组传感器,和快速的通信设备。并且,当然,整个系统必须很好地管理,并易于编程。因此,我们得出这样的结论:没有实现的智囊团直升机的智能手机?首选使用的设备基于Android,因为此操作系统下方便的开发工具和软件组件,如英特尔集成性能基元(英特尔IPP)或OpenCV的。现代智能手机拥有所有需要的硬件组件,因此完全推倒重来是没有必要的。
电机控制 H4>因此,控制中心选择,我们现在必须把它连接到电机。我们选择花费5美元 Pololu大师伺服控制器,它通过USB接口,另外具有蓝牙接口。与此卡的帮助下将通过一个标准的伺服驱动器进行控制。使用Pololu大师伺服控制器和智能手机是相对容易改变雄蜂在独立。
随着代码和标准的Android USB几行意味着我们将控制伺服电机,从而在移动直升机。短短几行代码 - 我们可以访问到的GPS,通过网络摄像机和数据传输
。
呼叫UsbDeviceConnection的controlTransfer:
<代码级=" java的">进口android.hardware.usb.UsbDeviceConnection; // ...私人UsbDeviceConnection连接; // ... Connection.controlTransfer(0X40,指挥,价值,渠道,NULL,0,5000); &中尉; /码> PRE>
该控制器允许你控制伺服驱动器,设置目标位置,速度和加速度 - 所有你需要的平稳移动。该参数的命令可以采取以下三个值之一:
<代码级=" java的">公共静态最终诠释USB_SET_POSITION = 0x85未;公共静态最终诠释USB_SET_SPEED = 87H的;公共静态最终诠释USB_SET_ACCELERATION = 0x89上; &中尉; /码> PRE>选择适当的值,并将其传递到所需的伺服电机,使用参数通道。链接到完整的源代码和配置USB访问的应用程序清单,看帖子的末尾。
特点四轴飞行器 H4>到目前为止,一切都很好。硬件组件相互连接而不会出现问题,编程容易,因为所有的手段来实现的Android。然而,有一个与建造四轴飞行器相关联的特征。不同于简单的模型,如汽车或飞机,四轴飞行器必须不断地监测其稳定性。这就是为什么它是稳定的模块的一个必要组成部分。当然,稳定剂可以通过编程写入一串代码,C ++或Java实现。但它更容易买了几块钱的卡片稳定器直接连接到Pololu和控制四台伺服驱动单元。其他一切都可以通过简单的命令,如±高空进行,±速度/,±倾斜和±方向。
如果你创建一个四轴飞行器注:此卡是伟大的,让您的生活更轻松。所有你需要 - 保持其初始校准,然后忘掉它
。
全部放在一起 H4>所以,作为一个独立的四轴飞行器的建造的第一阶段的结果,我们有以下的硬件链:
智能手机<> micro USB接口,USB适配器和LT;>电缆USB迷你USB<> Pololu大师卡<> 4电缆JR<>地图的稳定和LT;>电缆JR<>伺服驱动器和LT;>发动机 I>
在一个简单的设备链的情况下是短的方法:
智能手机<> micro USB接口,USB适配器和LT;>电缆USB迷你USB<> Pololu大师卡<>电缆JR<>伺服驱动器和LT;>发动机 I>
此外,您可以安装其它驱动器的飞行设备上,如襟翼和起落架。 Pololu大师卡管理多达24个驱动器的支持 - 为我们的项目,它可能甚至太多
。
基础平台的创建。现在是时候来装备我们的目标设备。
计算机视觉 H4>很明显,如果没有智能计算机视觉装置的系统不能这样认为。我们的直升机应该能够不仅仅拍照,也对它们进行分析 - 对于这一点,我们使用的OpenCV的功能
。
- 是图像分析的计算机视觉和虚拟现实系统中的无数底层实现的开源软件库。最初由英特尔公司开发的,现在它可用于多种硬件平台和操作系统。
对于实践中,尝试在一定的距离,识别简单的符号在一个圆圈的形式留在这个标志前。为了简化测试任务,将智能手机将手。
OpenCV的库是不是Java的Android的直接访问。在C ++中常用程序的这种机库,所以我们需要的Android NDK。拍摄照片和可视化将在Java中进行,++为Java和C之间的相互作用将使用JNI。我们将安装Android NDK和Android SDK,创建一个新的项目圆,添加成分的C / C ++和修改项目使用的库OpenCV中的属性,如下面的截图:
这样一来,你的项目是:
主要的Java文件«源/ MainActivity.java»
文件的XML标记«RES /布局/ activity_main.xml»宣言和
两个Makefile文件«JNI / Android.mk»和«JNI / Application.mk»
cpp的代码«JNI / ComputerVision_jni.cpp»和头«JNI / ComputerVision_jni.h» I>
与Java,C ++应该被编译为一个特定的处理器。设置是通过编辑文件变量APP_ABI Application.mk完成。如果你有一个智能手机平台,英特尔,正确的值是86。接下来NDK将尽一切自己。
部署 H4>的OpenCV - 库中使用无限多的Android应用程序,以及库的版本可以使用它们是不同的。作为一个开发者,你可以用OpenCV的特定版本的链接您的应用程序,但有一个更好的选择。使用依赖管理,被称为«OpenCV的经理»。这款Android应用程序,它决定了你现在需要的OpenCV和负荷正是你想要的版本。
我们想要检测圆圈中的OpenCV,以确定它们的中心和半径,并显示指示给操作者以实现智能中心圆的正确大小。下面的Java代码来获取使用Android的Java API的摄像机图像,调用C ++函数通过JNI和高度指向内存中的映像。 C ++代码,用于实现以检测圆的图像的处理。话又说回来,称为Java,显示检测到的圆圈和评论。
JAVA代码:
<代码级=" java的"> ...从相机导入org.opencv.Android.CameraBridgeViewBase //捕捉图像; //加载OpenCV的天然依赖关系导入org.opencv.Android.OpenCVLoader; ...公共无效onResume(){super.onResume(); // OpenCV的加载特定的回调//非一般的代码的OpenCV OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6,这一点,mLoaderCallback); } ... //一旦OpenCV的经理建立联系,//我们可以加载动态库的System.loadLibrary(QUOT; jni_part"); ...&中尉; /码> PRE>代码C ++
<代码级=" CPP"> ... //典型的JNI:Java类方法名//指向RGB图像作为参数JNIEXPORT INT JNICALL Java_com_example_circles_MainActivity_process(的JNIEnv * jenv,jobject OBJ,jlong addrGray,jlong addrRgba )... //从指针垫和放大器的位图; mRgb = *(马太福音*)addrRgba; //模糊,在检测圈medianBlur(经理,经理,5)要求; // OpenCV的检测 - Hough变换HoughCircles(MGR,//灰度输入图像*圈,//输出向量CV_HOUGH_GRADIENT,//检测方法使用4,//累加器分辨率成反比的图像mGr.rows / 8中心之间//最小距离检测圈220,//这两个实习生通过Canny边缘检测器200的门槛较高,// 20 100蓄能器的阈值,//最小半径mGr.cols / 8 //最大半径); &中尉; /码> PRE>
为了测试,我感动的纸张在智能手机正面配有一块印圆。我们假定20厘米图像圈的距离将有300个像素的大小 - 我们假设这是正确的位置。如果圆圈较小的智能手机必须拉得更近,如果更多的 - 然后再打开。这是最简单的选择。您可以使用两个同心圆,价格十分导航长距离,少 - 在中间。没有什么可以阻止其他识别特定的形状,如箭头。最终我们需要得到一个系统,该系统使用的数据的GPS,和从照相机中的颜色信息。
未来计划 H4>设置OpenCV的经理,并从Eclipse中的APK文件。运行它,并通过所有的配置步骤。它将确定的视场范围和引导在一个给定的直径的中心圆的智能电话的移动。
在测试的智能手机,我们已经收到并处理图像,每8个百分之一秒的 - 12.5 fps的。这证明了计算机视觉的直升机 - 即使在有限的时间和财力非常真实的东西
进一步发展的机会是非常广阔的。 OpenCV的 - 是一个开源库,移植到很多平台上。此外,英特尔IPP取代一些低级调用的OpenCV,加快你的代码,插入以及用于英特尔处理器的优化功能。您可以保存代码的可移植性 - 在未来,你可能需要一个更强大的智能手机
。
但是,下一步该怎么做 - 从网站上英特尔
您及时材料。这是写的很详细了如何建立一个飞行机器和怎么教他。现在,一些更为具体的链接:
<一href="http://intel-software-academic-program.com/courses/diy/Intel_Academic_-_DIY_-_Drone/IntelAcademic_DIY_Smart_Autonomous_Drone_White_Paper.zip">Исходный代码直升机 <一href="http://intel-software-academic-program.com/courses/diy/Intel_Academic_-_DIY_-_Drone/IntelAcademic_DIY_Smart_Autonomous_Drone_White_Paper.apk">Тестовый ARC LI> UL>
资料来源: habrahabr.ru/company/intel/blog/230299/