查看: 46139|回复: 106

[项目] 【更新】目标跟随小车-让手机成为Arduino的眼睛

  [复制链接]

该用户从未签到

发表于 2016-9-2 12:55 | 显示全部楼层 |阅读模式
本帖最后由 pz_cloud 于 2017-3-17 21:27 编辑

###已更新为使用软件串口通信,不占用下载串口,可自定义端口,使用方法与之前一致,看例程即可

简介

       基于Arduino的小车相信大家见过很多也做过很多,一块主控一个小车底座,加上一些传感器,你就可以让小车玩出各种花样。我们用超声波模块来实现小车壁障,用红外反射模块来实现小车的简单巡线,用蓝牙来实现遥控小车...那除了这些入门级的项目外还有没有其他的玩法呢?这次我就为大家带来一个可以让小车跟随任何物体的APP,不但使用起来简便易懂,而且成本也非常的低~

演示视频




APP

       一般来说,要实现一些复杂的物体识别,比如巡线中复杂赛道的判断和目标物体的跟踪等,我们都会需要用上摄像头,通过图像处理的方式获取目标信息。对于Arduino来说,单独驱动摄像头的话受限于Arduino的性能实现起来比较困难,效果也不会理想,图像处理需要的实时性和大量运算对于基于8AVR单片机系列的Arduino来说确实“小材大用”了。在一些专业的巡线小车比赛当中,我们使用ARM系列的高端处理器来实时处理摄像头获取的赛道图像,但是即便如此,为了保证处理数据的效率我们也会将图像做黑白二值化处理,并且图像分辨率限制的非常低(一般不超过160x160),如此的分辨率显然是无法分辨出物体细节,更别说追踪我们的目标了。

       有没有更简单的方案呢? 当然有的,仔细想想,其实我们的手机就完全可以胜任,它不但搭载了非常强劲的处理器,而且还有前后两颗高清摄像头,用它来做图像处理简直再适合不过了。

       “迹”就是这样一个基于OpenCV的图像处理APP,它可以让手机通过摄像头实时跟踪设定的颜色目标,并且通过手机蓝牙将目标坐标位置和大小等信息输出,配合蓝牙串口模块和我写的配套Arduino数据接收库,就可以实现很多有趣的功能。这篇文章主要讲解一下的使用方法,以及如何通过目标追踪功能制作一个目标跟随小车。




       先介绍一下APP的下载和使用方法,APP大家去豌豆荚搜索迹“安装即可,由于市面上手机型号繁多,对于不同架构的CPU不一定全部都能支持,有安装问题的可以在下载页面留言反馈我有空的话会尽量适配的。安装好了之后如果打开应用卡住或者闪退可能是手机上的安全软件限制了APP的权限,这时候需要去手机设置里开启APP使用摄像头和蓝牙的权限,以原生系统为例操作步骤如下:设置-应用-已安装--权限管理。

      

软件运行界面:


   2.jpg    3.jpg


       需要说明的是蓝牙模块的需要首先在手机系统蓝牙设置里面搜索配对好,然后在APP里面就可以点击“连接蓝牙”,选择对应的模块就连接成功了。点击APP左上角的三条横线,就会开启摄像头预览画面,在画面中点击任何一个你需要跟踪的物体,此时状态栏会显示你选中的颜色,同时被选中的物体被圈中,屏幕下方的数据就开始实时变化输出了。

说明一下显示的各个参数的含义: XY代表目标的坐标这个大家都知道,坐标的极限大小是跟手机摄像头分辨率相关的,大家可以把物体移到手机边缘记录下坐标的最大值。T表示物体在屏幕中的大小,如果检测到多个目标或者没有检测到任何目标这里会显示Eerror),T可以用于粗略地判断物体的远近(近大远小),不过更推荐的方式是用Y轴判断远近(见后文的小车)。剩下的一个百分数是滤波用的阈值,为了尽量消除屏幕中的细小杂点,让视野里只有一个目标,可以调整这个进度条。

    4.jpg    5.jpg


值得说明的是,识别的原理是基于颜色特征的,所以尽管可以对识别效果进行微调,但为了保证识别率还是建议尽量跟踪颜色相对背景比较突出的物体,即视野中尽量不要出现相同颜色的物体。

       如果此时连接了蓝牙模块的话,蓝牙端的Tx就开始不断输出目标的数据了,我们需要做的,就是让Arduino读取解析这些数据,然后用来控制小车。
6.jpg



Arduino

ArduinoAPP的通信通过蓝牙模块实现,模块的连接非常简单,如下:
7.jpg


可以看到我们留出了ArduinoTx并没有连接,因为我们只需要接受蓝牙发来的数据而不需要向蓝牙发送数据,这样的话就依然可以在Arduino程序里面用Serial.print打印调试信息了。另外一点需要说明的是因为使用了Arduino的硬件串口,所以下载程序的时候需要把连接蓝牙的那一根线拔掉再下载,避免数据冲突无法下载失败,嫌麻烦的话解决的办法是使用软串口,或者Mega等不止一个硬件串口的板子。


连接好后下载TraceAPP库,放到Arduino IDElibraries文件夹,打开例程,可以看到代码如下:


#include <TraceApp.h>

TraceApp obj(Serial, 115200);  //实例化检测对象


void setup()

{

  obj.begin();      //初始化,注意:后面不需要再用Serial.begin()!

}


void loop()

{

  obj.routine();    //尽可能让这一句频繁运行


  if (obj.valid())  //检测的物体是否有效

  {

    Serial.print("Objdetected at:");

    Serial.print(obj.getX());  //x坐标

   Serial.print(",");

   Serial.print(obj.getY());  //y坐标

    Serial.print("  with size of:");

   Serial.println(obj.getT()); //物体大小

  }

  else

    Serial.println("Noobj or too many detected");


  delay(100);

}


函数都非常简单,TraceApp obj(Serial, 115200)用来初始化,其中115200是蓝牙跟Arduino通信的波特率,如果你的蓝牙没有改过波特率的话那么默认应该是9600,需要把这里改成TraceApp obj(Serial, 9600)routine()函数是对数据进行轮询,这个函数运行的次数越多越好,剩下的valid()用于判断数据是否有效,getX()getY()getT()就是直接返回解析之后的数据了。
8.png



       然后怎么结合这些数据来让小车跟踪目标呢?其实原理非常简单,就是始终让目标位于屏幕中间。当我们得到屏幕中间的坐标值(x0y0)(分别为xy最大值的一半),那么判断如果当前物体的x坐标小于x0,那么就让小车拥有一个向右转的转向速度v_turn,否则就有一个向左的转向速度-v_turn;当物体的y坐标大于y0,就让小车有一个向前的前进速度v_run,否则有一个后退速度-v_run;那么小车最后总共的速度为:

       左轮速度v_left=v_run+v_turn;

       右轮速度v_right=v_run-v_turn;

v_leftv_right乘以一个系数之后当作pwmanalogWrite赋值给两个电机就可以了,也就是所谓的差速驱动,其中的系数可以仔细调整让跟踪效果最好。手机摆放的时候可以适当增加安装的倾角,这样当物体前后移动时,y轴的变化会比较明显。
9.jpg


      

结尾

       到此整个跟随目标小车的制作就完成啦,应该说整个过程并没有任何复杂的编程,经过封装的数据接口只需简单的几句函数就能完成读取。由这个项目作为启发,我发现其实手机和Arduino结合可以做的事情是非常多的,一台智能机本身就包含了各种各样的传感器光线传感器、距离传感器、加速度计、陀螺仪、喇叭、麦克风等等...而现在智能机更新换代的速度如此之快,闲置下来的废旧手机如果好好加以利用,完全可以实现很多以前在Arduino上意想不到的功能,ArduinoAndroid,同样是秉承开源精神的两大阵营,跨界的碰撞还能给我们带来什么有意思的项目呢,让我们拭目以待吧。

APP链接:豌豆荚搜索 迹 下载
个人网页:www.pengzhihui.com

  • TA的每日心情
    开心
    2016-9-3 15:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-9-3 14:51 | 显示全部楼层
    楼主写的非常详细,写的很好,收藏了
  • TA的每日心情
    慵懒
    2017-10-26 10:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-9-3 15:30 | 显示全部楼层
    顶楼主一个!红米手机闪退

    该用户从未签到

     楼主| 发表于 2016-9-3 16:06 | 显示全部楼层
    michoal 发表于 2016-9-3 15:30
    顶楼主一个!红米手机闪退

    已经修复了,提交豌豆荚审核需要一段时间,可以先去文章后面的网盘下载app
  • TA的每日心情
    慵懒
    2017-10-26 10:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-9-4 15:21 | 显示全部楼层
    楼主很强大!偶像啊!楼主迹这个app是用什么写的?写安卓程序用什么上手比较快些?

    该用户从未签到

     楼主| 发表于 2016-9-4 21:15 | 显示全部楼层
    michoal 发表于 2016-9-4 15:21
    楼主很强大!偶像啊!楼主迹这个app是用什么写的?写安卓程序用什么上手比较快些? ...

    做安卓现在除了Eclipse+ADT基本就是Android studio了吧(app inventor那种太简单了,积木式的编程只能做一些非常简单的应用),android开发是用JAVA,图像处理是用OpenCV库
  • TA的每日心情
    慵懒
    2017-10-26 10:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-9-5 13:21 | 显示全部楼层
    pz_cloud 发表于 2016-9-4 21:15
    做安卓现在除了Eclipse+ADT基本就是Android studio了吧(app inventor那种太简单了,积木式的编程只能做 ...

    非常感谢楼主的帮助

    该用户从未签到

    发表于 2016-9-15 11:53 | 显示全部楼层
    楼主 求app源码

    该用户从未签到

    发表于 2016-9-17 15:34 | 显示全部楼层
    顶一个,楼主好强大.....
  • TA的每日心情
    郁闷
    2018-12-27 16:37
  • 签到天数: 67 天

    [LV.6]常住居民II

    发表于 2016-9-23 13:03 | 显示全部楼层
    好强大,好腻害~
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    程序设计问题求大虾们帮帮忙
    程序设计问题求大虾们帮帮
    大家好,我是一个萌新想设计一个程序,现在遇到困难了。当运行按下按钮,电机会向end
    请问 3块 MCP 4725 ,能否同时接在一起使用?
    请问 3块 MCP 4725 ,能否
    买来时,ADDR是全开路的,使用代码中的所有地址,均无法使用。 // For Adafruit M
    打砖块游戏
    打砖块游戏
    **** 本内容被作者隐藏 ****
    OLED 128*64自制可达10000000个选项的菜单(已更新)
    OLED 128*64自制可达10000
    OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表