在油管上有这么一位博主 Shane Wighton,他在运动方面经常被妻子血虐。于是,他经常造一些诸如“百发百中弓箭”、“百发百中篮球板”等作弊道具来挑战他妻子。
这一次,Shane Wighton 买了设备跟妻子打台球。结果不出意料,Shane Wighton 再次被妻子无情嘲讽。

既然正常比赛打不过,那就用科技打败魔法。Shane Wighton 决定发动自己的天赋技能“创造”,打造一根全自动球杆。
这个玩意有多酷呢,球杆的算法会自动计算最优的击球路径,桌球台上方的投影仪会给出最佳击球位置,使用者只需要扣动扳机即可变身桌球国手。
具体效果如何?咱直接看动图。

只见使用者拿起球杆,上膛、扣扳机、球杆自瞄、击球入洞这一系列动作行云流水。使用者需要做的仅仅是把球杆对准白球,球杆就会自动计算击球路径,完成击球。真正做到“我有手,我上我也行”。

那么一根自瞄球杆是怎么制作的呢?
两大装置打造自瞄球杆
制作自瞄球杆,需要完成“球杆改造”以及“自瞄系统搭建”等两项工作。其工作难度,也是只有亿点点,懂一点高数、机械原理、代码编程、视觉算法、机器学习,再有一个灵光一点的脑子就行啦。
球杆改造
首先,让我们看一下球杆改造部分。进行球杆改造,主要需要球杆能够实现球杆方向自动调节、自动推杆击球以及接收来自瞄准系统反馈的击球操作。
关于球杆的方向调节系统,作者分享了他在前期思考时脑海中的画面就像下图这样。他希望球杆能够拥有灵活的高精度方向调控能力,同时兼具在高速撞击台球时能保持方向不变的刚度。

这个方向调节体型,小伙伴们心里有想法吗?
为了实现球杆能够满足使用需求,作者采用了拥有 6 个自由度的平台并联机构“Stewart”(斯图尔特平台),能够很好的完成球杆调节方向的功能。
确定好调节方向的工具之后,作者开始进入钢铁侠造铠甲模式。先是计算各个元器件的尺寸,在电脑上建模模拟运动效果,编写代码。

接着火力全开,自己完成零部件加工、设备安装等。

这货家里简直就是个小型加工厂,我丝毫不怀疑在资金充足的情况下,他能打造出一具钢铁侠铠甲。
小伙伴们要注意用于控制支腿的伺服电机进行润滑,不然球杆可能会像下面这样疯狂抽搐。。。

搞定方向调节装置,接下来便是自动推杆击球功能的实现。相较于斯图尔特平台的复杂,推杆击球功能明显要更加的简单,使用一个气缸即可完成。
这样,通过斯图尔特平台和气缸这两个工具,我们的球杆已经能够实现多方向调节已经自动推杆,接下来便是安装单片机以及无线模块,实现球杆的方向调节及推杆可控。

正所谓,不会机械加工的程序员不是好工程师,作者通过一顿操作,把代码便携、零件加工和设备调试等工作全部包揽了。
至此,球杆的改造工作基本完成,接下来要进行的就是自动瞄准系统的制作了。
自瞄系统
制作自瞄系统,一共要完成“视觉定位”、“轨迹计算”这两大部分。
我们先来说比较容易理解的视觉定位部分。视觉定位系统主要有一台安装在桌球顶部的摄像机提供画面支持,摄像机将录制到的画面传输到电脑,电脑在进行画面分析。

嗯,这台摄像机还可以进行移动调整录制角度,全方面无死角的捕捉台球桌上的台球,掌控全局!是不是有种动漫里面主角开挂的既视感,五条悟直呼内行。

当然,我们还需要一些辅助措施让电脑将接收到的画面调整为与实际画面一致,防止击球轨迹出错,导致球不入洞。
作者通过在台球桌上黏贴白点以及 QR 码的方式,让电脑进行基准面调节,实现了台球桌在电脑内画面始终方正的样子。

接下来,使用一丢丢魔法代码,让计算机识别台球、球洞以及库边。

代码完成。接下来,电脑可以根据基准面反推出球洞、桌面保险杆以及球的位置,再通过视觉算法进行标记,完成目标识别。

这下球和球洞都能识别了,该开始让球杆自己开始学习击球了,也就是进入自瞄系统的“轨迹计算”部分。
要想完成轨迹计算,首先要让电脑知道球杆朝向。万能 QR 贴纸再次出现,一张贴纸能让电脑找到球杆,两张贴纸让电脑明白球杆指向,居家 diy 必备好伴侣。

▲ QR 贴纸:我标记了一处地点
但是等一下,这两张 QR 码只能在电脑上形成也和 2D 图像,电脑并不知道球杆的倾斜角呀,这击球的时候岂不是乱了套?

那怎么省时省力的获取倾斜角呢?让我们看看电脑感知到的画面中哪些数据跟倾斜角相关。
最后,作者发现电脑能直观获得的便是球杆 2 个 QR 码所生成图像长度的变化,而图像长度的变化受倾斜角的影响。(这题我会啊,小学时候学的解方程嘛!)
也就是说,我们用一把量角器量得倾斜角的度数,再结合电脑中图像长度的变化,我们就可以获得倾斜角和图像长度的变化关系。将这个变化关系输入到代码中,代码便可以通过图像长度自动计算球杆的倾斜角。
为了减少用手支撑球杆发生的抖动影响计算机计算倾斜角,作者还给球杆设计了一个支架,增加球杆的稳定性。

这样架起来的球杆,倒是有几分炮台的感觉了~
球杆及台面数据已经识别完成,接下来就是进入击球轨迹测算的环节。在算法实装之前,作者先在电脑上做了一个简单的算法进行球杆的击球测试。这个算法会告诉作者击球路径及角度。

看着好像挺酷的,但是电脑桌面跟台球桌面离那么远,不可能每次测试都往电脑瞟一眼呀。
于是乎,作者做了一件非常酷的事情,他将投影仪安装到台球桌顶部,将电脑画面投影到桌面上,直接把台球桌变成了星际作战会议桌。

不得不说,这个投影仪和界面设计,很有卫星追踪的感觉。

接下来,万事俱备,只欠东风。最后再把算法这些再过一遍,自瞄球杆准备进入作战状态!

把老婆叫过来,摩拳擦掌,准备让她看一眼自己的发明。
天际鹰眼系统已就位,地面已接收到鹰眼运动轨迹数据,球杆出击!

嗯,怎么说呢,这么近距离能够成功让球不进洞,也算是一种另类的精准吧。难道说运动天赋差的人做出来的道具也没有运动天赋吗?
再把各种公式各种轨迹运算数据重新计算整理,球杆还是时灵时不灵,完全摸不透出错的规律。

思来想去,轨迹计算公式没有出错,球杆的推杆精度没有出错,那只能是在进入计算环节之前的某个环节存在问题。最终,作者将问题锁定到了用于录制画面的摄像机上面。
由于广角摄像头的采用,摄像机录录制的画面是存在光学畸变的,即便通过算法进行畸变校正,问题仍然存在。

面对这种畸变,作者最开始想通过物理校准的方式来消除畸变,但连续四天的失败尝试,让他意识到情况不对劲,不论他怎么做,轨迹测算就是会出现问题。

想来想去没办法,他重新聚焦算法,想从算法这一块入手。这一看直接让他发现了失误的源头 —— 他用于矫正畸变的算法,其实是之前针对另一款摄像机设计的,他只要将算法修改为适用于正在工作的摄像机就好了。
终于,皇天不负有心人,修改完算法之后的击球轨迹总算正常了,击球嘎嘎猛。

至此,虽然球杆还未开发自瞄功能,目前也只是充当了自动击球的作用,但经历了第一波被老婆嘲讽以后。他决定谨慎行动,先多番测试一下球杆的稳定性。
不得不说,Shane Wighton 确实是一个会整活的鬼才。测试算法是枯燥的,于是他想了个办法,拉别人入伙来一起做测试。
通过在网站上制作一个简单的小程序,参与测试的人可以获得自动球杆的控制权以及在桌球台上标记击球点进行击球。
经过多轮测试以后,球杆的击球获得了保证,作者同时还获得了大量的击球数据,为后面的自瞄算法提供了数据支撑。

所有的基础问题已经解决,接下来就是完善算法,实现球杆拥有大脑,成为真正的自瞄球杆。
在算法设计当中,作者希望每次击球开始时,电脑会自动计算所有潜在的击球路径,并选择能够实现连续击球进洞的最优路径。

要想实现计算机能够提供精准的击球路径,大量的机器学习那是必须的。但是迫切想要一雪前耻的心不允许作者花费太多的时间在机器学习上面。
于是乎,作者采用了一个相对来说更便捷高效的方法 —— 绘制有向图。简单来说,通过有向图,作者让电脑学会了在保证能进球的情况下计算击球时的最短路径。

这一顿操作下来,台球桌在电脑眼里看来已经变成这个样子了,有种在打海战时,鱼雷追踪船只的感觉。

接下来,超级大脑已部署,星际目标指引卫星(投影仪)已部署,球杆准备就绪。Shane Wighton 再次向他老婆发起了挑战。

这一次,由 Shane Wighton 的老婆开球,打了 2 杆之后,轮到 Shane Wighton 击球。然后,便是 Shane Wighton 的击球,Shane Wighton 的击球,Shane Wighton 的击球,彻底展示什么叫做理工直男。

最后,让我们了解一下作者。Shane Wighton 之前就读于北卡罗来纳大学夏洛特分校,拥有机械工程学士学位和计算机科学硕士学位,目前在 3D 打印技术开发商和制造商 Formlabs 公司担任首席工程师。
Shane Wighton 本人在油管上拥有非常高的热度,因为他妻子的运动天赋确实过于强大,导致 Shane Wighton 经常需要制作一些黑科技来找回一点“面子”。
除了自瞄球杆以外,作者还制作了,全自动瞄准弓箭,百发百中篮球板,全自动理发机等黑科技设备,活脱脱的物理外挂制造家。
