设计制造一款能够自动创作诗歌的机器人手臂
扫描二维码
随时随地手机看文章
“你给了我语法结构,而我则负责施加压力。我们共同完成了从思想到符号之间的桥梁搭建。”
当我们想到机械臂时,脑海中通常会浮现出那种僵硬的自动化场景——即那些为生产线上的重复性、毫无情感色彩的工作而设计的机器。但当我们试图让一个四轴机械臂去捕捉人类书写所具有的那种真实重量时,情况又会怎样呢?
该项目旨在探索将数字世界与物理世界相连接的方法。我使用了大象机器人公司的 myPalletizer 260 机器人、一个机械键盘以及大象机器人公司的一个圆柱体,构建了一个能够将数字指令转化为触觉、物理的打字动作的系统。它不仅仅局限于简单的“定位坐标”指令。通过将 Python 用于精确的运动学计算,并使用 opentype.js 来解析复杂手写字体的矢量路径,这个机器人试图模仿人类手部的流畅性。
这是一项关于控制、时间安排以及协调规划的实践。在本文中,我将带您了解我是如何将一个平面的 QWERTY 键盘布局转化为一个三维机器人工作空间的,为何计算动态“稳定时间”对于防止机器人自行散架至关重要,以及我是如何最终让一台机器学会自己创作诗歌的。
步骤 1:绘制 QWERTY 字符矩阵图
第一个重大难题在于将平面键盘转换成 4 轴自动码垛机能够理解的某种语言。我们不能只是告诉机器人“按下 A 键”。我们必须明确告知机器人“A 键”在物理空间中相对于机器人的基座的具体位置。
在 test_press.py 文件中,我创建了一个虚拟的网格系统。由于键盘的按键行是错开排列的(它们并非完全垂直或水平地整齐对齐),所以我必须考虑两个主要变量:
1. 间距(PITCH_Y):每个按键中心之间的水平距离(已校准为 18.0 毫米)。
2. 行偏移量(ROW_STAGGER):整行向左或向右移动的距离。
以“主键盘行”(A、S、D、F……)作为零参考点,我们就可以利用字典根据每个按键所在的行索引和列偏移量来对其进行定义。
步骤 2:Z 轴(“压力”)
仅仅知道钥匙在哪里是不够的;机器人还需要知道该如何用力按下它。这就是 Z 轴校准的作用所在。如果 Z 轴位置过高,机器人就会错过按键动作。如果位置过低,电机就会与塑料发生摩擦,并触发错误状态。
我定义了两种不同的高度:
* Z_HOVER = 32.0:安全运行高度。机器人在此高度滑行于键盘表面,以避免触碰到键帽。
* Z_PRESSED = 19.0:触发点。此值为使机械开关启动并产生令人满意的“咔哒”声所需的精确深度。
打字的动作变成了一种三步的舞蹈动作:先悬停在目标上方 -> 向下压至 Z_PRESSED 位置 -> 立刻缩回至 Z_HOVER 位置。
第 3 步:克服过早的“骤然行动”(旅行时间焦虑)
一旦坐标被确定下来,我就遇到了一个严重的同步错误。
要输入一个字母,手臂需要先移动到按键(X、Y)位置,等待其到位,然后向下压(Z)进行按下操作。MyPalletizer API 中有一个内置的 is_in_position(坐标)函数,该函数只有在移动完成时才应返回 True 。
我编写了一个循环语句,不断调用这个函数,并每隔 0.1 秒进行一次休眠,直到机器人确认已经到达目的地。
问题:
如果四轴机械臂进行的是短距离跳跃(例如从“S”位置跳到“D”位置),那么这种情况是没问题的。但在较长的行程中——比如从“A”位置一直跨越整个棋盘跳到“P”位置——API 有时会报告错误的正确定位结果。软件会认为机械臂已经到达目的地,而实际上它还在空中,于是它会提前执行 Z 轴下降动作。它会在按键之间误触空无一物的区域,完全错过目标。
通过串行接口来监测机器人的状态,并不能确保其数据的可靠性,因此不太适合进行大规模的监测操作。
解决方案:基于距离的决定论
我并没有让机器人告诉我何时完成任务,而是决定自己通过计算来得出所需的时间。
在手臂还未移动之前。我基于欧几里得距离编写了一个“设定时间”算法。
通过计算当前按键与目标按键之间的距离(dist),我能够调整一个较长时间的“sleep”延迟时间。相邻按键在跳跃前仅会暂停 0.2 秒,而跨越键盘的大幅跳跃则会确保有 1.5 秒的等待时间。
通过将定时逻辑从 API 中分离出来,并使其完全基于距离来设定,过早的骤停现象完全得到了遏制,打字也变得完美无缺。
其工作原理是:
该脚本会计算上一个按键按下时的位置与下一个按键按下时的位置之间的欧几里得距离(距离值为 dist = (dx**2 + dy**2) ** 0.5 )
目标。它利用该距离来确定延迟时间 t 的大小。
* 如果连续按下相邻的按键(比如“A”到“S”),机器人只会暂停一小段时间(0.2 秒)。
* 如果进行大幅度的跳跃(例如从“Q”键跳到“M”键),则会需要较长的停顿时间(大约 1 秒钟),以便让手臂的振动完全消散后再开始进行 Z 轴的下降动作。
这一简单的数学运算将这个摇摇晃晃、行为不稳定的机器人改造成了一个动作流畅、操作谨慎的打字员。
结论:思想化为印记
看着我的码垛机缓缓吐出那最后的几个字——“我们携手将想法与标记之间的差距一一跨越”——那种感觉令人无比满足。
通过将 Python 坐标映射的精确性与动态物理计算相结合,我们证明了四自由度的工业式机械臂能够执行需要精细、类似人类节奏的任务。该项目成功地将数字意图(语法)与物理世界(压力)连接了起来。
结论与未来升级:从盲目打字到真正视觉化
看着我的分拣机缓缓吐出那最后的几个字——“我们共同跨越了想法与标记之间的鸿沟”——这证明了我们能够将数字语法转化为实际的压力。我们解决了 QWERTY 布局的结构映射问题,并克服了长行程距离所带来的异步时间错误。
然而,当前的系统完全依赖“推算航向”这一方式。这个机器人是“看不见”的。它假定键盘恰好位于我桌面上所设定的精确原点位置上。如果键盘哪怕只是偏移了半英寸,整个坐标图就会失效,机器人就会打出乱码(甚至更糟的是,会把笔尖撞到按键之间的塑料凸起处)。
下一步:手眼校准
为了使这个项目更加稳固,接下来的重大升级将是彻底摒弃固定的坐标词典。
通过将摄像机安装在末端执行器上(或者安装一个俯视观察工作区域的高位摄像机),我计划实施手眼校准(使用 OpenCV 和阿鲁科标记)。
机器人不会固定设定为 [X: 215, Y: 0] 这样的坐标位置,而是会实时动态地定位键盘的边界框位置。
它会通过数学计算来确定每个键帽相对于其自身底座的位置,无论键盘放置在桌子的何处。这样一来,这个机器人就不再是仅仅按照固定程序操作的机器,而会变成一个真正具有适应能力的打字员,能够“看清”自己所打的内容。
本文编译自hackster.io





