我们将 ChatGPT 的功能扩展到机器人,并通过语言直观地控制机器人手臂、无人机和家庭助理机器人等多个平台。
你有没有想过用你自己的话告诉机器人该怎么做,就像你对人类一样?只是告诉你的家庭助理机器人:“请加热我的午餐”,然后让它自己找到微波炉,这不是很神奇吗?尽管语言是我们表达意图的最直观方式,但我们仍然严重依赖手写代码来控制机器人。我们的团队一直在探索如何改变这一现实,并使用OpenAI的新AI语言模型ChatGPT实现自然的人机交互。
ChatGPT 是一种在大量文本和人类交互语料库上训练的语言模型,使其能够对各种提示和问题生成连贯且语法正确的响应。我们这项研究的目标是看看ChatGPT是否可以超越文本思考,并推理物理世界来帮助完成机器人任务。我们希望帮助人们更轻松地与机器人互动,而无需学习复杂的编程语言或有关机器人系统的详细信息。这里的关键挑战是教 ChatGPT 如何解决考虑物理定律、操作环境背景以及机器人的物理动作如何改变世界状态的问题。
事实证明,ChatGPT 可以自己做很多事情,但它仍然需要一些帮助。我们的技术论文描述了一系列设计原则,可用于指导语言模型解决机器人任务。这些包括但不限于特殊的提示结构、高级 API 和通过文本的人工反馈。我们相信,我们的工作只是我们开发机器人系统方式转变的开始,我们希望激励其他研究人员进入这个令人兴奋的领域。继续阅读有关我们的方法和想法的更多技术细节。
当今机器人技术面临的挑战,以及 ChatGPT 如何提供帮助
当前的机器人管道始于工程师或技术用户,他们需要将任务的要求转换为系统代码。工程师坐在循环中,这意味着他们需要编写新的代码和规范来纠正机器人的行为。总的来说,这个过程很慢(用户需要编写低级代码),昂贵(需要具有深厚机器人知识的高技能用户)和低效(需要多次交互才能使事情正常工作)。
ChatGPT 解锁了一种新的机器人范式,并允许(潜在的非技术)用户坐在循环中,在监控机器人性能的同时向大型语言模型 (LLM) 提供高级反馈。通过遵循我们的设计原则,ChatGPT 可以为机器人场景生成代码。无需任何微调,我们就利用LLM的知识来控制各种任务的不同机器人外形。在我们的工作中,我们展示了ChatGPT解决机器人难题的多个示例,以及在操纵,空中和导航领域的复杂机器人部署。
使用ChatGPT的机器人技术:设计原则
催生法学硕士是一门高度实证的科学。通过反复试验,我们构建了一种方法和一套设计原则,用于编写机器人任务的提示:
1. 首先,我们定义一组高级机器人 API 或函数库。该库可以特定于特定的机器人,并且应映射到机器人的控制堆栈或感知库中的现有低级实现。为高级 API 使用描述性名称非常重要,这样 ChatGPT 就可以推理它们的行为;
2. 接下来,我们为 ChatGPT 编写一个文本提示,描述任务目标,同时明确说明高级库中的哪些函数可用。提示还可以包含有关任务约束的信息,
3. 或者 ChatGPT 应该如何形成它的答案(特定的编码语言,使用辅助解析元素);用户通过直接检查或使用模拟器来评估 ChatGPT 的代码输出。如果需要,用户使用自然语言向 ChatGPT 提供有关答案质量和安全性的反馈。
4.当用户对解决方案感到满意时,可以将最终代码部署到机器人上。
理论够了...ChatGPT到底能做什么?
让我们看一个例子...您可以在我们的代码存储库中找到更多案例研究。
(这里我们只举例一个比较有趣的例子,原文中还有其他机器人的例子)
循环用户:当复杂任务需要对话时
接下来,我们在机器人手臂的操作场景中使用了 ChatGPT。我们使用对话反馈来教模型如何将最初提供的 API 组合成更复杂的高级函数:ChatGPT 自己编码。使用基于课程的策略,该模型能够将这些学到的技能逻辑地链接在一起,以执行堆叠块等操作。
此外,该模型还展示了一个有趣的示例,即在用木块构建Microsoft徽标时桥接文本域和物理域。它不仅能够从其内部知识库中调用徽标,还能够“绘制”徽标(作为SVG代码),然后使用上面学到的技能来确定哪些现有的机器人动作可以构成其物理形式。
以下是与chatGPT关于如何控制机器人手臂以制作具有Microsoft徽标颜色的SVG文件的对话。
用户:
想象一下,我们正在使用一个机械手机器人。这是一个具有 6 个自由度的机械臂,其末端执行器上连接着一个抽吸泵。我希望你能协助我向这个机器人发送命令,给定一个场景和一个任务。
在任何时候,您都可以访问以下功能:
grab():打开抽吸泵抓取物体
release():关闭抽吸泵以释放物体
get_position(对象):给定一个对象名称的字符串,返回真空泵接触对象顶部的坐标和方向 [X, Y, Z, Y, 偏航, 俯仰, 滚动]
move_to(位置):它将抽吸泵移动到给定位置 [X, Y, Z, 偏航, 俯仰, 横滚]。
您可以使用这些函数创建新函数,但不允许使用任何其他假设函数。
保持解决方案简单明了。位置以毫米为单位,角度以度为单位。您也可以使用标签“问题 - ”提出澄清问题。下面是一个示例方案,演示了如何提出澄清问题。
假设一个场景包含两个球体。
聊天:
问题 - 有两个领域。你想让我拿哪一个?
用户:
球体 1,请。使用 python 代码来表达您的解决方案。准备好了吗?
聊天:
是的,我准备好了。请描述场景和任务。
用户:
场景中有以下对象:白垫、方框、蓝方块、黄色方块、绿色方块、红色方块、棕色方块 1、棕色方块 2。这些积木是高度为 40 毫米的立方体,位于 80 毫米深的盒子内。这些块只能从盒子的顶部到达。我想让你学习捡起一个物体并握住它的技巧。为此,您需要在物体上方移动安全距离(100 毫米),到达物体,抓住它并将其提起。
聊天:
理解。这是一个 Python 函数,它采用对象的名称,将机器人手臂移动到对象上方,抓住它,然后将对象移动到对象上方 100 毫米的安全距离。请注意,该函数假定机器人手臂最初处于安全的起始位置。
import timedef pick_up_object(object_name):# get the position of the objectobject_pos = get_position(object_name)# move the robot arm to a safe position above the objectsafe_pos = [object_pos[0], object_pos[1], object_pos[2]+100, object_pos[3], object_pos[4], object_pos[5]]move_to(safe_pos)# move the robot arm to the object's positionmove_to(object_pos)# grab the objectgrab()time.sleep(1) # wait for the object to be firmly attached# move the robot arm back to the safe position above the objectmove_to(safe_pos)
复制
要使用此功能,只需调用pick_up_object并以字符串形式提供要拾取的对象的名称,例如 pick_up_object(“红色块”)。
用户:
伟大!现在我想让你学习如何在一个位置放置和反对。考虑到您拿着一个通用对象,您首先需要移动到目标位置上方的安全位置,将对象放下,然后释放它。
聊天:
理解。这是一个Python函数,它占据了应该放置物体的位置,将机器人手臂移动到该位置上方,将物体放下,然后释放它。请注意,该函数假定机器人手臂正在握住一个物体。
def place_object(position):# move the robot arm to a safe position above the target locationsafe_pos = [position[0], position[1], position[2]+100, position[3], position[4], position[5]]move_to(safe_pos)# move the robot arm to the target locationmove_to(position)# release the objectrelease()# move the robot arm back to the safe position above the target locationmove_to(safe_pos)
复制
要使用此功能,只需调用 place_object 并将目标位置作为 6 个数字的列表提供,例如 place_object([100, 200, 50, 0, 0, 0])。请注意,位置的单位以毫米为单位,方向角以度为单位。
用户:
伟大!现在我希望你使用这些技能来捡起绿色块并放在白色垫子上。所有块的高度均为 40 毫米。
聊天:
确定!这是Python代码,用于拾取绿色块并将其放在白色垫上:
# get the positions of the green block and white padgreen_pos = get_position("green block")white_pos = get_position("white pad")# pick up the green blockpick_up_object("green block")# calculate the position to place the block on the white padplace_pos = [white_pos[0], white_pos[1], white_pos[2]+40, 0, 0, 0]# place the block on the white padplace_object(place_pos)
复制
此代码使用 get_position 函数获取绿色块和白垫的位置,使用我们之前定义的pick_up_object函数拾取绿色块,计算将块放置在白垫上的位置,并使用我们之前定义的place_object函数将块放置在白垫上。请注意,我们将块的高度(40 mm)添加到白色垫子的高度上,以确保块放置在垫子的顶部。
用户:
伟大!现在我希望你把两个棕色块堆叠在绿色块的顶部。
聊天:
确定!以下是将两个棕色块堆叠在绿色块顶部的 Python 代码:
# get the positions of the green block and both brown blocksgreen_pos = get_position("green block")brown1_pos = get_position("brown block 1")brown2_pos = get_position("brown block 2")# pick up the first brown blockpick_up_object("brown block 1")# calculate the position to place the block on top of the green blockplace_pos = [green_pos[0], green_pos[1], green_pos[2]+40, 0, 0, 0]# place the first brown block on top of the green blockplace_object(place_pos)# pick up the second brown blockpick_up_object("brown block 2")# calculate the position to place the block on top of the first brown blockplace_pos = [green_pos[0], green_pos[1], green_pos[2]+80, 0, 0, 0]# place the second brown block on top of the first brown blockplace_object(place_pos)
复制
此代码使用 get_position 函数获取绿色块和两个棕色块的位置,使用我们之前定义的 pick_up_object 函数拾取第一个棕色块,计算将第一个棕色块放置在绿色块顶部的位置,并使用我们之前定义的place_object函数将第一个棕色块放在绿色块的顶部。然后,它拾取第二个棕色块,计算将第二个棕色块放置在第一个棕色块之上的位置,并使用我们之前定义的place_object函数将第二个棕色块放在第一个棕色块的顶部。请注意,我们将绿色块的高度(40 mm)添加到前一个块的高度上,以确保该块放置在前一个块的顶部。
用户:
棒!我现在想使用这些块在白垫上构建微软的徽标。它由四种颜色组成,形成一个正方形,左下角为蓝色,右下角为黄色,左上角为红色,右上角为绿色。
聊天:
确定!以下是使用块在白色垫上构建Microsoft徽标的Python代码:
# get the positions of the blocks and the white padwhite_pad_pos = get_position("white pad")blue_pos = get_position("blue block")yellow_pos = get_position("yellow block")red_pos = get_position("red block")green_pos = get_position("green block")# pick up the blue blockpick_up_object("blue block")# calculate the position to place the blue blockplace_pos = [white_pad_pos[0]-20, white_pad_pos[1]-20, white_pad_pos[2]+40, 0, 0, 0]# place the blue block on the white padplace_object(place_pos)# pick up the yellow blockpick_up_object("yellow block")# calculate the position to place the yellow blockplace_pos = [white_pad_pos[0]+20, white_pad_pos[1]-20, white_pad_pos[2]+40, 0, 0, 0]# place the yellow block on the white padplace_object(place_pos)# pick up the red blockpick_up_object("red block")# calculate the position to place the red blockplace_pos = [white_pad_pos[0]-20, white_pad_pos[1]+20, white_pad_pos[2]+40, 0, 0, 0]# place the red block on the white padplace_object(place_pos)# pick up the green blockpick_up_object("green block")# calculate the position to place the green blockplace_pos = [white_pad_pos[0]+20, white_pad_pos[1]+20, white_pad_pos[2]+40, 0, 0, 0]# place the green block on the white padplace_object(place_pos)
此代码使用 get_position 函数获取白垫和所有四个块的位置,使用我们之前定义的pick_up_object函数依次拾取每个块,计算将块放置在白垫上的位置,并使用我们之前定义的place_object函数将块放在白垫上。我们使用块颜色来确保正确构建徽标。我们将蓝色块放在左下角位置,黄色块放在右下位置,红色块放在左上角位置,绿色块放在右上角位置,如提示中指定。
将机器人技术带出实验室,走向世界
我们很高兴发布这些技术,旨在将机器人技术带给更广泛的受众。我们相信,基于语言的机器人控制将是将机器人技术带出科学实验室并交到日常用户手中的基础。
也就是说,我们确实强调,ChatGPT 的输出并不意味着在没有仔细分析的情况下直接部署在机器人上。我们鼓励用户利用仿真的强大功能,以便在潜在的实际部署之前评估这些算法,并始终采取必要的安全预防措施。我们的工作只代表了机器人领域大型语言模型交叉点的一小部分,我们希望激发未来的大部分工作。