主页 > 案例大全 > 论文写作模式-基于树莓派的可移动智能家居管家机器人开发

论文写作模式-基于树莓派的可移动智能家居管家机器人开发

2021-04-30 13:49:33

  在对当下的智能家居服务机器人进行了研究后,我发现很多现有的智能家居机器人并没有统筹协调的功能,只是单单地实现一些简单的日常需求,试想一下,今后会有越来越多的智能机器人进入到人们的日常生活中,如果都由人一个一个地去控制那将不仅不能解放人们的劳动力,反而会使得智能家居很费神费力。因此一款具有智能协调功能的智能家居管家机器人将会把你从复杂的家电管理中剥离出来,让您拥有更多的个人时间和空间。智能家居管家机器人在树莓派3B+上进行开发,同时拥远程控制移动、实时监控、智能沟通、家电控制及数据分析功能。通过Android端可以方便地控制和检测。利用树莓派引脚和L298N模块可以很快捷地驱动机器人移动;树莓派通过FFMPEG实现RTMP推流和Android daniulive SD拉流实现远程监控的功能,而通过百度语音和图灵机器人则可以实现家电控制以及智能语音沟通,为了使得机器人能够在任意时间进行沟通,采用snowboy唤醒技术实时检测关键词,一旦接收到关键词,则进入智能语音沟通模块。该机器人将保护家庭安全,极大地提供生活便利。

  1.1本文的研究目的和意义

  习近平主席在十九大报告中强调,中国特色社会主义进入了一个新时代,我国社会主要矛盾已经转化为人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾。经历了四十多年的改革开放,我国人民的生活水平不断得到提升,蒸蒸日上的高新科技行业也给人们的生活带来了非常大的便利。人民对于科技的期望也越来越高,科技也正在悄无声息地改变人们的生活方式。

  在这样一个大背景下,智能家居逐步走进了人们的日常生活,对智能家居的研究也成为近年非常热门的邻域。一些智能机器人已经进入到千家万户,比如扫地机器人,智能音箱、语音电视等。在这之前,制造出能完全代替人类的机器人一直是人类的梦想,但是就目前世界的科技力量来说,是不太可能实现这样一种机器人,就只说对变化环境的自适应和学习能力这一块可能就与人们的预期有很大差距,但是值得期待的是,这一差距正在慢慢缩小。在一篇论文中,提到一种智能机器人Robocop,它能够覆盖崎岖的地形,具有足够的坚固性,可以承受被扔到某个地方时的压力,并且不会破裂,并且能够在错误的方向着陆时保持稳定。在人类难以走动或可能危及生命的区域(例如含有爆炸性物品或有害气体的地方),可以自由移动[1]。波士顿动力公司的机器人研究就能很好地实现机器人模仿人行走、跑、甚至跑酷等运动。很显然,机器人的学习能力正在不断提升。传感器就像机器人的“器官”,为机器人收集各种数据来学习以及“感受”。智能家居机器人正可以通过传感器,让你可以实时异地监测家庭环境,以达到家庭管家的协助作用。

  智能管家机器人毫无疑问就是通过智能机器人技术,为人们提供基本的管家服务。新华字典上对管家的解释为:指为集体管理财物或日常生活的人。所以,智能机器人管家,首先要管好财务。说到财务管理就必须提到防盗,智能管家机器人必须拥有一个基本的监控和预警功能已达到管理财务的基本要求,为家人提供安全感。其次,管理人们的日常生活;智能管家机器人可以接入控制家电,开关门等,各种缴费系统,各种购物平台等。为了给人们提供更多生活上的便利,智能管家还需要语音聊天系统,并能理解人们的需求。在家庭安全上,智能管家可以进一步通过烟雾传感器、温度传感器以提供火灾和煤气泄漏预警。并且,为了全面管理生活,智能机器人还必须可以方便地在室内移动。对于无线机器人来说,最主要的便是电源问题,当机器人检测到电量不足的时候,应该会主动发起充电请求,然后自主到最近的充电设备充电。其次,智能管家机器人,还需要有避障功能,不能撞击到室内物品,同时也要考虑保护机器人。

  综上所诉,本文提出了一种实现智能管家机器人的方案,在成本低廉功能强大的树莓派上进行开发,设计出以小车框架为模型的智能管家机器人。

  1.2国内外发展现状

  从20世纪80年代来,智能家居就已经逐步走向人们的生活,并在社会与科技的发展中标准化和实用化。物联网作为朝阳产业,已被列为我国五大新兴战略性产业之一。智能家居作为物联网的重要应用领域之一,有着非常广阔的发展前景。基于无线传感器网络的智能家居机器人,是近年来的一个研究热点。在生活节奏加快,工作压力增大的今天,人们追求更高的生活品质和更舒适的居家环境[2]。除了传统的电器平台发力于智能家居,许多的网络公司也对智能家居领域进行积极拓展,开发属于自家特色的智能家居系统[3]。智能家居发展的源头为美国,在第一栋智能型建筑诞生后,大量公司都开始布局于智能家居行业,并推出了基于企业的智能家居系统,比较知名的有美国的X-10、新加坡的8X、德国的EIB和日本的HBS等[4]。早在1995年,美国和新加坡就已经大量推广智能家居,其平均安装一家智能家居消费高达7000美元。但是使用率仅占0.3%[5]。德国机器人巨头公司卡库被中国美的集团收购后主要进军的是家庭服务与医疗服务机器人[6]。从目前来看,北美和欧洲等国家的智能家居使用率比较高,尤其在美国、新加坡、德国、日本等国家。国内的智能家居起步比较晚,目前智能家居普及率比较低,但是由于近几年国内科技的迅猛发展,出现如海尔、小米、清华同方等公司在智能家居行业的不断探索及成功,使得最近几年国内的智能家居行业也快速发展起来。2014年上海家联国际网络科技有限公司研发了叫Comhome的全行业第一款家庭与智慧全兼容性产品,真正实现了对各种品牌家电的兼容。

  2015年3月,中央首次将“互联网+”写进政府工作报告,大大推动了物联网的发展。2020年大力发展的新基础设施建设,使得人工智能与物联网技术达到了一个非常高的发展水平。各种智能化家电,如语音电视、扫地机器人、智能音箱等走进了更多的家庭。

  1.3主要研究内容和章节安排

  1.3.1主要研究内容

  本文介绍的树莓派智能家居机器人主要由四个模块构成:移动模块、智能沟通模块、实时视频监控模块,家电控制与数据采集模块。具体内容如下:

  移动模块:作为服务家庭的管家机器人,控制移动不仅可以方便地观察和检测室内的各个环境,而且还能及时沟通了解家人的需求。考虑到远程控制移动的需求,本文介绍的智能家居机器人采用手机移动端的方式对机器人进行控制,通过Android程序发送控制消息到云服务器,云服务器转发到机器人的方式以控制机器人的基本运动。同时考虑到机器人的使用环境地面平坦、活动范围相对较小但也存在相应阻力(如厨房地上未来得及清理的菜杆),所以使用小功率直流电机、轮式四驱的方式驱动,既能保持有充足动力平稳移动,又降低了功耗。

  智能沟通模块:能够与家人进行一个流畅的互动是智能家居机器人的基本要求。本文通过语音识别技术、聊天机器人技术、发送邮件技术以实现机器人的智能沟通模块。家人可以通过与智能机器人的聊天获得自己想要的信息,比如图片、菜价、天气、交通等,智能机器人可以通过邮件的形式将这些信息发送到邮箱同时语音播报。除此之外,家人还可通过语音下达命令以控制家电。

  实时视频监控模块:作为一个能够远程控制移动的智能家居机器人,必须具备超低延迟的实时流传输功能,并且还能达到移动监控的目的。本文介绍的智能机器人采用直播推流的方式,通过树莓派将实时流信息推流到上位机,然后用Android端对实时流进行抓流和解析播放。其次作为监控机器人,还需要具备监控录制和快照的功能。

  家电控制与数据采集模块:智能家居管家机器人一个重要的用途便是控制家电和检测环境。控制家电可以通过移动端和语音的方式;检测环境主要通过数据上传和分析,例如煤气传感器、烟雾传感器、电源监控设备等。由于时间和人力的原因,本文只实现语音控制开关灯、语音控制音乐播放、人脸识别开们模拟三个功能,后期尽可能完善。

  1.3.2章节安排

  本文主要讨论树莓派智能家居管家机器人的需求分析、功能开发以及相应的知识介绍,提供一种面向树莓派智能家居管家机器人开发的方案。全文总共分为八个章节,具体内容如下:

  第一章为绪论。本章介绍了选题背景和智能家居机器人的国内外研究现状,并制定本文的研究内容和组织结构。

  第二章为相关技术的简介。本章首先介绍了智能机器人的核心硬件,树莓派;然后又介绍了本文开发所使用的编程语言,python和Android;再者介绍了上位机和socket编程;接下来介绍了语音识别技术;又介绍了聊天机器人技术;最后介绍了语音唤醒技术。

  第三章为树莓派智能家居管家机器人的总体设计。本章讨论了智能家居管家机器人的需求分析,然后针对需求分析,给出了总体设计方案,同时还介绍了开发所需要的硬件、工具和技术。

  第四章为树莓派智能家居管家机器人的控制模块设计。本章为本文的主要研究内容之一。此章节首先给出了树莓派控制机器人移动和家电控制的详细设计方案,然后介绍了如何编程实现。然后介绍了硬件L298N模块供电设计的方案和具体接线方法。

  第五章为树莓派智能家居管家机器人智能沟通模块设计。本章为本文的主要研究内容之一。此章节首先介绍如何为树莓派选择合适的usb麦克风;然后介绍了语音识别技术及编程实现,接着又介绍了图灵机器人以及如何接入,同时还包括邮件系统的实现;最后介绍SnowBoy语音唤醒技术。

  第六章为树莓派智能家居管家机器人远程监控模块设计。此章也是本文主要研究内容之一。本章节首先给出了远程监控模块的详细设计方案,然后介绍了openresty、RMTP、FFMEPG技术,实现了树莓派推流到上位机,其次,介绍了几种拉流播放的方案,最后二次开发了daniulive SmarterPlayer,实现拉流播放。

  第七章树莓派智能家居管家机器人效果展示。本章节主要展示树莓派智能家居管家机器人的各种功能及其测试结果。

  第八章总结与展望。本章节对本文的研究内容进行总结,并根据其中存在的不足在展望中提出了未来需要改进和完善的地方。

  第二章相关技术简介

  2.1树莓派简介

  2.1.1树莓派简介

  树莓派是一个基于linux系统的、非常廉价的、只有巴掌大小的完全可编程的计算机(图2.1)。可以将树莓派连接电视、显示器、键盘鼠标等设备使用。研发树莓派的最初目的是通过低价硬件及自由软件来推动学校的基础计算机学科教育。但很快树莓派就受到计算机和硬件爱好者的青睐,他们用它学习编程,并创造出各种新奇的软硬件应用。

  树莓派仍然是一个非常年轻的装置。它是由Eben Upton和几个同事在英国发明的。它的第一个商业版本(A)型在2012年初以25美元的低价正式发售[7]。市面上的树莓派主要有两种不同的型号,分别是Model A和Model B。它们有一些不同之处,其中Model A为了降低成本和能耗牺牲掉一些功能,内存容量也只有Model B的一半。Model B+是由树莓派基金会开发的树莓派比较新的一版,它的出现解决了Model B设计中的一些问题,并且其电路布局较之前发布的树莓派型号也有明显变化。

  树莓派Model B+和它的前任型号Model B(Rev2)一样,采用的是BCM2835处理器以及512MB内存,但是固定板被重新设计了,由四个固定孔,不再是之前的两个[8]。Model B+使用更加轻便的micro-SD卡,具有40个GRIO引脚以及4个USB接口,同时还配备HDMI高清视频接口、3.5mm耳机孔、CSI排线接口以及电源接口等,并且由于电源电路的优化,Model B+大大降低了功耗。Model B+可以说是最大可能地充分利用了树莓派,所以一直受到软硬件编程爱好者的青睐,市场上经常供不应求。

  树莓派3B+采用5V电源,电流最好在2A-3A,2.5A是一个非常不错的选择。要非常重视的是过高的电压会烧坏树莓派,过低的电压则不能发挥树莓派最好的性能,甚至于不能工作。如果你需要移动电源,那么最好使用输出电压为5V,输出电流高于2A的移动充电宝。同时,树莓派还支持多种编程语言,如python,Scratch,Minecraft等,通过程序可以方便地驱动GPIO引脚以实现相应智能化功能。

  树莓派支持多种操作系统,如Ubuntu、OSMC等,官方推荐使用Raspbian,是一个基于Debian Linux的树莓派专用系统,适用于树莓派所有的型号。树莓派官网目前提供三种Raspbain系统镜像,(1)Raspbian Buster with desktop and recommended software、(2)Raspbian Buster with desktop、(3)Raspbian Buster Lite;我们一般选择(1)安装。安装树莓派的系统需要准备SD卡、读卡器、还需要相应的镜像烧制工具。

  2.1.2树莓派3B+的引脚设计

  树莓派3B+具有40个GPIO引脚,大致分为接地、电源、PWM调频三类,通过下图(图2.2)我们可以清楚地看到树莓派各个引脚的功能。Power引脚连接外接电源正极,有1和17引脚。Ground引脚为接地或者是同步引脚,当树莓派控制其它外接电源模块如L298N时,需要将L298N电源的负极与树莓派一个Ground引脚连接共地。当你需要设置引脚高低电位或者PWM调频时,就需要连接BCM引脚,根据实践经验,当你需要使用PWM调频时最好选择基数引脚连接ENABL,否则可能会出现PWM无效的现象。

  2.1.3树莓派GPIO与PWM

  树莓派内核中已经编译自带了GPIO的驱动,我们常通过一些第三方写好的库函数来完成具体的操作,例如Python GPIO库。Python GPIO库有两种引脚的编号模式,GPIO.setmodel(GPIO.BCM)和GPIO.setmodel(BOARD)。图2.3很好地展示了这两种编号模式的不同,其中BOARD模式更加符合实际引脚排列,所以使用较多。GPIO.setout(12,GPIO.out)表示将编号为12的引脚设置为输出模式,GPIO.output(12,GPIO.HIGH)表示设置12号引脚为高电平。

  所谓PWM,就是脉冲宽度调试技术,其具有两个很重要的参数:频率和占空比。频率,就是周期的倒数;占空比,就是高电平在一个周期内所占的比例。PWM方波示意图如下图(图2.4),参照图2.4,频率F=1/(T1+T2),占空比D=T1/(T1+T2)。通过改变单位时间内脉冲的个数可以实现调频;通过改变占空比可以实现调压。占空比越大,所得到的平均电压也就越大,幅值也就越大;占空比越小,所得到的平均电压也就越小,幅值也就越小。通过以上原理就可以知道,只要改变PWM信号的占空比,就可以改变直流电机两端的平均电压,从而实现直流电机的调速。

  2.2 Python简介

  Python英文意思是蟒蛇,是由Guido van Rossum在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的,是一种轻语法、弱类型的脚本语言。并且由于其开发高效和简单易学,使得python变当前非常流行的编程语言之一。类似于Matlab,Python框架中封存了丰富、强大的类库,它可以集成其它面向对象语言或底层语言编写的代码模块,这就可以具备较好的耦合性。Python主要是通过语言代码及控制语言编程的思维逻辑,将计算机语言转变为其他各种不一的语言编写模块,目前在教学过程中应用十分广泛,不但可以提高学生对于计算机语言的学习效率,还能够提高教师的教学水平,在培养高科技人才中具有重要作用[9]。

  2.3 Android简介

  Android是一个以Linux为基础开源的操作系统,主要用于移动设备。该系统最初由安迪·鲁宾(Andy Rubin)开发制作,最初主要支援手机,于2005年8月被Google收购。与很多操作系统版本类似,Android操作系统喜欢使用食物名称来命名各个版本,例如1.5的纸杯蛋糕(Cupcake)。Android拥有众多开发者及强大的社区,应用程序一般使用Android软件开发工具包,采用Java语言来开发。

  2.4上位机

  上位机是指人可以直接发出操作命令的计算机。下位机是直接控制设备获取设备状况的计算机,一般指单片机/PLC之类的。在本文,上位机指接收和转发消息的云服务器。云服务器是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。目前国内主要的云服务器运营商有阿里云、腾讯云、华为云,国际有微软云、亚马逊云等。

  2.5 Socket编程

  Socket编程是为了简化TCP/UDP通信而产生的面向程序员的技术。通常翻译为套接字。一个Socket连接包含一下信息:协议,源IP地址、源端口、目的IP地址、目的端口。只有当连接信息匹配时才能建立连接。socket编程的总体流程如图2.6所示。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

  2.6语音识别技术简介

  语音识别(ASR,Auto Speech Recognize),是以语音为研究对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语言或者文字[10]。它是一门涉及数字信号处理、人工智能、语言学、数理统计学、声学、情感学及心理学等多学科交叉的科学。这项技术可以提供比如自动客服、自动语音翻译、命令控制、语音验证码等多项应用。同时语音识别也是目前人工智能邻域最成熟的技术。与人工智能邻域大多数技术一样,语音识别主要通过样本采集、预处理、特征提取、模型训练来得到结果进行使用。其中核心部分在于模型的选择。后面深度学习与神经网络算法的引入,使得语音识别技术更加成熟。常用的端到端语音识别模型简洁,容易训练和使用,在理想情况下的性能可与人媲美。但是在恶劣的条件下,识别率不尽人意,特别是远场、高噪声等情况下的识别率较低。未来的语音识别系统,一方面在前端处理的时候,降低或者去除噪声,使语音增强;另一方面收集大量数据,让神经网络学习训练长见识,以适应各种恶劣条件下的应用场景。

  2.7聊天机器人简介

  聊天机器人是经由对话或文字进行交谈的计算机程序。能够模拟人类对话,通过图灵测试。目前主要存在两种智能聊天机器人。一种是有专门用途的,如智能客服,另一种是没有特殊预定义,服务更大范围的,如娱乐聊天机器人。智能聊天机器人实际上是为了应对信息爆炸的今天存在的信息过载问题[11],简单来说就是为了给人们过滤掉冗杂的信息,自然流畅地达到人们的期望。

  在互联网科技蓬勃发展的今天,很多互联网大企业都投入大量的人力财力去研究这个邻域的产品,比如google的Assistant、苹果的siri、百度的小度等。这些产品都让用户们在移动终端更加方便地获得需要的信息和服务,从而获得更好的用户体验。

  在信息技术飞速发展,以及移动终端逐渐普及的今天,研究聊天机器人相关的技术,对于促进人工智能以及人机交互方式的发展有着十分重大的意义。

  2.8语音唤醒技术简介

  语音唤醒是一种通过检测说话流中的关键词(热词)来响应相应动作的一种技术。它需要持续地检查语音输入流中有没有热词出现,通常情况下以下列四个指标来判断其唤醒效果:唤醒率、误唤率、响应时间、功耗水平。并且随着科技的发展,人们越来越重视保护信息,所以隐私安全的唤醒产品也应运而生,如Snowboy,使用者不需要联网也能唤醒,有利阻断了信息的泄漏。语音唤醒的应用邻域也非常广泛,例如机器人,智能音箱、汽车语音助手等。

  第三章树莓派智能家居管家机器人的总体设计

  3.1树莓派智能家居管家机器人的需求分析

  随着人工智能技术的不断发展,人们对生活质量的要求也越来越高,因此也产生了大量的家居智能化需求,促进了智能家居行业的发展。就目前的智能家居机器人应用技术来看,扫地机器人、智能音箱等智能机器人已经进入到人们的日常生活中,并且给人们的日常生活提供了非常多的便利。但是我们必须看到这些得到普及的机器人能够提供的都只是单一化的需求,为了应对复杂多样的生活需求,一个具有协调统一功能的智能管家机器人被越来越多人所期待,但是很显然的是这类的机器人系统很庞大,高昂的价格也很难以使其得到普及,并且用户的生活数据处于第三方的数据中心而安全得不到保障。因此结合对市面上普及率比较高的几种家庭智能机器人功能的分析,得出一个能够得到普及的智能家居管家机器人应具备如下几个基本要求:定制化、具有远程监控、智能沟通、检测环境、控制部分家电,可移动。定制化即用户根据自己的要求选择自己的服务器和相应的智能家居机器人功能。远程监控、智能沟通、可移动这些都是机器人的基本功能,环境检测可以实时了解家庭温度湿度、灾害预警等信息。家电控制则为人们提供更加便利了家居生活,比如人脸+指纹解锁开门、电灯开关,智能的电力调节等。这些功能再起到智能家居机器人作用的同时,也降低了成本,提高了安全等级,加大了智能家居管家机器人普及的可能性。

  3.2总体设计方案

  针对需求分析我们设计了如下方案(图3.1),通过移动设备(Android)软件进行指令下发和数据接收,例家电控制、移动控制和视频数据接收。Android端将数据发送到上位机服务器,或者从上位机接收数据。上位机采用云服务器,负责数据的接收和转发,没有数据存储,例如接收树莓派发来的媒体流数据或者将控制指令下发至树莓派。树莓派接收到控制指令后驱动相应的程序块,主要分为四个模块:移动控制、家电控制和环境检测、远程监控、语音聊天。这样便可以简单方便又相对安全地实现远程控制的智能家居管家机器。

  3.3需要的硬件简介

  本文介绍的智能家居管家机器人采用树莓派3B+作为控制中心,利用L298N(图3.2)模块驱动直流电机,采用树莓派官方推荐csi摄像头以及csi排线和树莓派官方推荐的采样率为44100Hz的usb麦克风。树莓派3B+官方价格为$35,由于其拓展了更多的usb接口,以及内嵌无线网卡模块和1G的内存等使其性能大大提升,因此受到众多硬件开发者的喜爱。L298N是专用驱动集成电路,属于H桥集成电路,驱动步进电机时仅需要改变输入端的逻辑电平,其可以接受5–35 V的驱动电压,峰值电流达3A,并且可以提供5V的外部电压,这刚好可以驱动树莓派,但是一般输入电压高于12V时,为了安全还是不要使用它给树莓派提供电源,并且通过实践发现L298N给树莓派供电的方案并不理想。

  3.4使用的工具及框架

  本文的开发平台有树莓派的Linux和移动端的Android,使用Python和Java语言进行开发,为了编程方便,一般在Pycharm上编写好Python程序后在移植到树莓派和服务器上面,android开发使用AndroidStudio。语音识别采用百度语音识别,采用snowboy唤醒以及图灵机器人实现聊天;视频监控部分采用RTMP直播推流的方式,使用openresty搭建服务器,以及使用国内开源项目daniulive移动端拉流播放。并且在整个过程中使用FFMEPG对音频和视频进行修改等。

  第四章树莓派智能家居管家机器人的控制模块设计

  4.1树莓派控制机器人移动的实现

  4.1.1方向控制详细设计方案

  通过对树莓派相关引脚高低电平的切换,可以实现对L298N模块对应输出端口逻辑电平的控制,已达到驱动直流电机的目的。本文介绍的机器人采用一个L298N模块驱动四个直流电机的方式,电机分为左右两边,每个OUT接口接一边的电机,并通过PWM调速的方式以左右两边合适的速度差实现左右转弯,电机同时正转和反转实现前进和后退。手机端发送相关指令控制机器人的移动,应考虑到树莓派在PWM机制下需要将引脚驱动进程挂起才能保证PWM的持续运行,经过实践,我们采用time.sleep()函数实现进程挂起以保证调频的持续,基于上述原因和socket阻塞机制,我们必须采用心跳机制来实现指令的下发。手机端与树莓派设置合适的心跳时间保证了运动的连贯,并且手机端要通过按下运动和放开停止的机制来实现更加合理的交互。

  4.1.2引脚的选择以及电源的连接

  根据第二章对树莓派引脚的介绍并结合实际操作,本文选择GPIO.setmodel(GPIO.BOARD)规则下的11、12、15、16引脚连接控制L298N模块的IN1、IN2、IN3、IN4输入接口,以及33、35号引脚连接控制ENA和ENB输入接口。同时将6号(GND)引脚与L298N的GND输入接口相连共地。L298N模块的OUTA和OUTB分别控制左右两排电机。并使用输出为5V、2.1A的移动充电宝作为树莓派的电源,六节干电池作为L298N的外接电源。需要注意的是,当你在连接ENA和ENB接口时需要将其跳帽取下,否则电机将以最大速率运行,并且在L298N外接电源大于12V时将5V使能跳帽取下,防止烧坏。

  4.1.3阿里云服务器实现消息转发

  鉴于实际情况,本文采用阿里云ESC学生机作为上位机实现数据的转发,该服务器具有100%基线性能,1M的外网带宽即单核2G内存。从配置上来说,这样的服务器作为控制消息转发服务器足够了。本文使用Python编写服务端脚本,并定义两个连接socket_android=socket.socket(socket.AF_INET,socket.SOCK_STREAM),socket_raspberrypi=socket.socket(socket.AF_INET,socket.SOCK_STREAM)接收来自手机端的指令,同时转发到联网的树莓派以实现驱动。由于Socket编程可以跨平台,其实质就是TCP/UDP连接,所以完全可以通过Android和python编程实现通信。这里可能会遇到Socket连接不上,或者超时,原因是阿里云没有开启对应的端口,需要手动开启阿里云的相应端口,并关闭防火墙,或者在防火墙开启相应端口。

  4.1.3 Android socket编程实现移动设备远程控制

  为了能够方便地对机器人进行远程控制,我们把控制系统放在android移动端上。按照4.1.1的详细设计,android端需要向阿里云服务器发送“心跳”形式的控制指令,为了实现这一功能,本文在尝试了使用Thread.sleep()、postDelayed()等方法后发现并不能达到预期的效果。由于需要使用socket和服务器连接,但是socket是一种特殊的TCP连接,因此每次socket send数据后都会与服务器断开并且下一次创建连接用不同的端口去连接服务器,所以需要不断创建socket线程,而不能使用一个线程去循环。所以使用了Timer、TimeTask和handler结合的方法通过TimeTask定时创建子线程去实现“心跳”的功能。

  为了优化交互效果,本文采用按下发送控制指令,抬起停止的功能去实现button按钮。所以使用一个switch分支去捕捉button按钮的Action,当event.getAction()捕捉到MotionEvent.ACTION_DOWN时启动定时任务,捕捉到MotionEvent.ACTION_UP/MotionEvent.ACTION_CANCEL时定时任务停止,具体实现如图4.3。

  4.1.4 python编程实现树莓派接收消息以及驱动

  本文使用python socket编程在树莓派上接收来自服务器转发的指令,并通过指令去驱动树莓派引脚以驱动智能机器人。首先要使用类封装好智能小车移动的方法。在python工程中,使用items_car.py封装好小车轮子、前进、后退、左右转的方法,然后通过接收的指令去驱动相应的模块,如图4.4。并且由于树莓派不能主动地通过外部触发与服务器创建socket连接,而且服务器要实现指令的转发必须要和树莓派产生固定端口的连接,否则接收到android来的指令时,Socket server并不能主动去寻找树莓派client端。因此,本文采用Socket长连接的方式去实现固定端口的连接,实现代码为client.setsockopt(socket.SOL_SOCKET,socket.SO_KEEPALIVE,1),每次树莓派要连接server端,需要重启server端相关脚本,然后重新启动树莓派端相关脚本,这样便可以实现固定端口的长连接。长连接也是基于“心跳机制”来实现的,通过定时发送心跳包来维持client与server端socket的持续连接,至此,大家或许会有疑问,为什么上文的android不采用长连接的方式发送心跳包,原因很简单,由于移动端需要不同的按钮,并且按钮的触发没有一定规律,例如,当你触发前进按钮时,你可能接下来会转弯,所以前进指令就必须停止,转而转弯指令开始发送。所以采用定时任务的方式是最贴近现实效果的。反观此模块,与服务器连接的只有树莓派的一个程序,并且它指作为接收端,是被动的,单一的,所以server端其实质就变成了发起连接的主动端,为了实现这一角色的反转,采用长连接是非常合适的方法。

  4.2 L298N模块驱动直流电机

  4.2.1 L298N驱动电机的设计方案

  本文采用一个L298N驱动四个直流电机的方案。一个L298N一般来说它的输入输出接口只能满足两个直流电机,但是由于本文机器人需求的特殊性,使用一个L298N模块驱动四个电机也能满足功能需求,只是需要将每两个电机作为一组,使用相同的电平信号,发出相应的动作。所以我们将小车轮子分为左右两组,每一组接入L298N模块的一组OUT接口,这样便可以轻易通过控制电平来实现前进、后退、左右转基本的方向控制。由于本文需要使用PWM调速,所以在将L298N连接树莓派相关引脚后需要将ENA和ENB的跳帽取下,否则PWM将不起作用,电机将全速运行。

  4.2.2树莓派与L298N的接线方法以及L298N电源的选择

  本文通过杜邦线母对母线将GPIO.setmodel(GPIO.BOARD)规则下的11、12、15、16、33、35号引脚连接L298N模块的IN1、IN2、IN3、IN4、ENA和ENB输入接口。同时将6号(GND)引脚与L298N的GND输入接口相连共地,以保证树莓派电平与L298N电平的统一。L298N模块的OUTA和OUTB分别控制左右两排电机。并使用六节干电池作为L298N的外接电源。需要注意的是,当你在连接ENA和ENB接口时需要将其跳帽取下,否则电机将以最大速率运行,并且在L298N外接电源大于12V时将5V使能跳帽取下,防止烧坏。

  4.3树莓派智能家居管家机器人家电控制的实现

  本文通过移动端和语音控制来实现机器人对家电的控制。以控制电灯为例,在语音唤醒机器人后,说出包含“开灯”字样的语句就能点亮小灯,说出包含“关灯”两词的语句就能控制小灯熄灭。在移动端通过按钮也能控制小灯的开关。语音控制使用百度语音,将说的话识别为文字,然后使用字符串匹配,当文字中出现相应控制词时调用相关程序。Android使用socket配和和button的click事件下发指令。

  4.4树莓派智能家居机器人移动的测试、调试及总结

  在将移动控制的整个系统代码实现完成后还需要进行实地调试与检测。首先是能不能保证基本功能的正常运行,比如android按钮按下发送“心跳”指令是否存在冲突,方向与实际行驶是否一致,速度合不合适,能否长时间运行等,其次要优化用户的交互感,比如心跳时间的长短与树莓派端小车引脚PWM sleep()时间的长短如何分配才能让小车行驶更加流畅和不宕机。以及手机端界面的安排是否合理,消息反馈是否及时和简明。经过多次测试,发现移动端系统能够稳定运行在各个平台,并且也能实现基本的移动功能,调试了合适的心跳时间及树莓派端python驱动引脚sleep()时间,使得小车在运行时更加平稳连贯。发现了L298N外界刘杰干电池电源可能不足以保证四个电机长时间特点功率的运行,后期做出电源的优化,将采用3.7V的18650锂电池组来供电L298N。并且将会对车身进行改造,使其看上去更加整洁,重量分布更加平均。

  第一次使用树莓派来开发,首先很怕把树莓派烧掉,所以开发的前期比较慢,每一个动作都要经过很多资料的收集学习才敢进行,随着项目的深入,发现树莓派的使用其实也非常方便简单,甚至在很多方面比电脑强,比如在自动化控制上。树莓派的引脚功能也非常奇特,有时候我按照引脚功能图尝试去驱动引脚但是始终得不到我想要的结果。经过很多次的尝试,如果想要对树莓派3B+使用PWM调频,最好选择奇数号引脚,偶数号引脚可能会不能驱动,原因不详。并且一定要记得将树莓派与L298N模块共地,否则由于信号不能同步会导致驱动失败。在使用PWM时,还需要注意的时ENA、ENB跳帽要取下,把杜邦线插入第一个引脚,并且需要将进程挂起,否则调频会一闪而过,你会看见轮子轻微转动一下。挂起进程有很多方式,input输入等待、sleep()函数是比较常用的方式。

  第五章树莓派智能家居管家机器人智能沟通模块设计

  5.1树莓派之usb麦克风的选择

  树莓派没有提供音频输入设备和外放设备,需要自己接上去。但是树莓派提供相应的麦克风阵列接入麦克风,或者通过usb接口外接麦克风。本文选择比较简单的USB麦克风接入。关于USB麦克风,树莓派官方推荐的是图5.1这种麦克风,它不仅价格便宜方便接入,而且如果操作得当,作为实验方向也完全能够满足语音识别的需求。需要注意的是,最好选择免驱动的USB麦克风,有些麦克风有驱动但是树莓派上安装不了,使用不了。当然也可以选择HIFI声卡以提高声音品质。鉴于各种原因,本文使用图5.1展示的麦克风,它具有44100Hz的采样率,收声效果也比较好,最好使用直流充电宝作为树莓派的电源,这样可以很大成度地减少麦克风因为不稳定电流而带来的杂音。

  5.2树莓派智能家居机器人语音识别的实现

  5.2.1百度语音识别在树莓派上的使用

  本文采用百度短语音识别标准版pythonSDK来实现语音识别。百度语音识别有离线和在线两个版本,一个很明显的区别是离线的SDK比较简单,代码量也比较少。但是为了更加深刻学习API接入,本文采用在线语音识别的编程方法接入百度语音识别API。根据百度语音给出的API,我们需要声明如下字典参数data={'grant_type':grant_type,'client_id':API_KEY,'client_secret':SECRET_KEY}。'grant_type’=“client_credentials”,即应用公钥、密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open API,并且需要开发者提前向百度开放平台申请,成功对接后方能使用。'client_id':API_KEY和'client_secret':SECRET_KEY是百度语音提供给申请者的密钥。然后通过requests发送请求到https://openapi.baidu.com/oauth/2.0/token获得token,然后再发送请求到API获得识别结果。需要注意的是,百度语音对上传的音频格式有严格的要求:16k采样率、16bit位深、单声道。所有由于我们的麦克风采样率为44100Hz的,并且为wav格式,需要对格式和采样率进行修改,否则将会识别不出来结果或者得到错误的结果,百度语音会反馈说音频质量很差,这一点需要特别注意。

  树莓派python使用麦克风录音需要用到PyAudio库。使用PyAudio库对流数据进行存储需要声明相关参数:framerate、num_samples、channels、sampwidth。Framerate代表采样率,需要和麦克风一致,否则会出错。num_samples表示流数据缓冲区,再读去读取流数据时使用,这个缓冲区尽量设置大一点,如40960,否则将会导致你的录音被快放。还有一个就是在使用stream.read()数据的时候,应该将exception_on_overflow=False(如图5.2),否则会报堆栈溢出的错误。Channels、sampwidth分别表示存储声道数和位深,sampwidth值为8的倍数,sampwidth=2即表示16位深。

  5.2.2 FFMPEG的安装及修改音频的采样率

  为了将音频转为合适的格式,我们需要在树莓派上安装FFMPEG工具。由于树莓派自带了H.264的硬件编解码器,所以避免了因为FFMPEG编解码所带来的内存消耗。下面我们将介绍树莓派配置FFmpeg使其支持硬件编解码器并编译安装的过程。

  1)安装git

  2)下载X264源码

  3)进入x264目录并新建一个名为config_x264.sh的文件

  4)在config_x264.sh中添加如下(图5.3),然后增加执行权限

  5)依此进行以下每一行命令:

  6)下载源码编译安装ffmpeg(此部分教程太多,故不展示)

  编译安装好FFMPEG后我们就可以处理录制好的音频。基本使用方式为:ffmpeg[[options][`-i’input_file]]{[options]output_file}。我们使用python调用的方式对音频进行处理以满足要求(图5.5)这样便可以将音频修改为符合百度语音要求的格式。

  5.2.3语音合成以及在树莓派上播放

  将语音转文字后,还需要把从图灵机器人那里得来的文字转为语音,通过调用百度语音合成完成这一功能。对于语音合成,我们则使用离线的百度语音合成SDK,将文字转换为mp3格式的音频。百度语音合成有几个重要参数,vol表示音量,spd表示语速,per表示发音人物(图5.6)。完成了文字转语音后还需要在树莓派上将其播放。首先要接入扬声器设备,我们选用带有3.5mm接头的播放设备接入树莓派。同时为了让树莓派能够播放mp3格式的音频,我们还需要在树莓派上安装Mplayer播放器。并通过os.system(cmd)以命令行的形式在代码中播放音频。

  5.3树莓派接入图灵机器人实现智能问答

  5.3.1图灵机器人简介

  图灵机器人是国内第一家个性化智能机器人开放平台,为广大开发者提供智能机器人API端口。图灵机器人基于DeepQA深度问答技术,对中文的识别准确率高达90%,是目前中文语境下高智能度的机器人[12]。2014年11月,图灵机器人第一款产品正式发布,到目前为止,它已经为为超过23万家企业和开发者提供服务,累计响应请求量超1462亿次。在家用服务机器人、商用服务机器人、儿童陪伴机器人、智能客服系统、智能车载系统以及智能家居控制系统等软硬件领域占有绝对性优势[13]。开发者可以申请一个账号,然后每天可以得到100次免费的API调用,也可以购买相关的产品(2020年)。图灵机器人的返回值为json格式,需要自己解析拿到其中有价值的数据。并且开发者还可以导入自己的预料库以及设置定制个性化机器人。

  5.3.2树莓派接入图灵机器人的实现

  通过python2调用图灵机器人的API来实现智能对话。要想接入图灵机器人,首先要在获得一个apikey和userid,把它们放入一个json数据中,然后通过urllib2.Resquest()函数设置连接,urllib2.urlopen()去连接,得到数据,最后解析返回的json数据,拿到相应的结果去做语音合成。需要注意的是,根据问题的不同,图灵机器人返回的数据格式可能会有变化,有的会有url,如图片,有的没有,此时就需要判断json格式中是否存在url,否则将会导致获取数据失败。并且你可以初始化自己的地理位置,以方便图灵机器人为你提供更加准确贴心的服务,如询问酒店、菜价、火车站等。

  5.3.3使用Python SMTPLIB发送消息到邮箱实现管家提醒功能

  为了让系统更加贴心,我们会将图灵机器人返回带有url的消息转发到邮箱,以方便用户查看。所以使用了python SmtpLib库连接QQ邮箱SMTP服务,然后在将url转发到163邮箱。不仅如此,SmtpLib库还可以设置邮件昵称,让你一看邮件就能快速找到智能机器人的提醒。

  5.4 SnowBoy实现语音唤醒

  5.4.1 Snowboy简介

  Snowboy是KITT.AI开发的人工智能软件工具包。Snowboy的核心模块由Chen Guooo Chen创建,他也是开源语音识别软件Kaldi和Microsoft Cognitive Toolkit CNTK的贡献者。2017年百度全资收购KITT.AI公司,把KITT.AI公司的语音能力和自然语言处理能力融入到百度平台中,全面免费向百度的合作伙伴赋能开放。这是一款高度可定制的唤醒词检测引擎,可以用于实时嵌入式系统,并且始终监听(即使离线)。当前,它可以运行在Raspberry Pi、(Ubuntu)Linux和Mac OS X系统上。并支持运行在python、Java、go、perl、ios、Node、c++/c,Android环境中。Snowboy具有以下的特性:

  1)高度可定制。

  2)一直监听,但是保护您的隐私。不使用互联网,并没有将你的声音上传到云中。

  3)轻巧的、可嵌入,

  4)Apache协议

  Snowboy的使用方法也比较简单,在其官网[14]上传或者录制三段热词音频,然后训练即可下载模型,然后可以通过官方demo给出的snowboydecoder解码器进行调用开发。源码在snowboydetect中,比较难懂,直接学习官方demo比较简单。

  5.4.2解决Snowboy和百度语音使用Pyaudio录音的冲突

  由于snowboy的热词检测也是基于Pyaudio库,所以当唤醒snowboy后就需要将snowboy关闭,然后开始录音,进行百度语音识别。录音完后就必须打开snowboy等待下一次唤醒。否则在唤醒后不能录制语音上传识别,因为Pyaudio已经被snowboy占用了。

  通过仔细阅读源码,发现snowboy snowboydecoder.py中通过terminate()、start()、audio_callback()等函数来进行热词检测,并且主要的功能在start()函数中,start()函数中通过一个while循环不停去检测Pyaudio中的缓冲区是否出现热词,当检测到热词时,state="PASSIVE",接着进入相应代码块,首先是打印日期等基本信息,然后播放语音唤醒。这时我们就需要调用terminate()函数停止snowboy,然后启动语音模块,并退出while循环(图5.9),等到语音录制结束后启动snowboy(图5.10)。这样就完成了整个语音唤醒功能。

  5.4.2 Snowboy、百度语音、图灵机器人实现智能家居机器人智能沟通

  我们将百度语音封装在record.py文件中,图灵机器人封装在ai_robot.py中,图灵机器人封装在snowWake.py中。通过在snowWake.py调用snowboydecoder.py来开启智能沟通模块。完整的机器人不停地检测热词,当你说出热词并被检测时大概会有一秒的等待,然后你可以说出想问的问题,百度语音识别成为文字发送给图灵机器人,图灵机器人返回结果语音合成,然后语音播报结果,最后通过邮件系统将发送到邮箱(如图5.11)。

  5.5本章小结

  本章利用图灵机器人、snowboy、百度语音实现了管家机器人的智能沟通模块。图灵机器人还提供微信接口,可以实现类似QQ小冰的功能,并且图灵机器人常常被用作智能客服,网购服务你的售后很有可能就是商用的图灵机器人哦。在snowboy的使用过程中发现,很多时候训练得到的模型都不能被唤醒,我自己总结了几个原因,一是可能训练模型用的麦克风不是同一个麦克风,二是麦克分的杂音太大,导致效果不好。还有就是在训练的时候没有调试好敏感度。百度语音的使用听上去简单,但其实过程还是有点复杂的,尤其是对音频格式的严格要求,小白入门还需要折腾一番。

  第六章树莓派智能家居管家机器人远程监控模块设计

  6.1远程监控模块的详细设计方案

  本文在探索了几种监控方案后最后选择了通过RTMP直播推流和拉流的方式实现实时远程监控。树莓派自己可以通过raspivid可以录制视频,然后通过FFMPEG推流到云服务器,云服务器搭用Openresty搭建RTMP服务器,最后android端使用daniuliu SmarterPlayer进行二次开发拉流实现视频播放。并且考虑到CSI摄像头视线的原因,采用多个铜柱将摄像头高度提升,以确保视线的清晰。为了降低视频的延时,我们还需要调整FFMEPG的推流参数、优化Android播放器等,以确保延迟降低在2秒以内。对于云服务器来说,外网带宽越大,视频延迟也就越小,但是由于价格的原因,自己也只能在阿里云学生机上做这个实验。但是也能达到低延时的要求。

  6.2树莓派智能家居机器人实时推流到上位机

  6.2.1树莓派csi摄像头的安装与使用

  树莓派可以提供CSI摄像头接口,同时也支持USB摄像头。本文采用树莓派CSI摄像头,具有500万像素,完全能够满足需求。首先要购买一个合适长度的csi排线,然后将树莓派CSI接口的封条掀开,然后再将CSI接口的开关拔起,记得那个开关是可以拔起的(如图6.2),千万不要硬插,会折断CSI排线。最后关闭开关即可。在摄像头端也是通过CSI排线以同样的方式连接的。千万要注意的是CSI排线不能被折了,否则将会导致摄像头不能被树莓派找到,或者是提高视频延迟。

  6.2.2树莓派摄像头模块和FFMPEG推流简介

  树莓派自己带有的raspivid是使用摄像头模块捕获视频的命令行工具。连接并启用摄像机模块后,使用以下命令录制视频:raspivid-o vid.h264。这会将5秒的视频文件保存到此处指定的路径vid.h264(默认时间长度)。其基本的参数如:-a“ABC%Y-%m-%d%X”参数可以现实一些文字或日期,-b使用每秒的位数,因此10Mbit/s将为-b 10000000。对于H264、1080p30,高质量比特率应为15Mbits/s或更高。最大比特率是25Mbits/s(-b 25000000),但是在1080p30分辨率下,超过17Mbits/s的速度将不会显示出明显的改善。-w、-h表示宽和高。w应介于64和1920之间。h应介于64和1080之间。-t表示录制的时间,如果未指定,则设置为5秒。设置为0表示应用程序将连续运行,直到使用Ctrl-C停止为止。-ae指定注释大小,文本颜色和背景颜色。例如:raspivid-w 720-h 1440-b 15000000-t 0-a 12-a 1024-a"CAM-1%Y-%m-%d%X"-ae 24,0xff,0x808000。

  FFMPEG第五章已经介绍过了,它是一个非常强大的工具,初略处理音频外,还可以处理视频,加水印等,本节主要介绍它的推流参数:-re代表按照时间戳读取或发送数据,尤其在作为推流工具的时候一定要加上该参数,否则ffpmeg会按照最高速率向流媒体不停的发送数据。-i filename:指定输入文件名。-s size:指定分辨率(320x240)。-tune zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。-preset通过-preset的参数调节编码速度和质量的平衡,-preset ultrafast速度最快,但是视频质量也会下降。例如:ffmpeg-re-i--s 1280x720-tune zerolatency-vcodec libx264-preset ultrafast-b:v 800k-f flv-g 5 rtmp://。

  6.2.3 Openresty和RTMP简介

  OpenResty在其官网上的定义是:OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效地变成一个强大的通用Web应用平台。这样,Web开发人员和系统工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,直接实现复杂的HTTP/TCP/UDP业务逻辑,快速构造出足以胜任10k乃至1000k以上单机并发连接的高性能Web应用系统。开发OpenResty应用主要包括两方面的工作,分别是编写Nginx配置文件和编写Lua代码,前者决定了Lua代码运行的位置和时机,后者决定了具体的功能实现[15]。

  RTMP(Real Time Messaging Protoc01)实时消息传输协议,支持端对端的可靠链接和完整的时间戳序列,采用TCP方式传输FIⅣ报文,面向连接提供可靠的数据传输来减少丢包,降低了媒体流传输中丢包对播放质量的影响和失真。FLV封装以二进制编码产生的文件较小,经过高度压缩和序列化后,可靠有序传输减小网络传输消耗,视频加载速度快,占用CPU资源小,节省带宽,实现了低码率下的高速传输,适合窄带下实时播放媒体流[16]。RTMP属于应用层协议,其封包结构由包头和包体组成。

  6.2.3上位机使用openresty搭建rtmp服务器

  在阿里云上安装openresty搭建RTMP服务器,首先下载安装相关的依赖库,yum install readline-devel pcre-devel openssl-devel gcc。然后编译openresty并安装。然后将nginx-rtmp-module-master.tar.gz解压到OpenResty的源码目录下,并添加开机启动(图6.4)。最后配置nginx.conf中的rtmp即可搭建成功RTMP服务器。然后通过推流工具推流到相应的地址就可以成功实现推流。

  6.2 Android RTMP播放器的几种选择方案

  为了能够再移动端拉取视频流并播放,我们需要实现一个播放器,再准备的前期,我们尝试使用了几种不同的播放器实现方案。当然最简单的是使用现有的软件,例如VLC和FFplayer。但是我们还需要在在软件上开发自己的而控制模块,并且这两个软件带来的延迟都是不可接受的。那就只能自己写一个或者选择开源的工具进行二次开发。

  首先我们介绍的是bilibili开源的ijkplayer。ijk官方提供的lib是不支持https/rtmp直播流的播放的,所以我们需要自己修改参数,手动编译,这个编译过程非常的麻烦,需要在ubuntu上。编译完成后会得到一个ijkplayer包,但如Android项目即可。这个方案你叫复杂,而且实际得到的效果延迟依然很大,大概在20s左右,当然和我的服务器也有关。第二个是可以Vitamio框架去实现,这个框架已经非常成熟,可以方便地实现声音控制、亮度调节等功能。第三是基于ijkplayer开发的PLDroidPlayer,它是七牛推出的一款免费的适用于Android平台的播放器SDK,采用全自研的跨平台播放内核,拥有丰富的功能和优异的性能,可高度定制化和二次开发。最后便是本文采用的daniuliv SmaterPlayer,大牛也是基于哔哩哔哩的ijkplayer开发的,但是在我所探索的技术中,daniulive正真降低了直播流的延迟,而且效果非常突出。但也可能我对上述其他技术使用不当,欢迎指正。

  6.3 Android移动端使用daniulive SmarterPlayer实现拉流

  6.3.1 daniulive简介

  daniulive始于2014年,国内外为数不多致力于极致体验的超强全自研跨平台(windows/android/iOS)流媒体内核,通过模块化自由组合,支持实时RTMP推流(支持RTMP扩展H.265推流)、RTSP推流、RTMP/RTSP直播播放(支持RTSP/RTMP H.265)、RTMP推送播放整体加密方案(AES/SM4)、实时录像、多路流媒体转发(RTSP转RTMP,RTMP转RTMP)、音视频导播、动态视频合成、音频混音、一对一互动直播、内置轻量级RTSP服务、RTSP网关服务等,比快更快,业界真正靠谱的超低延迟直播SDK(1秒内,低延迟模式下200~400ms)[17]。

  6.3.2对daniulive SmarterPlayer的二次开发

  首先我们从daniulive官网下载Android播放器的demo,使用AndroidStudio打开,可以很清楚地看到文件目录,我们只需要打开SmartPlayer在里面进行二次开发就可以了(图6.5)。首先是要把之前的控制模块嵌入到工程中。然后是对界面的一个简化和优化,由于大牛播放端采用的是动态生成的布局,所以通过修改SmartPlayer类中的一些方法即可去掉多余的功能。为了降低延迟,我们将缓冲区默认的200ms改为0。如果需要集成,需要注意的是,确保SmartPlayerJni.java放到com.daniulive.smartplayer包名下,Smartavengine.jar、libSmartPlayer.so加入到工程。修改后的移动端界面如图6.6.

  6.3.3降低实时流播放延迟的一些经验和总结

  树莓派将视频推流到服务器后我是用VLC播放器抓流播放,第一次播放延迟竟然达到了40s,很显然这是不能满足要求的,随后我便查阅了很多资料,得到很多启发。首先要优化推流端,通过优化推流参数来减少延迟。其次还要选择合适的服务器架构,以及配置较高的服务器。再次就是要再播放端优化缓存、实现秒开等。还有一个非常重要的是CSI排线不能被折,我之前调试很多次,一直找不到原因,直到需要购买一个更长的CSI排线我才发现,原来的线也会影响延迟。最终把延迟降到1秒,最然画质差了一点,但是最基本的要求得到满足,并且让我认识到实时流的开发任重道远。