0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一款通过智能小车来实时视频远程看房的创新项目

BYXG_shengwang 来源:未知 作者:李倩 2018-07-26 17:03 次阅读

本文的三位作者正阳、海洋、阿力,是来自不同公司工程师,将 Agora SDK 与智能小车结合,开发了一款通过智能小车来实时视频远程看房的创新项目。本文将从方案设计到具体实现,详实分享他们的开发经验。三人也凭借该项目,在7月1日结束的 Agora RTC Hack 上海站编程马拉松获得大奖。

创意与构思

此前听到多很多次“黑客马拉松”这样的活动,一群来自不同地方的人聚在一起,组队、构思、开发,在48小时内做出产品雏形。我们三人抱着去听听别人的创意,重在参与的想法参加了这次比赛。对于想要做的东西,在比赛前也只是有一个大概的方向:

构思的方向依据我们擅长的部分来组合拼接,这就得说到我的两位给力队友海洋、阿力;海洋是嵌入式软件工程师,汽车电子方向,写个驱动做个小车手到擒来。阿力是后端工程师,具备处理服务器端和前端页面的能力。

于是队伍有了嵌入式和云端两部分的能力,技术构思的方向是云端为嵌入式赋能。希望有一个小车,小车可以传递回视频图像,视频图像可以实时传给多个用户,用户在得到授权之后,实现远程对小车的操控。

方案设计与分工

出于这样的构思,实现架构如上图所示。现在有了一个基本架构,也清楚了我们要实现的功能,接下来就是分工了。考虑到我们各有所长,分工如下:

o4YBAFtZjp2AT2KHAADIu0deBCM248.png

o4YBAFtZjp2ASGzqAAAnqVClPZo189.png

硬件开发开始

小车采用了是4轮伺服电机驱动,搭配有视频采集模块、伺服电机驱动模块、STM32控制模块和摄像头云台模块,安装后整体效果图如下:

o4YBAFtZjp6APv-WAABmAbKZyJY446.png

图:效果图

用户在远程操控小车各种动作之前,需要小车通过wifi连接到互联网。用户可以通过上位机Android App 或网页前端)控制小车前后左右移动或控制云台调整摄像头方向。

视频采集模块包含有 Wi-Fi 模块,可以连接到wifi热点为视频传输提供网络基础。也提供 HDMI 接口与显示器连接,方便用户调试。摄像头通过 USB 的方式与视频采集模块连接,我们采用免驱动的天敏6602型号摄像头,分辨率可以达到640*480,并能够自动调焦。

STM32控制模块采用 Arduino 接口与伺服电机驱动模块连接,STM32模块负责控制电机、云台信号的产生,并由伺服电机驱动模块直接驱动电机工作。伺服电机输入电压为6~12V,直流驱动。

工作原理

小车上的视频采集模块采用了定制的 Android 系统,提供网络连接、指令转发和视频流采集、传输功能。当上位机通过远程服务连接到小车后,上位机可以请求到当前小车摄像头上的视频信息;同时,视频采集模块也将上位机上传来的控制信号解析为指定格式和功能的协议数据,并通过串口发送到 STM32控制模块。

小车上的 STM32控制模块在接收到相关控制信号后,调整输出脉冲信号的占空比,由驱动板转换输出电平后直接控制伺服电机或云台模块做出相应的动作,从而完成上位机用户想要的操控功能。

控制信号协议

对于只需要实现简单的小车控制的话,我们只需要实现通过串口向 STM32控制模块发送控制信号即可,简单的控制信号协议如下:

o4YBAFtZjp6Ae8S8AABmDGPWEy0662.png

Android SDK 的定制

开发工具

为了实现我们想要的实时视频与小车的远程控制功能,我们需要采用声网的视频通话SDK,并运行在 Android 开发板上。开发板,我们选用了 Firefly的 RK3128平台,采用 Cortex-A7 架构四核1.3GHz 处理器、Mali-400MP2 GPU,板载千兆以太网口、2.4GHz Wi-Fi 和蓝牙4.0,支持 Android 与 Ubuntu 双系统。

o4YBAFtZjp-AHX0FAAHAtYx1ja0738.png

定制串口驱动

为了实现 RK3128 对小车的控制,我们需要实现 RK3128 通过 USB 转串口模块与 STM32控制模块通信。因此我们首先要重新配置 RK3128 内核,使得RK3128支持 USB 转串口驱动程序。

首先下载完 RK3128 Android SDK 并先验证文件 MD5值:

md5sum/path/to/fireprime_android5.1_git_20180510.tar.gzfce0e6d65549939167923260142b2c1efireprime_android5.1_git_20180510.tar.gz

确认无误后解压:

mkdir-p~/proj/fireprimecd~/proj/fireprimetarxvf/path/to/fireprime_android5.1_git_20180510.tar.gzgitreset--hardgitremoteaddbitbuckethttps://bitbucket.org/T-Firefly/firenow-lollipop.gitgitpullbitbucketfireprime:fireprime

配置并编译内核:

cd~/proj/fireprime/kernelmakerk3128-fireprime_defconfigmakemenuconfigmake-j8rk3128-fireprime.img

其中make menuconfig这一步需要勾选上Device Drivers —> USB support —> USB Serial Converyer support —> USB Serial Console device support / USB Generic Serial Driver,并勾选上 CP210x / CH341 / FTDI / PL2303 等常用串口工具设备。

o4YBAFtZjqCAclMZAAEuWiGq27A412.png

编译 Android 系统:

cd~/proj/fireprime.build.shmake-j8./mkimage.sh

最后编译完成后烧录分区镜像,并插入USB转串口工具查看系统dmesg是否出现以下log信息:

[2213.003173]usb1-1.3:newfull-speedUSBdevicenumber6usingrockchip_ehct[2213.113759]usb1-1.3:NewUSBdevicefound,idVendor=10c4,idProduct=ea60[2213.113839]usb1-1.3:NewUSBdevicestrings:Mfr=1,Product=2,SerialNumbe3[2213.113883]usb1-1.3:Product:CP2102USBtoUARTBridgeController[2213.113921]usb1-1.3:Manufacturer:SiliconLabs[2213.113956]usb1-1.3:SerialNumber:0001[2213.120813]cp210x1-1.3:1.0:cp210xconverterdetected[2213.209852]usb1-1.3:resetfull-speedUSBdevicenumber6usingrockchip_et[2213.320161]usb1-1.3:cp210xconverternowattachedtottyUSB0

出现串口设备附着到 ttyUSBx,即说明定制串口驱动成功。

以上为全编译Android SDK的方法,需要编译 Android 系统,相较于仅编译内核而言比较费时。我们可以在上述make menuconfig时将需要的串口驱动程序勾选为 M,通过make modules的方法,将驱动编译成.ko文件,然后在 Android系统开机时自动加载驱动程序:

首先将.ko驱动程序文件复制到 Android 文件系统内

adbshellsumount-oremount,rw/mkdir/moduleschmod777/moduleschown-Rnobody:nobody/modulesexitexitadbpush./xxxx.ko/modules

编写启动运行脚本/data/serial.sh

#!/system/bin/shinsmod/modules/xxxx.komknod/dev/ttyUSBc2400

修改init.rc并添加运行自己的脚本

serviceserial/system/bin/sh/data/serial.shuserrootoneshot

在 App 端实现视频传输

视频传输和信令传输的部分,我们通过声网 Agora SDK 来实现。由于涉及到与嵌入式开发板的结合,我们主要参考的是声网在 Github 提供的各种案例中的抓娃娃机 demo。示例代码中的结构图如下:

示例代码有视频传输的部分,控制信令需要参考声网信令文档自己完成。

o4YBAFtZjqCAdefPAABCb_AkC7c733.png

声网 SDK 的集成

1. 首先申请AppID

o4YBAFtZjqCAS2jXAABnZAsGj6g500.png

Android APP 中在 res/values/strings_config.xml加入如下内容,将agora_app_id进行配置

1a486ee31a30xxxxxxxxxx

2. 将.jar文件拷贝到libs/中

因为用到信令和视频传输两部分,需要两个.jar 文件分别为 agora-rtc-sdk.jar和 agora-sig-sdk.jar

3. 在 src/main/jniLibs 加入 armeabi-v7a 与其中的.so文件

o4YBAFtZjqCAOb24AAAVc-6aeFM619.jpg

并在 build.gradle 中确定拥有如下描述:

dependencies{compilefileTree(dir:'libs',include:['*.jar'])testCompile'junit:junit:4.12'compile'com.android.support:appcompat-v7:23.4.0'}

就此,使用示例代码可以顺利开启视频传输功能。

用信令让 App 控制小车

信令的实现

信令的具体使用方法见声网官网文档中心的参考,这里就不进行详尽描述了。主要使用的函数如下:

//初始化信令SDKm_agoraAPI=AgoraAPIOnlySignal.getInstance(context,appID);//登录Agora信令系统m_agoraAPI.login2(appId,account,token,uid,deviceID,retry_time_in_s,retry_count)//////////////点对点测试///////////////发送点对点消息m_agoraAPI.messageInstantSend(account,uid,msg,msgID)//设置对端收到消息回调(m_agoraAPI.onMessageInstantReceive(account,uid,msg){//codethere}/////////////频道测试/////////////////加入频道m_agoraAPI.channelJoin(channelName)//发送频道消息m_agoraAPI.messageChannelSend(channelName,msg,msgID)//设置对端接收到频道消息回调m_agoraAPI.onMessageChannelReceive(channelID,account,uid,msg){//codethere}////////////////////////////////////退出Agora信令系统m_agoraAPI.logout()

Android App 操作串口

对于小车端的 Android App 得到信令之后需要串口发送数据。因此如何实现 Android App 操作串口。这里简述两种方案:

采用 Android 系统给出的架构进行处理, Android 带有串口demo代码,名称为 SerialPort。这里注意两点,此处的代码依赖于 JNI 工具和 NDK,如果没有完整安装在使用项目代码的时候会出现问题。另外,串口操作不方便使用 Android 模拟器进行测试,对于没有串口的设备,在开启串口的动作时,会报错并可能导致程序退出崩溃。

选择使用 Android 代码发送 shell 命令的方式,直接模拟 Linux 的 shell 控制代码,示例 echo ‘aa’ > /dev/ttyUSB0 将aa发送到串口ttyUSB0,这样做的好处时代码本身简单,串口直接调用底层。

对于短时间实现功能来说,方案2是更容易实现的方法,这里需要非常注意的一点,需要重新编译 Android 的 framework 层给 App 赋予 root 权限

当信令解析完成,串口调试通过,就可以实现远程控制小车的行进了。

最后:服务器端的部署

为了实现用户可以方便通过手机或者电脑在线实时看房,我们需要通过 Web 端连接小车的 Android App 端,获取实时传输过来的视频内容。在我们的设想中,用户可以通过远程控制小车,这样可以方便用户了解房屋各个方面的情况。综上所述,我们需要实现如下两个功能:

具有视频连接功能

具有远程遥控功能

幸运的是,通过声网提供的服务,我们可以很便捷的搭建这两个服务。在本项目中,我们使用声网的视频 SDK 实现网页端和小车 App 端的视频连接,通过信令 SDK 发送消息,去控制小车的前后左右行走和摄像头上下左右摆动。

罗列一下我们使用到的工具:

声网视频通话Web SDK 及文档,用来实现远程的视频交互功能;

声网信令 SDK 及文档,用来实现远程遥控智能小车;

服务器,用于部署静态页面;

实现视频连接和发送消息

先在页面上引入视频和信令的 SDK。然后我们先来实现视频连接。

//创建AgoraRTC实例并加入频道constclient=AgoraRTC.CreateClient({mode:"interop"})client.init(appId,function(){console.log("AgoraRTCclientinitialized");client.join(channel_key,CHANNEL_NAME,null,function(uid){console.log("User"+uid+"joinchannelsuccessfully")console.log(newDate().toLocaleTimeString())//dosomething}}

订阅远端的视频流并播放。

letstream=AgoraRTC.creatStream(merge(defaultConfig.config))localStream.init(()=>{client.on('stream-added',function(evt){varstream=evt.stream;console.log("Newstreamadded:"+stream.getId());console.log("Subscribe",stream);client.subscribe(stream,function(err){console.log("Subscribestreamfailed",err);});});client.on('stream-subscribed',function(evt){varstream=evt.stream;console.log("Subscriberemotestreamsuccessfully:"+stream.getId());if($('div#video#agora_remote'+stream.getId()).length===0){$('div#video').append('');}stream.play('agora_remote'+stream.getId());});})

通过下述方法来实现发送信息。

//创建信令的对象constsignal=Signal(appId)//在实验条件下,不设置tokenconsttoken='_no_need_token'//登录constsession=signal.login(account,token)session.onLoginSuccess=(uid)=>{//发送消息给指定的账号signal.sendMessage(reciveAcount,message)}

完成上述的步骤之后,与小车端设置相同的appId和token(如有必要),设定好对应的参数,我们就可以远程控制小车并获取视频了

o4YBAFtZjqGASU-6AAEedjC90dI836.jpg

图:现场演示

o4YBAFtZjqKAASaJAAHm10UsI-4556.jpg

图:48小时改装的小车

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 视频
    +关注

    关注

    6

    文章

    1891

    浏览量

    71904
  • 智能小车
    +关注

    关注

    85

    文章

    541

    浏览量

    81184

原文标题:一起跳出思维定势吧,RTC 技术还可以这样玩

文章出处:【微信号:shengwang-agora,微信公众号:声网Agora】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    远程手机实时监控视频

          深圳市中现科技有限公司研制的专业软件、硬件可广泛用于手机直播、手机实时监控视频、手机远程监控系统
    发表于 02-03 10:26

    跪求项电子系创新项目~~~~~

    大家好 我是名大二的学生 学电子的 现在我想参加学校电子系创新项目 学校又没提供项目可选 我又不太懂要报什么项目 所以请大家给我提个宝贵的意见吧 拜托大家了 谢谢 好人有好报的
    发表于 03-24 17:47

    创新项目点子

    我是在校大学生,想做个作品,参加学校的创新项目的,不过没有点子,那位大神可以给个点子?谢谢!
    发表于 09-11 22:14

    大学生创新项目

    有什么好的大学生创新项目,用单片机做,推荐下。。。
    发表于 09-18 21:20

    [原创]智能小车PCB项目资料

    定要是GERBER文件啊,别做出来板子再冤枉厂家做的不对,呵呵钻孔图NC文件。。。再贴几张实物图:大家都对智能小车比较感兴趣,再来个视频看看功能吧:这是
    发表于 12-20 15:12

    科技创新项目

    电气专业想申报个科技创新项目做什么好,直没灵感啊
    发表于 04-07 00:46

    【Aworks申请】智能手持远程视频,语音通讯终端

    申请理由:公司需要开发一款用于远程通讯的设备,实现远程视频和语音等功能。考虑采用一款ARM9芯片的方案,希望能够申请成功,用于方案的前期验证
    发表于 07-18 16:40

    一款用于视频图像传输的收发模块

    ` 本帖最后由 雨山 于 2016-2-16 15:55 编辑 一款用于视频图像传输的收发模块可搭配于智能小车,四轴航拍,可视门铃,倒车监控等应用场景。无需wifi,性能可靠,可电
    发表于 12-03 10:14

    【NUCLEO-F412ZG申请】通过nrf24l01无线模块远程遥控智能小车

    些想超声波测距和加速度等至于小车上制作一款高级的遥控智能小车。2.自己曾经主要玩过一款stm32f103c8最小系统板还有stm32zet6
    发表于 10-31 15:15

    STM32芯片的一款智能台灯项目分享 包含代码哦

    一款智能台灯,特分享出来供大家学习。智能台灯侧面图智能台灯整体图智能台灯俯视图 作品简介:随着时代的进步人们对灯的要求也越来越多,台灯是普遍
    发表于 07-27 11:42

    智能小车项目案例演示分享!

    、API借口,以及它的优势和限制,同时,还需要有较强的动手能力。3.智能小车系统功能说明本项目,主要实现如下功能:● 对超声波传感器的现场数据实时采集并
    发表于 09-17 22:55

    【HarmonyOS IPC 试用连载 】家用智能监控

    在家的情况,现目前市面上的监控视频只能固定安放在某位置,存在盲区。现想做一款可移动的监控机器人,能远程通过手机app实现操控
    发表于 12-18 10:20

    分享一款不错的优化远程及遥测应用的视频SERDES电路

    分享一款不错的优化远程及遥测应用的视频SERDES电路
    发表于 06-03 06:31

    一款简易的自平衡小车设计

    和安全隐患,本次课题主要通过在实验室制作一款简易的自平衡小车通过手机蓝牙控制,以此模拟真实的使用者驾驶体验,在模拟实验中提升平衡车的稳定性,解决可能出现的实...
    发表于 08-06 08:59

    如何设计出一款远程开关实现对工业远程控制和智能家居远程控制?

    如何设计出一款远程开关实现对工业远程控制和智能家居远程控制?
    发表于 10-25 07:15