23年5月接触到这个车,大约是07年的玩具,初看到外观,真的是惊艳,三爪着地,长长的脖子,有些科幻电影中外星生物的味道。这个ID设计,放到今天,也是能镇住国内一众玩具厂商的。惊讶之余,从它的配置看,也是能碾压一部分号称智能小车的。列举了几个配置,直接从网上扒拉的
我看重这个车的,除了外观,还有它一个很实用的特性,就是自动导航归位充电,这个特性对于远程控制而言太重要了,否则再顺畅的操控体验,永远被续航的焦虑所制约。从网上找到了一些资料,介绍其导航系统,搬运过来:
这个车还有个特点是麦科姆轮设计,这可是07年的设计,要知道国内也是最近几年玩具界才流行起来麦科姆轮,从知乎上一个答主提供的信息看,当年这三个轮子的驱动程序,是一个台湾团队负责,不可谓不超前。
这个车的相机还通过一个马达驱动,可以提供高中低三个俯仰角度,用于控制相机的视角,其他还包括大灯,麦克风,扬声器,红外避障等,不一一介绍了。
笔者从闲鱼收了一个后,迫不及待摸索了一遍软硬件实现,目的是为了为后续改造提供理论分析基础,在前面的介绍基本功能基础上,本章节就直接说结论了。
这个车出厂是以Ad-hoc方式提供热点连接方式,可惜的是,Android和Windows已经不支持Adhoc了,苹果和一些嵌入式设备支持,连接此热点后,因为没有dhcp,还需要手动设置设备的IP,连接成功后,可以通过小车的IP地址192.168.10.18访问小车的浏览器网页。
这个网页连接后,可以通过设置界面,修改小车的连接方式,让小车作为Client连接某个AP,这个AP可以是家里的路由器也可以是一个手机,但不管怎样,小车仅支持WAP认证,这种不安全的认证方式,安卓和IOS已经不支持了,通过这种方式连接后,让客户端和小车处于同一局域网,这样就可以实现较大范围内的遥控了。如果是家庭局域网,加上端口映射后,远程控制也通了。
不得不说,上述操作过于繁琐,对基础知识要求有点高。在当今短视频流行,对于大部分只能接受视频输入的人群,这种复杂的,人机交互繁琐的玩具只能被扔进垃圾堆了。从另一个角度,因为上述两种连接方式的限制,很多人的这个车已经完全处于闲置状态,某鱼上有很多。
这个车的Camera提供四种分辨率,最大也就是420P,获取图像的方式是通过一个http的请求,小车返回一个jpg图像,端侧进行解码后显示,效率相当低下,视频质量也不高,放现在看,这就是最大的短板。
通过拆解,可以发现这个车的定位系统使用的是红外,用的三方公司的北极星定位系统,大概的原理就是通过固定了两个红外光源反射的光束,计算室内的相对位置,精度理论是10cm,实际不止,笔者的小车,误差估计有50cm;现在比较流行的室内定位是激光定位,大量的扫地机器人用的就是激光定位
如前文介绍,这个车使用了3个麦科姆轮实现运动控制,通过在Windows和安卓抓包,很容易就发现这个车的驱动是通过前端发送http请求,携带方向和速度信息,由主控板解析成3个电机的控制指令,交给驱动板,控制3个电机的转动。一个控制指令大约可以维持电机转动500ms,所以,如果需要小车连续运动,需要不断的发送http请求,而且请求是通过多年前的cgi脚本控制,每次发送请求后,并不会维持tcp连接,所以下个请求又要重新建立tcp连接,效率是相当低下。
考虑到 IOS客户端是收费的,Windows客户端使用用户太少,所以本章节重点讨论Android客户端,通过decompile,很容易发现代码是轻度混淆过的,不过界面逻辑不复杂,代码逻辑也很容易理清楚;主要包含几个关键的
1. AndRovio是主程序,是Activity的子类,启动后除了UI线程,还启动了两个线程,获取小车状态和获取camera图像
2. 获取小车状态线程:每隔5秒执行一次,获取电量、位置信息、WIFI强度信息,显示到界面上
3. 获取camera图像线程,循环执行,获取jpg图像,界面,绘制界面
4. 其他,包括截屏,录像,大灯控制,摄像头摆动,都是通过http请求完成,具体可以看api文档,讲得很清楚。
不得不提一句,这个小车的资料是真的多,软硬件的资料,甚至有控制板的全部代码,可以编译烧录的,加上客户端源码,对于电子爱好者,真的是福音,开源友好程度,不弱于Ardiuno
在上述分析基础上,大致的改造思路也有了,总的来说包含几部分:
供电是必须改的,原车的镍氢电池早就处于废弃状态,改锂电,6v改7.4v,3000mah改6400mah,同时保留原来的充电板,因为电量采集功能在这块板子上,充电板改成7.4v平衡充,原充电板的充电部分电路就废弃了,直接把充电的输出端接到锂电上。原车的电源标的是8v,2.7A,实际用万用表测试是8.4v,这就是标准的2s锂电充电电压,非常完美。
早年是有爱好者自己做了锂电充电板的,在淘宝销售,现在已经找不到店铺了,可惜了。不过不通过电源板充电问题不大,上述改造只是会导致电压检测不准,实际使用过程发现在低电量状态,电压检测准确度基本恢复到镍氢电池的水平,基本不影响低电归位。
上文提及了,原车相机非常拉胯,分辨率低不说,硬件效率也不高,视频经常卡顿。加上安卓客户端获取视频流的方式,进一步拉低了视频质量。笔者尝试把视频流获取方式从tcp短链接改成了长链接方式,在局域网下,有明显提升,但如果改成4g lte网络,卡顿又出现了,瓶颈在小车硬件本身,不换硬件,纯软件优化无解!
改造思路,屏蔽小车原摄像头用新硬件替换。原车把相机模组拆下来后,主控板无法启动,需要在固件中屏蔽检查模组状态的代码,这是前提,然后就是加三方的摄像头,淘宝上无人机用的wifi图传摄像头很多,也不贵。关键是板子面积要足够小,不然塞不到原本摄像头的位置。然后还需要解决散热问题,实测发现,720p的摄像头散热需要用石墨烯贴纸,1080p必须用散热片,而这么狭窄的位置,根本没法放散热片,所以笔者的改造用了一个720p的摄像头,实际视频效果也不错,清晰度在一般玩具的中上水平,室内监控足够了。
另外图传摄像头需要说明的是,大部分卖家会提供配套的安卓app,至于怎么显示到手机上,安卓提供了悬浮app权限,大家都这么用。笔者研究了淘宝上销售的十几款wifi图传的配套app,方案就那么几家,有两家的视频传输库是可以有安卓接口层源代码的,这样就可以把so提取出来,集成到小车app中,让视频流替换原本的小车视频流。而小车原本的摄像头已经拆下来了,对应的软件代码也可以删除。这样就做到了无缝的替换,至此,视频部分的改造结束,实际测试,延迟还是很低的,约200~300ms,这已经是通过运营商lte网络传输效果。
关于硬件连接,wifi图传自然不需要考虑视频流的传输介质问题,只要解决电源问题,图传一般是3.7~5v供电,这个应该很容易解决,小车的主控板就是5v供电,找到红黑线,万用表量下,接上即可。
上个视频:
原车wifi连接是通过adhoc方式,这就限制了连接的硬件平台,安卓是肯定不行了。换个思路,体积小的嵌入式并且支持adhoc的,很容易就想到openwrt,这个平台对wifi硬件支持非常好,而且是路由系统,管理多个网络连接绰绰有余,加上丰富的三方应用。最重要的,支持的硬件非常多,arm,x86均支持。这么多硬件里找个体积小的,答案也挺明显,tplink 703n。
硬件改造:
703板子flash换成8M,原来的4M太小,放不进去固件,天线最好也升级下,引出贴片天线的线,解决电磁干扰的问题。外壳扔了,没用。
软件改造:
自己编译个703N固件,最新的能用的是17.06版本的lede,加上ipv6,socat编译出img,烧录进去。
703N的角色,真就是一个路由器,他把小车,wifi图传,随身wifi三个设备连接起来。把来自于客户端的控制信令转到小车上,再把wifi图传的视频流通过随身wifi发出去,显示到客户端。实测待机状态cpu占用2%,控制信令跑起来cpu占用无明显变化;720p视频流跑起来,cpu占用20%,毕竟720p视频流经过图传h264编码后,也就1M带宽占用,703N干这个,应该是绰绰有余。
这个不多说了,一个随身wifi就可以解决了,要求高点就去酷安蹲点,研究下刷版本,改外卡之类,要求不高就淘宝买几个,用商家提供的流量,一个月几块钱,商家跑路了就换一个。
有人不禁要问,随身wifi都能跑安卓了,替换703N应该是可以的吧,不替换的原因是什么?笔者试过,随身wifi的安卓版本是4.4或者5.1,这两个版本的安卓还不支持wifi与蜂窝流量并发,连上wifi就断蜂窝。有人又问,那把安卓刷成openwrt? 笔者又趟过浑水了,随身wifi大多是单天线,连了小车的adhoc就连不了wifi图传。综上,让每个角色各归其位,随身wifi就负责提供稳定的蜂窝网络连接,703N就负责稳定转发数据,费电就费电吧,18650电池也不是吃素的。
理论上windows客户端可以改造,在手机横行的时代,没有实际意义。本章节主要讨论安卓,首先,前文提及了原车http走的是tcp短链接,改成长连接后可以大大提升连接稳定性,尤其是4g远控场景,通过运营商网络传输控制命令和视频流数据,tcp长连接是很有必要的。
然后是操作界面,原车apk是竖屏布局,对于遥控车而言,改成横屏应该是比较合适的。
视频数据因为替换过摄像硬件,所以也必须适配,通过so获取视频流后,送入安卓的mediacodec解码,再送到surface显示到界面上,最近10年的主流安卓手机应该都支持硬件解码,最近5年的都支持h264硬件解码,所以在mediacodec中配置硬件解码后,不仅视频流畅,而且功耗还低,长时间玩手机也不烫。
中间有个小插曲,淘宝摄像头卖家给我发的app中提取的so,改了摄像头ip地址后就不工作了,折腾了两天,发现升级app后就没问题,然后又提取新版本app中的so,接口也升级了,一顿替换,视频流完美出现。
改4g远控后,远控的ip地址与wifi下的不同,又加了一个自动识别网络环境的逻辑,wifi局域网下用局域网地址,切换到4g网络就用公网ip。当然,openwrt也要做适配,根据客户端连接的接口不同,转发不同的端口数据。
最后就是界面美化,加万向轮控制,大大提升操作的便捷性。配合加上蓝牙手柄的按键识别后,用手柄玩那就更丝滑了。
把上述单个模块的软硬件准备好后,剩下的就是整个串起来,把软件调稳定,把安卓app调试通过,稳定运行。
然后就是把各个硬件“塞”进车里,这个过程也不得不动原车的塑料件,一把好的刮刀,加上小型手钻可以解决大问题。
安装过程要注意的,电压电流匹配,电流小的话板子不稳定,还有注意电磁屏蔽,好几个wifi同时工作,天线的布局有些讲究。最后就是散热,发热严重的就是小车的主控板,电机驱动板,wifi图传,随身wifi棒子,这几个可以通过铝片,石墨烯贴片等解决散热,空间够,加个静音小风扇也是可以的。