机器人开发

黄油机器人:把《瑞克和莫蒂》里的脑洞做成实物

黄油机器人把《瑞克和莫蒂》里的方头单眼小家伙做成了实物,搭配履带、视觉和机械手臂,完成自主导航、寻找黄油与抓取,也能语音对话。本文从结构取舍、涂装和总装聊起,展示双主控、语音、运动控制与网页可视化怎样接进这台 DIY 作品。

视频演示

代码开源

查看黄油机器人总仓库

硬件开源

查看嘉立创黄油机器人硬件开源

延伸教程

黄油机器人复刻教程 · 15 章完整内容


一颗大眼睛,顶在方方的脑袋上。两条细长的机械手臂,下面接着一副履带底盘。

这个小家伙的名字,叫黄油机器人。

动画里的它,专职递黄油

在《Rick and Morty》第一季第九集中,Rick 制造了一个拥有自我意识的机器人,把它放在餐桌旁,负责递黄油。

它问 Rick「我存在的意义是什么?」

动画中的黄油机器人询问自己的存在意义,原视频截图

Rick 的回答只有三个字,「递黄油」。

小家伙低下头看看自己的机械手,冒出一句「天啊」。早餐桌上突然有了一个很认真的哲学问题,得到的却是一份只有三个字的岗位说明书。

动画中的黄油机器人低头看向机械手并发出感叹,原视频截图

这短短十几秒的剧情,既荒诞,又很容易让人记住。一个足够聪明、甚至会思考自己处境的机器人,全部使命却被安排成了一件小事。

我想把它从二维画面里带出来。除了那副方头单眼的外形,我还想让它拥有视觉、运动和对话能力,让它真的能够寻找、接近并抓取黄油。

于是,一个熟悉的动画形象,成了把机械、电子和软件装在一起的理由。

逆光下的黄油机器人整机,方头、机械手臂与履带底盘

先让它长得像那个小家伙

黄油机器人的外形,有几个很难省略的特征。方头、单眼、细长手臂,再加上下面两条履带,组合起来才有那个味道。

画在屏幕上时,这些形状都很好相处。做成实物以后,主控板、电池、电机、雷达和线缆开始各自占地方,摄像头与舵机也要找到合适的位置。

为了装下整套感知与控制系统,我把整机做了适当的比例放大。放大之后,还要继续照顾它的重心。原设的脑袋大、身体细,头重脚轻的轮廓很有辨识度,也给结构设计出了一道题。

底盘爆炸图,展示板卡、支架与履带的层次

底盘的爆炸图里,可以看到主控板、驱动板与机械结构的层次。外面看着是一个小小的履带车,里面还得安排供电、通信、固定位置和走线。

这套内部堆叠,我改过几个版本。哪个位置留给板卡,哪里留给线缆,手臂运动时会不会碰到壳体,都需要在真正装起来以后继续调整。脑洞很轻,装进去的东西倒是一件都不能悬空。

动力用的是 N20 减速电机。按这台机器人的电机选型,额定扭矩为 3 N·m。我在这里牺牲了一些移动速度,换取带动整个机身的扭矩。

对于一台要靠近黄油、停下来动手的小机器人,走得稳、带得动,比跑得快更符合它的工作。

N20 减速电机相关的齿轮与传动结构近景

那颗大眼睛里藏着微型摄像头,头部还集成了控制机械手臂的小型舵机。视觉负责看,关节负责动,同一个壳体里开始有了不同的职责。

透明头部模型中的摄像头、舵机与安装布局

动画里的造型就这样一点点落到现实里。经过几轮结构与堆叠调整,这个小家伙终于能把头、手臂和底盘安稳地带在一起。和物理引擎友好协商,也算是 DIY 的固定节目了。

给它一身「瑞克车库」的金属味

结构做好以后,外观还差一点。

我想让它带着那种从瑞克车库里走出来的感觉。方形脑袋和机械手臂要有金属的分量,也要和整个角色的气质搭得上。

我先笔涂了一层水补土,统一零件的表面状态。桌上这些还没装起来的壳体、手臂和底盘零件,就是它慢慢长出外观的过程。

作者为机器人零件笔涂水补土

接着用冷色调的烧铁色金属漆做底色。颜色上去以后,那些平面、边缘和关节位置开始有了不同的反光,原本分散的零件,也逐渐像是属于同一台机器。

为零件涂上冷色调的烧铁色金属漆

再喷一层消光保护漆封层。光泽收下来,整个身体的气质也安静了些,那种「刚从瑞克的车库垃圾堆里捡回来」的味道,就慢慢出来了。

喷涂箱内的零件与消光保护漆处理

之后是很解压的总装。前面各自躺在桌上的东西,一颗螺丝、一条线地接回去,头部、手臂和底盘终于有了完整的关系。

总装时使用螺丝刀固定壳体零件

打开头部的时候,可以看见舵机和线缆留在壳体里的位置。盖上外壳以后,这些细节大多会藏起来,但它之后能怎么动、能不能继续拆开调整,都和这里有关。

打开头部外壳后的舵机与线缆布局

等到总装完成,冷色的金属表面、顶上的弧形线缆和那颗大眼睛放在一起,已经有了很熟悉的轮廓。那些为了结构和装配做过的修改,也一起留在了它身上。

找到黄油,再把动作接起来

黄油机器人最贴合名字的一项能力,就是自主寻找、接近并抓取黄油。

这里面有几件事要配合。摄像头先看见目标,视觉检测给出黄油的位置;定位与导航帮助底盘判断自己在哪里、该往哪里走;靠近目标以后,机械手臂再接过抓取动作。

从人眼里看,这是一段连续的动作。放进机器人里,每个环节都有自己的工作。看见了目标,接下来还得把视觉里的位置和机器人行走的空间联系起来,再让底盘与手臂配合。

视觉部分用的是自己训练的 YOLOv8 黄油检测模型,转换成 RKNN 模型后,在 RK3588S 的 NPU 上运行。名字有些长,实际想做的事很直白,从摄像头画面里,把黄油找出来。

黄油检测结果,摄像头画面中的 butter 类别与目标框

检测画面里的 butter 标注,是这条链路的起点。桌面上还有键盘、手柄、镜头和显示器,模型需要在这些背景里,把真正要找的东西标出来。

激光雷达负责观察周围环境,里程计与 IMU 帮助估计机器人移动后的状态,SLAM 再把这些信息组织成地图。导航利用定位、地图和障碍信息安排路线,让底盘接近目标。

同一块黄油,在摄像头里是一个图像目标,在导航里是需要靠近的位置,到了机械手臂面前,又成了需要配合动作的物体。

机械手臂与桌面黄油盒的近景

这也是做移动机器人很有意思的地方。一个目标出现在画面里以后,问题会从「它在哪里」,一路延伸到「我怎么过去,到了以后怎么动手」。视觉、定位、控制,各自的一小步,要接成同一件事。

再给它加上一张能聊天的嘴

动画里的黄油机器人会开口问自己的意义。复刻这份交互感,我也给它接上了语音对话,让它可以接住一句话,给出回答。

这条链路分成三段。麦克风收到声音,语音识别把它变成文字;本地大模型生成回答;语音合成再把回答念出来,由扬声器播放。

识别使用 sherpa-onnx,文本生成通过 RKLLM 在板端运行千问模型。主要识别与推理任务交给端侧处理,也就有了视频里那组「听」和「想」的分工。

视频中 sherpa-onnx 与千问模型的端侧分工示意

我在当时的问答测试里,把响应延时压到了 1 秒以内。对话按流式方式衔接,识别、生成和播报可以逐步处理,让它尽快接回话头。

声音也有它自己的角色感。我通过百度的音色复刻服务,复刻了动画中黄油机器人的音色,同时也训练了自己的音色,把一个数字化的自己放进了它的身体里。

它还可以切换河南话、四川话等说话方式。一个方头单眼的小家伙,外形还带着科幻味,开口以后却突然变得很亲切,这种搭配挺有意思。

语音功能展示段落中的黄油机器人头部与摄像头

其中,文字回答在本地生成,音色合成使用云端服务,需要相应的网络与账号配置。端侧的识别与思考、云端的声音输出,分别承担自己的工作。

为了让基础交互也有独立的入口,我还接入了 CI-03T 离线语音模块,可以配置唤醒词与基础命令。画面里的「你好莫蒂」,就是这种自定义唤醒的例子。

离线语音配置页面中的自定义唤醒词“你好莫蒂”

这条离线入口负责唤醒和基础指令,复杂对话与音色输出则继续走对应的模型和服务。让机器人能接话,也要考虑它在不同网络条件下,哪些事情仍然可以继续做。

小身体里,两块控制器各管一摊

把这些功能装进一台机器人,主控怎么分工是绕不开的事。

黄油机器人用 RK3588S 运行 ROS 2、视觉和语音相关程序,ESP32-S3 负责底盘电机与外设控制。两边通过串口交换指令和状态。

RK3588S 提供 8 核 CPU 和 6 TOPS 的 NPU 算力,用来接住摄像头、雷达和模型带来的计算任务。给这个小家伙准备足够的算力,后面才能继续把不同功能接上来。

视频中用于说明 RK3588 主控部分的板卡示意

ESP32-S3 守着更具体的执行工作。比如左右电机需要多快、反馈速度有没有跟上,就要靠底层控制持续处理。

视频中用于说明 ESP32-S3 与底层控制的图示

我给左右电机分别做了 PID 速度闭环。目标速度发下去以后,还要看编码器反馈的实际速度,再持续修正控制输出。

通过 Web 上位机查看电机响应数据,调参就有了可以观察的对象。响应慢了,动作会拖;修正得过头,又容易来回震荡。我需要在这些反应之间,找到适合这副履带底盘的平衡。

Web 上位机中的电机目标速度与实际速度调试面板

有了平滑的运动,它还需要知道自己在什么姿态、移动到了哪里。

轮式里程计、IMU、关节角度和 TF 坐标变换,分别把移动、姿态与各部分的空间关系交给系统。关节状态映射到模型上,里程计与 IMU 用于估计底盘状态,屏幕里的它就能和面前的实物对应起来。

黄油机器人实物与 Foxglove 中的虚拟模型对照

当实物的动作在虚拟模型里也有了对应,我就可以从另一个视角看它。关节有没有到预期位置,坐标关系是否合理,车身姿态发生了什么变化,这些都变成了可以观察的数据。

这种对自身状态的感知,有一点像人的本体感觉。放到机器人身上,传感器、坐标变换与状态估计把它建立起来,继续支撑后面的定位与控制。

用网页,看见它的世界

ROS 2 把这些模块联系起来。相机有相机的程序,检测有检测的程序,底盘、定位和语音也各有职责,数据通过话题与接口传递。

为了看见它们怎么配合,我搭建了 Foxglove 控制台。连接机器人后,在电脑网页里就能查看模型、地图、雷达扫描、关节状态和话题数据,配合视频画面,观察这个小家伙正在接收什么信息。

Foxglove 控制台中的地图、扫描点、模型与话题数据

白色和灰色的地图、彩色的扫描点,以及中间的机器人模型,放在同一块屏幕上,空间关系就清楚了很多。感知与控制有了画面,调试也有了落脚的地方。

它还保留了键盘和手柄操控,可以直接控制底盘。视频里,我也演示了手势交互,让伸到它面前的一只手,成为另一种与它打交道的方式。

作者使用手柄操控桌面上的黄油机器人

视频中的手势交互演示,手部与机器人同框

这些入口在动手调整功能的时候很有用。自主任务有自己的流程,直接操控与状态观察则让我能把其中一段拿出来,继续试、继续改。

从一个动画形象,接着往下玩

这个项目把角色造型、底盘运动、视觉识别、语音交互和定位导航放进了同一台实物里。每一部分都可以单独研究,组合起来,又有一个很具体的任务把它们串着。

为了让一块黄油被找到、被靠近、被机械手接住,我给它准备了边缘算力、传感器、模型和控制器。等到这些东西终于配合起来,回头看它的岗位说明书,还是那三个字。

递黄油。

但那些调整内部堆叠的夜晚,给零件刷上底色、看着各部分装回一起的过程,还有程序接通以后,屏幕里的模型开始和实物对应的瞬间,都留在了这个作品里。

工作台上为黄油机器人安装和调整头部

对于想动手的朋友,黄油机器人也是一个可以继续折腾的平台。可以关注机械结构,研究控制,也可以从视觉或语音入手。图纸、代码、训练模型和配套教程已经整理成资源,教程把环境准备、硬件连接与各功能部署分开讲,方便按需要继续深入。

看着桌上这个方头单眼的小家伙,动画里的轮廓已经变成了能接收数据、做出动作的实物。它还是那副有一点委屈的模样,面前也还是一块黄油。

黄油机器人实物与屏幕上的角色结构设计图

它的任务很小。创造它的过程,却容得下很多好奇。

把它做出来,这件事本身,就已经很有意思了。

鸿尘客 Honchic · 把脑洞焊到电路板上

接着看

再读几篇项目与技术手记。

返回机器人开发

读到这里,也聊聊你的想法。

项目复刻、技术交流,或者一起折腾点什么。