构建一个系统,利用计算机视觉技术使其能够在游戏中“识别”障碍物,并指挥机械臂实际按下空格键
扫描二维码
随时随地手机看文章
无线网络断了,“无网络”提示画面出现了,突然间那个像素化的霸王龙就成了你与彻底无聊之间唯一的分隔物。通常情况下,你会只是按几下空格键来等待几分钟,直到路由器重启。但当我坐在那里时,我看着桌上摆放着的 myPalletizer 260 M5——一个售价 299 美元、拥有 4 个自由度的机器人手臂,此刻它什么也没做——然后我有了一个想法:
“既然我有台真正的机器人可以替我完成这项任务,那我为什么还要亲自去跨越这些仙人掌呢?”
目标很简单:构建一个系统,使其能够在《Chrome 天使》游戏中“识别”障碍物,并指挥机械臂实际按下空格键。
阶段 1:先软件后硬件
在让机械臂开始敲击我的 MacBook 键盘之前,我需要先确保整个操作的“大脑”能够正常运转。于是,我决定先用纯软件的方式进行尝试,使用 pynput 来模拟按键操作。如果我能让代码独自完美地运行这个程序,那么将虚拟按键操作换成机械臂的实际动作就会变得轻而易举。
第一个难题:速度。
在《恐龙》游戏中,毫秒的时间差至关重要。起初,我曾考虑使用像 PIL(Pillow)这样的标准 Python 库来进行屏幕捕获,但一到 StackOverflow 网站就证实了我的担忧:PIL 在进行实时屏幕抓取时速度极其缓慢。为了使游戏中的恐龙存活下去,我需要更高的帧率。于是,我选择了 mss,这是一个跨平台的超高速屏幕截图模块。
“搜索束”策略
一旦我能够截取屏幕画面,接下来就得弄清楚这个机器人实际上是在观察什么内容。我无需处理整个屏幕,只需监控霸王龙前方的一个特定“击球区域”即可。
我编写了一个可视化脚本,以帮助我确定检测坐标的位置。为了更方便操作,我实际上使用了浏览器的“元素检查”工具,并修改了游戏画布的 HTML 边框。这样我就有了一个清晰的视觉指引,能够准确地对齐我的 Python 捕获窗口。
我选择了“双光束”检测系统:
仙人掌探测线:一种用于检测进入环境中的绿色植物的低级传感器系统。
“鸟形天线”:略微抬高的传感器线路。
这一点至关重要,因为这款游戏颇具变数。有些鸟飞得很高,你可以直接从它们下方穿过,但那些低空飞行的鸟则需要跳跃才能通过。通过使用两根横杆,我能够忽略高空的威胁,只有当有物体进入“危险区域”时,才会触发跳跃动作。
熬过夜班生活
一切进展得都很顺利,直到霸王龙的得分达到了 700 分。突然,屏幕亮起,颜色发生了反转,我的机器人就“失明”了。
在《Chrome 恐龙》游戏中,游戏世界最终会切换到“夜间模式”。我最初的检测逻辑是寻找在亮背景下的暗色像素。当天空变黑、障碍物变白时,机器人就不再跳跃了,而霸王龙也遭遇了极为惨重的结局。
我需要一种方法,无论在何时何地都能检测到障碍物。我意识到,尽管背景颜色会变化,但对比度是保持不变的。我并没有去寻找特定的十六进制代码,而是调整了逻辑,将“光束”像素的颜色与“天空”的当前颜色进行比较。如果位于我的“触发点”的像素与背景颜色不匹配——无论是白色、灰色还是黑色——我就知道有障碍物存在。这种简单的比较以最理想的方式让机器人实现了“色盲”效果。
赋予大脑以躯体
随着软件逻辑的完善,是时候启用这款强大的设备了:myPalletizer 260 M5。
这款 260 型协作机器人非常适合这项任务,因为它具备专门的 Python API。我的目标是将一个虚拟的 pynput 命令转化为实际的动作。对于这项任务,我不需要复杂的运动学知识;我只需要一个可靠的“点击”操作即可。
如果试图用尺子来精确测量每一个按键动作的坐标,那可能会让人感到十分头疼。而我则采用了更为简便的“借助重力”的方法:
1. 我手动移动了机械臂的末端执行器,直到它正好停在了空格键上。
2. 我让手臂的重量(重力)自然地压下了琴键。
3. 我记录下了那个 Z 轴的数值。这个数值就成了我的“Z_PRESSED”值。
4. 然后,我将手臂稍稍抬起几毫米,直到钥匙弹回原位,然后将这个数值(即“释放值”)记录为 Z_RELEASED 。
现在,每当该 Python 脚本检测到仙人掌时,它就会向机械臂发送一个指令:先移动到 Z_PRESSED 位置,然后立即回到 Z_RELEASED 位置。
“双击”难题
我第一次完成整个硬件搭建时,遇到了一个十分滑稽的问题。机器人手臂的动作太快了。
该软件检测循环每秒运行数十次。由于机械臂向下和向上移动需要一段时间,所以在机械臂仍在“跳跃”动作的中间阶段时,检测脚本会多次捕捉到同一个仙人掌的画面。结果如何?机械臂会陷入一种疯狂的“双击”状态,试图在已经正在跳跃的情况下再次跳跃。
这个解决方案是典型的程序员惯用手法:使用了一个简短的“time.sleep()”命令。通过在按键触发后立即添加一个短暂的延迟,我给霸王龙(以及机械臂)留出了足够的时间来避开障碍物,而在此之前检测循环才开始寻找下一个障碍物。
过度设计的幸福
看着机械臂一丝不苟地按下空格键,让一个像素化的恐龙能够跃过一丛仙人掌,这种感觉真的很令人满足。
起初,这只是在 Wi-Fi 出现故障时用来打发时间的一种方式,但后来却发展成了一个全栈式机器人项目——融合了高速屏幕捕获、动态色彩逻辑以及硬件 API 集成技术。
本文编译自hackster.io





