LLM-State:Open-World-State-Representation-for-Long-horizon-Task-Planning-With-Large-Language-Model

这篇文章的真实环境演示视频链接:https://www.youtube.com/watch?v=QkN-8pxV3Mo

摘要

本研究解决了在开放的家庭环境中使用大型语言模型(LLM)进行长时间任务规划的问题。现有的工作未能明确跟踪关键对象及其属性,导致在长时间任务中做出错误的决策,或者依赖大量工程化的状态特征和反馈,这并不具有通用性。我们提出了一种开放的状态表示方法,该方法利用LLM的上下文理解和历史行动推理固有能力,持续扩展和更新对象属性。我们提出的表示方法能够全面记录对象的属性及其变化,支持对导致当前状态的行动序列进行可靠的回顾性总结。这使得持续更新的世界模型成为可能,从而增强任务规划中的决策上下文理解。通过在模拟和现实任务规划场景中进行实验,我们验证了我们的模型,并展示了在需要长时间状态跟踪和推理的各种任务中,相较于基准方法的显著改进。

Introduction

任务规划的重要性:在开放家庭环境中进行任务规划能高效地自动化日常琐事,提升生活质量,并促进身体有障碍人士的无障碍体验。

存在的问题

  1. 未知的转移模型、多样的目标和有限预定义操作类型(arbitrary objects with limited predefined action types)的任意物体等因素为任务规划构成重大挑战。当前大型语言模型(LLM)的高级能力,如常识推理,使它们能够应对这些挑战。

  2. 基于LLM的方法要么利用大量的真实对象,要么手动设计状态表示,在开放世界环境中的长期任务上仍显不足。由于部分可观察信息,LLM更难管文本以有效地追踪和分析对象属性。

因此,发现一种能够增强对象属性跟踪并结合全面上下文理解的新表示形式,是该领域的迫切需求。这将改善LLM在关键任务规划任务中的决策能力,使系统能够更好地适应新任务和新环境。

工作内容

使用LLM,提出了一种新的开放环境任务规划状态表示方法。

通过试错方式更新世界模型,从而更准确地估计当前状态、动作前提条件和未知的转换效果。我们的方法结合了结构化的对象中心表示和非结构化的历史操作和观察到的操作失败的总结。

结构化的对象中心表示将世界描述为一个对象列表,每个对象具有不同的属性,指示它们的当前状态。例如,在图1中的任务“加热一些食物并传递给用户”中,状态可以表示为“食物:在微波炉中,加热中”,其中“在微波炉中”和“加热中”是食物项目的关键属性。为了构建这种结构化表示,我们首先使用LLM作为Attention从图像对象检测结果的长列表中识别相关对象。然后,我们将LLM用作StateEncoder,以识别的对象和机器人执行的操作作为输入,并以新的对象属性作为输出。例如,LLM接收“机器人将食物放入微波炉并打开开关”并输出状态“食物:在微波炉中,加热中”。这种对象中心表示是开放的,因为对象的数量及其属性可以动态扩展和更新,为LLM作为Policy生成可操作的命令提供了更灵活的表示。

进一步的问题:1. 任务序列尺度增加,导致输入信息过多,预测对象属性变得不准确;2. 结构化表示可能会缺失重要信息。

提出额外的非结构化表示,总结最近失败的机器人动作和失败原因。使LLM通过step-bt-step的思维链过程更准确的预测对象属性。失败推理可以在我们的非结构化摘要中捕获,并用于告知LLM生成新的用于复杂开放世界任务的动作策略。

总而言之,我们提出了一种新的状态表示,用于在开放世界中通过LLM进行任务规划,该表示由LLM自动构建和更新,用于对象状态跟踪和推理。这种表示兼容新的对象属性,并结合了回顾性摘要,以更好地预测属性和恢复故障,从而显著提高开放世界场景中长周期任务规划的性能。我们假设存在一个完美的基于图像的对象检测器和强大的低级别动作控制器。

  1. 任务规划与LLMs

例如通过将指令分解为动作序列,生成可执行代码,将自然语言翻译为正式规格,并为经典规划器提供辅助信息。大多数研究假设环境中所有对象及其准确属性都可用或直接感知检测,并用作LLMs推理和规划的状态表示。

存在的问题: 然而,这些预定义的状态表示无法捕捉现实世界复杂性。一些研究采用自我反思技术或外部模型进行失败解释,但这些非结构化的总结对于需要明确状态跟踪的复杂、长远任务可能效率低下。相关研究接受编码图像作为状态表示并输出后续动作,其中感知和推理模块被耦合在一起。然而,这些模型通常需要大量特定领域的多模态数据,并且可能缺乏在不同领域中的泛化能力。

为了在不失去泛化性的情况下实现灵活性,我们的工作依赖于感知-推理分解,并作为感知和推理之间的接口。推理方面,我们的状态表示在结构和灵活性之间取得了平衡,从而提高了效率和泛化能力。

  1. 任务规划中的状态表示

任务规划,即符号规划,涉及基于初始状态和动作效果描述来决定动作序列以实现目标。状态表示是任务规划的关键方面,因为它们定义了规划发生的环境。在经典规划中,这些表示是预定义的,通常使用谓词(predicate,描述了主语的状态活性位)来跟踪状态变化。基于LLM的规划系统可以适应多种问题描述,避免定义所有谓词和转换模型的需要。一些方法在提示中使用详尽的对象和属性描述,而其他方法依赖于人工设计和特定任务的状态表示。最近的方法探索了具有反思的动态记忆、场景图中的语义搜索、多感官总结和训练任务条件状态描述,以实现更灵活的状态表示。

**存在的问题:**然而,现有基于LLM的规划系统面临的一个主要挑战是它们无法明确地跟踪灵活的状态变化,特别是涉及未定义的谓词时。这一限制影响了开放世界规划中的一致性和效率。在这项工作中,我们探索了LLM的 动作推理 能力,以自动和明确地构建和跟踪具有全面上下文理解的结构化对象,使LLM能够有效地解决长时间跨度的任务。

PROBLEM FORMULATION

…………

METHOD

框架总览

Experiment and Evaluation

Stimulation Experiments

  1. 实验配置

我们使用VirtualHome [36](一个大规模的家庭仿真平台,包含各种互动对象、容器和房间。X. Puig, K. Ra, M. Boben, J. Li, T. Wang, S. Fidler, and A. Torralba,
“Virtualhome: Simulating household activities via programs,” in Pro-
ceedings of the IEEE Conference on Computer Vision and Pattern
Recognition, 2018, pp. 8494–8502)来评价我们的方法。我们关注任务规划的性能,并用仿真API调用替换了感知模块和低级控制器。观测和动作空间的具体细节可以在第三部分中查看。机器人可以检测到同一房间内的物体,但无法检测到封闭容器内的物体。实验在5张房屋地图中进行,如图5所示,每张地图包含15个任务。任务被分为简单(少于30个步骤) 和困难 (多于30个步骤) 水平的综合评估。

我们将我们的方法与3个基线进行比较:InnerMonologue 4,ProgPrompt [5],以及不带我们的LLM-State表示的LLM的一个简单版本。InnerMonologue在长跨度任务中经常超过最大token限制。为了解决这个问题,我们维护了一个窗口,称为InnerMonologue-W。这个问题在使用长历史观察和行动作为状态的方法中很常见。ProgPrompt生成代码而不是自由形式的文本来执行任务计划。为了公平比较,我们还为ProgPrompt添加了重新计划过程。对于简单的LLM,我们将观察和行动历史直接提示给LLM,类似于以前的工作 [6]。

[4] W. Huang, F. Xia, T. Xiao, H. Chan, J. Liang, P. Florence, A. Zeng, J. Tompson, I. Mordatch, Y. Chebotar et al., “Inner monologue: Embodied reasoning through planning with language models,” in Conference on Robot Learning. PMLR, 2023, pp. 1769–1782.

[5] I. Singh, V. Blukis, A. Mousavian, A. Goyal, D. Xu, J. Tremblay, D. Fox, J. Thomason, and A. Garg, “Progprompt: Generating situated robot task plans using large language models,” in 2023 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2023, pp. 11 523–11 530.

[6] C. H. Song, J. Wu, C. Washington, B. M. Sadler, W.-L. Chao, and Y. Su, “Llm-planner: Few-shot grounded planning for embodied agents with large language models,” in Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV), October 2023

框架总览

  1. 模拟实验结果:

模拟实验的主要结果如 Table I 所示。我们将提出的方法的性能与基线进行了比较,可以得出以下结论:

我们的方法在简单和复杂任务上都优于基线方法。 对于简单任务,我们的方法成功率(SR)达到92.5%,超过了Inner Monologue的65%和ProgPrompt的85%,这表明我们的状态表示是有效的。对于复杂任务,我们的方法实现了令人印象深刻的77.14%成功率,而Inner Monologue和ProgPrompt未能完成任何任务,这证明了我们方法在处理复杂任务时的有效性。Inner Monologue和ProgPrompt未能完成长时间任务可归因于其缺乏状态跟踪和上下文理解。我们的方法在包含多个步骤或需要状态跟踪的任务中特别有效,将困难任务的成功率从8.71%提高到77.14%。没有状态跟踪的情况下,基准方法在复杂任务中会失败,而我们的方法由于明确的状态跟踪和推理而成功完成它们。

我们进行了一个消融研究,以评估我们状态表示中各个组件的影响。该研究比较了3种配置:没有回顾性总结(w/o Summary)、没有对象条目(w/o Objects)和我们的完整状态表示(Our)。如 Table II 所示,非结构化的回顾性总结和结构化的对象条目在我们的方法中起着关键作用。在较简单的任务中,性能差异较小。然而,在复杂任务中,两个组件的重要性变得显而易见。没有回顾性总结时,成功率仅为14.29%,强调了其在处理复杂状态跟踪中的重要作用。没有对象条目的模型达到了64.86%的成功率,而我们的完整状态表示达到了77.14%,这表明在需要多步骤规划和复杂操作的任务中,拥有结构化状态表示的重要性。

对比试验

消融实验

真实实验结果:

  1. 真实世界中的实验设置:

为了验证我们的系统在实际世界中的效果,我们使用现成的(out-of-shelf)感知模型和(low-level)低级控制器。我们使用 Fetch mobile manipulator robot在一个由4个房间组成的典型真实家庭环境中设计了我们的实验,这些房间分别是厨房、会议室、客厅和办公室。每个房间中放置了各种各样的物品。系统集成在IV-D中讨论。所有决策、感知和低级控制的计算均在一台配备NVIDIA RTX 4090 GPU的Linux机器上完成。感知模块在任务开始时以及机器人进入新房间或打开封闭容器后被调用。出于安全原因,当生成的操作指令不在我们学习的技能库中或违反了现实世界中的规则时,人工监控将直接否决执行,该操作将返回失败。这个过程可以通过自适应分布外(OOD)检测[38]自动实现。

我们将三个基线方法与我们提出的方法进行了比较。
我们在真实机器人上评估了我们的方法,任务是:“从冰箱里拿些食物并把它带到沙发上。”这个任务运行在一个具有挑战性的开放世界环境中,开始时没有食物,没有冰箱,也没有加热设备。这也是一个长时间任务,需要超过20次真实机器人操作才能完成。对于每个真实可执行的机器人操作,我们允许3次重试。最大步骤数为30。成功与否由人类进行评估,以检查在现实世界中目标状态是否满足。

实验结果

  1. 实物机器人系统实验结果:

实物机器人系统实验的结果如 Table III 所示。所有基准点都无法解决这一任务,因为它们无法意识到当机器人拿着食物时,不能打开微波炉。缺乏明确的状态跟踪导致它们无法将失败动作open(microwave)与之前的动作pick up(food)联系起来。相比之下,我们的方法自动跟踪对象的非预定义符号属性{food: in hand},从而能够捕捉到导致微波炉无法打开的实际原因。在如图6所示的实验中,机器人有效地完成了扩展任务。如图6e所示,状态表示有助于语言模型理解打开微波炉未成功的尝试。鉴于明确的状态{food: in hand},它制定了一个新策略:首先将食物放在桌子上,然后尝试打开微波炉并完成剩余步骤,从而成功完成任务。

感知与操作模块:

感知模块使用RGB-Depth摄像头数据,为任务规划提供文本对象检测结果,并为每个对象记录3D坐标,从而增强导航和操作。机器人通过调整6个不同角度覆盖360度范围。
图像标签使用模型(Recognize anything: A strong image tagging
model,)获取,并且Grounding DINO提供边界框。最后,Segment-Anything 提取掩码,并与RGB-D数据融合进行3D帧后投影。由感知模块提供的检测对象的位置和3D坐标使用ROS内置路径和运动规划工具进行导航。

对于操作技能,采用了模仿学习策略(A reduction of imitation learning
and structured prediction to no-regret online learning),使得复杂的动作如开微波炉或从冰箱中抓取物体成为可能。这涉及使用VR控制器,允许人类示教者以6自由度精确控制机器人的抓取器,并通过屏幕远程监控其摄像头视野。所收集的数据用于训练使用模仿学习的模型,输入包括RGB-D图像和机器人手臂的关节状态,并预测关节角度移动序列。每个原始动作平均收集30次轨迹演示,使用真实机器人进行。

Conclusion

在本文中,我们提出了一种新颖的、动态的、可扩展的表示方法,用于在开放世界中进行任务规划。我们提出的表示方法根据可观察的动作不断扩展和更新对象属性,并利用LLM的上下文理解和历史动作推理能力。实验结果表明,我们提出的表示方法显著优于基准方法,提升了LLM的任务规划性能,尤其是在长时间任务上。展望未来,一个潜在的改进是将对象关系包含在状态表示中。这类信息可以极大地增强LLM的推理能力和上下文理解,解决更具挑战性的任务规划问题,并进一步提升性能。我们相信,所提出的表示方法为开放世界任务规划中的LLM未来研究提供了一个有前景的方向。

计算机如何通信(不同局域网下)

前文中介绍了怎么使用socket在相同局域网下通信,接下来介绍在不同局域网下如何通信。

这个问题的源头在于IP,在路由器下的主机并没有实际的公网IP,而是一般由数据传输到有公网IP的路由器,再由路由器根据内网IP与主机通信。这种时候,需要使用端口映射等手段,实现主机的内网穿透。

更为麻烦的情况,是路由器的IP也不是公网IP,而是网络运营商提供的内网IP,端口映射方法也无法生效。

公网IP和WAN口的IP相同(端口映射)

当两IP相同时,可使用端口映射的方式实现Socket通信。

供应商为了节省公网IP,有时会分配一个内网IP给你,这个IP会分配到路由器的WAN口上。

WAN口IP:登录路由器(浏览器输入192.168.1.1或192.168.0.0),可查看WAN口IP。

公网IP:百度搜索IP,可在网页中查看到公网IP。

如若二者一致,则可通过端口映射的方式,完成通信。

在路由器管理界面的NAT设置处找到 端口映射 或者 虚拟服务器 设置。

服务器与客户端代码输出

如上图,将对应WAN口下主机的内网IP和想使用的端口输入内部服务器IP和内部端口,外部端口尽量选择一个9000以上的数字。

如此,就实现了将路由器公网IP的端口映射到局域网下对应端口的操作。

此时的服务器与客户端代码:

1
socket_server.bind(("内网IP", 内部端口))
1
socket_client.connect(("公网IP", 外部端口))

代码详见上一节;

由此可实现通信。

公网IP和WAN口的IP不同(ngrok)

如若二者不同,那只能求诸其他方式;下文中采用的方式亲测有效。

  1. 首先需要在服务器上安装 ngrok。

或者直接通过命令行安装:

  1. 获取 ngrok 认证令牌
    为了使用 ngrok,你需要注册一个 ngrok 账户并获取认证令牌。登录到 ngrok 后,获取 authtoken(认证令牌)并将其添加到本地配置中。
1
$ ngrok config add-authtoken <your-auth-token>

如此便可以将服务器的 Flask 服务通过 ngrok 隧道暴露到公网,并通过这个 URL 来实现通信。

服务器代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from flask import Flask, jsonify, request
from pyngrok import ngrok

app = Flask(__name__)

@app.route('/send_data', methods=['POST'])
def send_data():
data = request.json
print(f"Received data from B: {data}")
return jsonify({"status": "success", "received_data": data})

if __name__ == '__main__':
# 启动 ngrok 隧道,将本地的 5000 端口暴露到公网
public_url = ngrok.connect(30005)
print(f" * ngrok tunnel \"{public_url}\" -> \"http://127.0.0.1:5000\"")

# 启动 Flask 服务
app.run(port=30005)

上述代码会有输出:

ngrok tunnel "{public_url}" -> "http://127.0.0.1:5000"

将上述输出的public_url填到下方。(注意/send_data不要遗漏)

客户端代码:

1
2
3
4
5
6
7
8
9
10
import requests

# 电脑 A 暴露的 ngrok URL
url = "public_url/send_data"

# 向电脑 A 发送 POST 请求
response = requests.post(url, json={"message": "Hello from B!"})

# 打印返回的结果
print("Response from A:", response.json())

计算机如何通信(相同局域网下)

Socket通信工具

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

在下图中,它位于应用层与传输层之间,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

计算机网络结构

关于TCP、IP是什么:https://ivel-li.github.io/2024/11/29/计算机网络结构/

Python 通信代码

Socket通信,需要一个服务器端和客户端。

服务器端示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import socket

socket_server = socket.socket()
socket_server.bind(("127.0.0.1", 11451))
# 监听端口
socket_server.listen(1)
# 等待客户端连接,accept方法返回二元元组(连接对象, 客户端地址信息)

conn, address = socket_server.accept()
print(f"接收到了客户端的连接,客户端的信息:{address}}")

while True:
# 接收消息
data: str = conn.recv(1024).decode("UTF-8")
print(f"客户端发来消息:{data}")
# 回复消息
msg = input("已收到信息。")
if msg == 'exit':
break
conn.send(msg.encode("UTF-8")) # encode将字符串编码为字节数组对象

# 关闭连接
conn.close()
socket_server.close()

上述代码中,bind函数将服务器的ip和端口号与socket对象绑定,在局域网(同一路由器)下可直接使用内网ip(如192开头ip,127.0.0.1的本机环路ip)通信,端口号的选择注意不要与其他进程端口号冲突。

1
socket_server.bind('ip',端口号)

客户端实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务器
socket_client.connect(("127.0.0.1", 11451))

while True:
send_msg = input("要发送给服务端的消息:")
if send_msg == "exit":
break
# 发送消息
socket_client.send(send_msg.encode("UTF-8"))
# 接受消息
recv_data = socket_client.recv(1024).decode("UTF-8") # 1024是缓冲区大小,一般就填1024, recv是阻塞式
print(f"服务端回复的消息是:{recv_data}")

# 关闭连接
socket_client.close()

示例代码中使用环路ip 127.0.0.1 进行本机与本机通信,故可在同一台主机下分别运行这两个代码尝试完成通信。

服务器与客户端代码输出

计算机网络结构

引入

本文主要参考1

下图中的7层结构不需要看,仅是引入。
(因为现代的网络交换机和路由器通常集成了多个层次的功能。此外,一些协议可能跨越多个层次,而某些层次的功能可能在不同的操作系统或应用程序中实现。所以这个结构和实际硬件很难对得上了。)

计算机网络的7层套路

WAN:广域网(Wide Area Network)

MAN: 城域网(Metropolitan Area Network))

LAN:局域网(Local Area Network)

计算机网络结构与功能

计算机网络的层次结构

上图为国际标准化组织(ISO)于1984年提出,旨在为不同厂商的网络设备与协议提供参考框架,OSI体系结构(Open Systems Interconnection Reference Model)。

但OSI模型是一个理论模型,实际应用中更广泛采用的是TCP/IP模型,它将OSI模型的部分层次合并,简化为四个层次:链路层、网络层、传输层和应用层。

OSI结构与TCP/IP结构对比

TCP(传输控制协议,Transmission Control Protocol)

TCP/IP四层结构

  1. 网卡(NIC):也称为网络适配器,是连接计算机和其他网络设备的硬件设备。负责将计算机数据转换成在网络传输的格式,以及将接收的数据转换回计算机可理解的格式。

  2. 集线器(Hub):在物理层工作,用于连接多个网络设备,并将信号从一个端口广播到所有其他端口。属于OSI中的网络层,在端口间起作用,现在这玩意没用了。(此处端口应为物理端口)

  3. 交换机(Switch):在链路层工作,可以识别数据包中的MAC地址(而集线器不能,相当于集线器里你给别人私发消息都会变成群发),并根据这些地址将数据包转发到正确的端口。一般现在用于Wifi接口插满了,用交换机扩展一下。

网络层(Internet Layer):

路由器(Router):在网络层工作,根据数据包IP决定最佳传输路径,并将数据包从一个网络转发到另一个网络,可以连接到不同的局域网(LAN)和广域网(WAN)。提供网络地址转化(NAT)、防火墙和带宽管理等功能。

(tips:集线器和交换机主要处理同一局域网内的数据传输,而路由器负责不同网络间数据传输)

现在路由器通常集成了交换机、路由器和猫(数模转换:数据转为光电信号以在光纤中传播)的功能,只是更复杂的网络环境中,可能需要额外交换机来扩展有线连接。

传输层(Transport Layer):

传输层不直接对应到具体的硬件设备,而是通过软件协议实现,如TCP(传输控制协议)和UDP(用户数据报协议)。

  1. TCP:在传输开始时,在通信双方间建立一个连接,这一过程通常涉及“三次握手”序列,用于序列号、重传、确认应答、窗口、动态调整机制,数据传输可靠性更强。

    适用于需要可靠数据传输的应用,比如web浏览(HTTP),文件传输(FTP),远程登录(Telnet)等。

  2. UDP:传输开始前无需连接,传输快、延迟低,适用于在线游戏、视频等服务。

(tips:协议的意思是一组标准与规则,大家遵循这些规则以保证数据在网络上顺利传输、处理和接受)

应用层(Application Layer):

应用层是最接近用户的层次,它提供了网络服务和应用程序接口,使得用户可以通过应用程序访问网络资源。应用层包括许多协议和网络服务,例如:HTTP、FTP、SMTP、DNS等。

(常见的 FTP 监听 20、 21 端口,而 HTTP 服务监听 80 端口等 https://ivel-li.github.io/2024/11/25/%E7%AB%AF%E5%8F%A3%E6%98%AF%E4%BB%80%E4%B9%88)

传输层与应用层的界限::传输层负责网络中两个节点间端到端的数据传输服务。应用层负责特定应用的数据交换与网络服务功能。

(tips:SSH在TCP层之上工作,因为SSH本身虽然安全,但依旧需要TCP的数据包确认、重传、排序机制保证数据稳定传输。)

参考

robot-learning-lab-note

Language Models as Zero-Shot Trajectory Generators

使用prompt工程设计的LLM完成机械臂执行task的代码的实时生成。(https://arxiv.org/pdf/2310.11604)

Input: Main prompt and task instrution

Output: execution code

Keypoint Action Tokens Enable In-Context Imitation Learning in Robotics

创建了KAT(keypoint Action Tokens)框架来将视觉信息转为text输入LLM完成sequence to sequence 的模仿学习任务。(https://arxiv.org/pdf/2403.19578)

训练:输入目标关键点坐标和机械臂控制序列*n组,加入prompt中。

测试:输入目标关键点坐标,集成训练时的机械臂控制序列进行机械臂action推理。

Adapting Skills to Novel Grasps: A Self-Supervised Approach

(https://arxiv.org/pdf/2408.00178)

从单一抓取姿势到新的抓取姿势的关于抓取物品的操作轨迹的自适应推广。

(此处的抓取姿势强调的是末端执行器抓取着物品完成任务时的不同姿势,比如抓取着榔头敲钉子)

本文提出了一种只需要一段自监督数据,便能直接完成轨迹自适应推广的方法,期间一个外部相机对末端执行器与被抓取物品的移动轨迹进行观察。

大致流程

符号:W{W}世界帧,E{E}末端执行器帧,O{O}被抓取对象的帧。

定义了纠正转换cTEE^{c}T_{EE'},在部署时改变末端执行器轨迹,使物品遵循与demo中相同轨迹

符号

图像作为输入,预测

自监督数据收集:首先抓取着物品的末端执行器移动到参考位置 RTWE^{R}T_{WE} ,参考位置可以是任意的,仅要求其对相机清晰可见,从 RTWE^{R}T_{WE} 开始,采样并将机器人移动到相对于参考位置的随机姿态 NTEE^{N}T_{EE'} ;在每个末端执行器姿态 RTWE^{R}T_{WE} NTEE^{N}T_{EE'} ,记录图像与逆变换 NTEE1^{N}T^{-1}_{EE'}

(所以实际上它完成了一个从图像对变换矩阵的回归预测任务,因为采集的时候数据可以自动记录,所以才称为逆变换。)

MILES: Making Imitation Learning Easy with Self-Supervision

(https://arxiv.org/pdf/2410.19693)

方式对比

进行一次demo演示,接着记录轨迹的一些waypoint,通过在不同waypoint旁边随机采样起始点,再完成回到waypoint的任务,完成自监督数据采集与训练。

增强轨迹

DINOBoT-Robot-Manipulation-via-Retrieval-and-Alignment-with-Visio-Foundation-Models

原文链接:https://www.robot-learning.uk/dinobot

Abstract

我们提出了一种针对机器人操作问题的新型模仿学习框架DINOBot,其利用了使用DINO训练的Vision Transformers提取得到的图像与像素级别的特征。当与新目标交互时,DINOBot首先使用这些特征检索在人类演示过程中(训练过程中)最相似的目标,然后使用该对象将其末端执行器与新对象对齐(将夹持器置于对象的起始交互位置,例如置于其正上方(align:对齐)),以实现有效的交互。通过对日常任务的一系列现实世界实验,我们表明,利用视觉基础模型的图像级和像素级特性,可以实现前所未有的学习效率和泛化能力。

key points:

  1. one-shot能力:从单次演示中学习。
  2. generalising and robust:可以泛化到不同目标且对干扰与视觉变化具有鲁棒性。

基于视觉的模仿学习问题拆分:

  1. 图像检索:从演示数据集中进行图像级检索。
  2. 像素对其:通过像素级对齐实时图像与目标图像。

使用DINO(sota vision foundation models)进行图像处理。

DINOBot能够通过一个演示学习许多日常任务(one-shot),包括需要精确或灵巧的任务,对许多不同物体的泛化,以及对干扰和视觉变化的鲁棒性。

Method

通过检索、对齐和回放完成操作任务

Manipulation via Retrieval, Alignment and Replay

previous work: (https://www.robot-learning.uk/retrieval-alignment-replay)

1. 演示记录(Demon recording)

训练:每个任务提供单次演示和目标标签。每个demo存储三个数据点:

  1. 瓶颈观测(bottleneck observation):demo开始时的姿态,机械臂相机捕捉到的图像。在记录演示轨迹前,机器人会从不同姿态观察,并收集结果和姿态数据集用于训练对齐策略,以便测试时末端执行器可以回到bottleneck pose。

  1. 末端执行器轨迹(end-effector trajectory):存储了夹持器(末端执行器)在演示中的轨迹和。

  1. 任务名称(Task name)。注:demo标注包括object+task两部分。

2.检索

在部署时,使用DINO的图像特征理解能力,与演示记录的视觉特征进行比较,在找到最佳匹配后,执行对应轨迹

3.对齐

使用Best Buddies Nearest Neighbours matching算法,找到一组实时目标与demo中目标的特征最接近的descriptors,然后使用RGBD相机投影到3D。

4.重放

如若对齐是精确的,则可以使用简单的轨迹回放来完成操作。

Experiment

在超过50个目标上执行了15个任务,DINOBot展现出了强大的执行效果与few-shot能力

实验效果

one-shot示意

generalising示意

通过提取一组实时图像与demo图像的离散关键点进行对齐,具有一定鲁棒性

演示

实时实验

Limitations and prospect

  1. 无法解决需要实时复杂反馈的任务,比如跟踪物体的边缘。

  2. 可以引入第三人称摄像头,获取更多信息

  3. 当前框架采用简单的重放轨迹的方式,拥有one-shot能力的同时失去采用few-shot的效果。

  4. 泛化性:无法适应形状区别过大的物体。

  5. 主要的操作原因:a. 目标图像检索出错 b. 错误的目标匹配 c. 相机的噪声深度估计(RGBD,depth估计错误,影响对齐) d. 无法交互(与demo中物体形状相差过大)

c的影响因素最大。

相同文字的三个版本

故事的结局https://www.bilibili.com/video/BV1GUVaeqEAK

致意为记忆划上末尾之后,就丧失了一切重温旧梦的权力,无论在何时何处回顾,眼前始终横亘着一座名为结局的墓碑,它告诉你:“只可到此处,不可越过。”

三伏天与绒毛白蜡

2023/8/22

前几日听妈妈感慨:到底是三伏天,街上热得要死;我反问立秋都过了这么久,怎么还在说三伏,接着便被教育一番,得知三伏分为初伏、中伏和末伏,而末伏是得在立秋后第二个庚日前一天结束;在此之前,我一直以为,三伏等同于盛夏的代名词,记载了一切在毒辣的阳光和潮湿的空气里发生的故事。

说到节气,去年12月6日,我曾在记事本里写下:霜降将至,是夜,在听《漂流少年》主题曲《少年少女》。总是有种还踩着夏日尾巴的感觉,尽管连秋天都快要结束了。或许是因为听着《少年少女》的原因,《漂流少年》的故事只能在夏天发生,也注定会在夏天结束……彼时的我曾暗许下誓言,在某个夏日即将结束的夜晚,我会蹲坐在屏幕前,将《漂流少年》的故事从头到尾再看一遍,将那场盛大而荒诞的漂流镌刻在神经元新建立的突触里,直到片尾的演职员表开始滚动、荧幕渐渐黯淡下去,片尾曲里银杏Boyz突然吼一嗓子“どうせgoodbye”将我从睡眠中惊醒,恍惚间我无法分辨此间是现实还是梦境,故又沉沉睡去。醒来时已将故事遗忘、也将再次见闻这场故事的记忆遗忘,于是在下一年的某个相似的夜晚,我会蹲坐在荧幕前,再一次履行从来未曾实现并且永远不可能实现的誓言。

记事本里那篇文章的结尾处写着:窗外灯火幽幽,银杏已落满街头。其实我知道8宿前的落叶并非银杏,只是色相有些许相似;如同三伏并不等同于盛夏,曾给我留下过类似印象罢了。奈何燕园里明黄如金的银杏时常入侵少年的梦境,我又总盼望着那些理应属于盛夏的故事在三伏延续,便姑且妄作,愿能粉饰回忆。

逃离的故事

2024/4/16

窗外灯火幽幽,银杏已落满街头。」

2021年霜降是夜,我蜷缩在八里台8宿102室4号床位,望着楼外绒毛白蜡的叶子在晚风中簌簌散落,写下了如上文字。那时的我并不知晓银杏的模样,却固执地把一切校园里的落叶都错认作银杏。究其缘由大抵是年少时读过的一本小说,书里说燕园的银杏明黄如金,一无所有的作者徜徉在校园,觉得自己是世界的皇帝;食堂前男生女生排成两列,男生们敲打饭盆吸引对侧的注意,午风过后金色银杏叶哗啦啦地落下,落在她们的发梢和肩头,装点了那些或笑或恼的鲜活面容。记忆鲜明若此,可八里台不是燕园,绒毛白蜡也亦非银杏,这并不意味着良莠之分,二者不同罢了。

很长一段时间里,我痴迷于逃离的故事,甚至以此主题写了不少破烂。比如原本是写少年少女想在最后的假期去看海却未能如愿的故事,结果却变成了青年想在最后的假期写一篇“少年少女想在最后的假期去看海却未能如愿”的小说却未能如愿的故事。原因倒也简单,在假期的尾巴里,他说服自己接受了借云顶之弈劳逸结合的谎言,让故事在真正发生前戛然而止,而后转到作者的视角,诠释了注定遗憾的主旨……此外我还写过一些成句不成篇的片段,比如:

“我刚去买了杯酒,喏,就是我手指的那家,旁边开着花店。我发现啊,无论是杰尔德还是赫尔堡,吧台里小可可乐的味道都是一样的。”

“杰尔德和赫尔堡,本来就没什么不同。”

“从一座囚笼,逃到了另一座囚笼。”

“……不开心?”

“唔嗯,其实我很开心的.....一想起那时候,就忍不住笑起来。”

“至少,  在那些叛逃的夜晚,我觉得我是自由的。”

如果能写完的话这或许是一个类似红拂夜奔的故事,不过应该没王小波那么啰嗦。在写下这些文字的彼时,我大概已经意识到逃离究竟意味着什么,在字里行间埋下了晦涩的谶言;可我只是如死刑犯一般闭上双眼,对三尺外的枪口选择视而不见。

诚如开头所言,这本该是一篇写于2021年霜降的短文,只今却已披阅三载、增删数次,以至于我早已遗忘了它最初的模样。无法令人满意的原因显而易见,从主旨上而言,它只是讲述了在青少年时期的彷徨与若隐若无的遗憾,较之身边人所经历的真正的遗憾而言只能说不值一提,放在青春伤痛文学里也会作为角落里轻描淡写的无聊数笔,没有任何人在意。可惜的是,这份无聊真真切切来自于我的生活,所谓的我手写我心,如果仅剩下现时的无聊与往日的残响,那到底又能写些什么呢?

只是河水已经漫到胸口,尾生知道他必须要离开了。

许在多年后,我会无比殷羡此刻这点破事都能大书特书的自己。在我为某事焦头烂额时,这份被称为无聊的遗憾也会变成一种奢望。(现在还不赖的原因居然是因为以后可能会更坏吗?)小时候写春风悲回,梨花的枝桠颤动,散落积攒了一个春天的繁华。可我早过了心思细腻如春草的年纪,没有资格再去写这种东西了,只能写最近711二十周年庆,大伙能不能帮我抢一个限定福袋!

致谢

2024/6/15

「窗外灯火幽幽,银杏已落满街头.」

2021年霜降是夜,我蜷缩在八里台8宿102室4号床位,望着楼外绒毛白蜡的叶子在晚风中簌簌散落,写下了如上文字。那时的我并不知晓银杏的模样,却固执地把一切校园里的落叶都错认作银杏。缘故大抵是年少时读过的小说,书里说燕园的银杏明黄如金,食堂前男生女生排成两列,男生们朝着对侧敲打饭盆吹起口哨,午风过后金色银杏叶哗啦啦地落下,落在她们的发梢和肩头,装点或笑或恼的鲜活面容。许久后我在巧合中知晓,绒毛白蜡并非银杏,正如八里台并非燕园,这并不意味着良莠之分,仅是命运的轨迹不同罢了。

去年霜降,我坐612 班车回八里台。下车后取道西南门,渡桥时有秋风悲回,带来那些早已死去事物的余响一一我意识到我曾听到这些语言,那是华南的丘陵被云海吞没时,我透过舷窗望向那片被阴影遮蔽的土地,从翻涌如海的云层的缝隙里,传来的往日的回唱。

春和景明时,我骑着哈啰单车途径梨树园。梨花的枝桠颤动,春风里飘飘着积攒一个春天的繁华:在风的语言里,我什么也听不到了。

感谢我在xx大学度过的四年时光。感谢xx学院老师们对我的辛勤栽培,感谢xx教授对我的支持,感谢xx老师的指导,感谢父母对我生活与精神上的鼓励,感谢实验室学长学姐对我的帮助,感谢朋友们四年的陪伴。感谢!.

当自由的鸟儿选择了驻足-《赛博朋克·边缘行者》

对知乎提问的回答:

动画《赛博朋克:边缘行者》中,Lucy 明明幸存到最后,为什么还是那么让人心痛?
https://www.zhihu.com/question/555193942/answer/2688194809

因为她已经不是第一二集里那个自由洒脱、乖张而神秘的女侠黑客了。

她选择了舍弃夜之城“不信任任何人”的准则,和大卫分享羞于启齿的愿望,信任大卫“带自己去月球”的诺言,将肉身与灵魂托付给了这个注定离自己而去的男人。而那个原本虚无缥缈的梦想,也逐渐转变成了希望眼前人能好好活下去。

但是正如魅音所言,这样的爱情对于夜之城来说过于浪漫了;在这个灯火通明的囚笼中,大家仅是活着就得拼尽全力,无暇顾及那些遥不可及的愿望。

并非夜之城是梦想的坟场,而是夜之城里的人们根本没有梦想。

大家其实并不知道自己到底想要什么,只是如果不把灵魂寄托于某处,自己就失去了活下去的动力。

大卫母亲把梦想寄托给大卫,希望他能实现阶级跨越,站上荒坂塔的顶楼;露西把梦想寄托给月球,但真相其实是紧接着的下一句话——“我只是想远走高飞。”;魅音把梦想寄托于前进本身,不休止地进行肉身改造,但前进的理由呢?他并不清楚。

正如所有人都不知道自己到底想要什么,接过前人理想的大卫也没有意识到他们所说的梦想到底是何物——于是他根据魅音的遗嘱不断加装义肢,“继续前进”;站上荒坂塔的顶楼,俯瞰夜之城的一切;平分最后一单的钱,送露西去了月球…他并没有意识到:无论是母亲、魅音、丽贝卡还是露西,大家想要的,只是他能好好活下去而已。

从这一层面来说,大卫背叛了所有人的梦想,所以我们看到大卫嘶吼、抗争,感受到的却是无止息的虚无。

对于露西,若她还是一二集里那个乖张洒脱的天才黑客,或者说故事结尾她与大卫一同隐入尘土,结局或许反而会让人好受一些。

但我们看到的,是光彩夺目的cool girl变得小鸟依人,自由的灵魂选择了皈依,从未有过信任的女孩托付了自己的一切;而那个接过这些的男孩,却永远地死去了。

仅留露西一人,承受淹没整座夜之城的孤独。

她登上心心念念的月球,满眼却是那个男孩的影子。

当自由的鸟儿选择了驻足,那她就再也无法离开了

By ivel

2022/9/25

街角的小剧院

每个礼拜日,钟敲十二下的时候,我会在杰尔德南部的卡西米尔街区,贝南街街头摆着空花架的咖啡店里,点一份加冰小可可乐;直到马蹄声踏碎午后的寂静,酒保前去安抚受惊的风铃,以免惊扰客人们的睡眠,我动身前往贝南街尽头,走向那面肆意洒满红色颜料的剧院外墙。

未等车夫挽绳、安顿好车马,后座的杂役先行跳下,攥着钥匙在满目赤色中摸索寻到与墙面融为一体的小门,旋即从马车上搬下货物,与正侧身遁入剧院的我擦身而过。

基于长期以来的默契,他只与我发生了极为短暂的目光交集,随即向后台奔去;而我按图索骥找到倒数第二排颜色最鲜明的座位坐下,观察起匆忙奔走的杂役、磕磕巴巴念着台词的新演员和不时打断表演的导演。

当暮色渐合,剧院里陆续点起华灯,观众如蚁群迁徙窸窸窣窣入场,占领靠前的巢穴;除了偶尔可见的几对少年少女,观众大多都是周围街区的老主顾——不过说是老主顾,其实大抵并不爱话剧,只碍于卡西米尔娱乐之贫瘠,选择拥到此处与街坊邻居凑凑热闹,道些坊间轶闻、飞流短长,至精彩处与戏台上相较唯有过之而无不及。因此,观众们悄声低语的气势喧宾夺主的情况并不罕见,而剧务并无心打扰这盛况,除非事态紧急——虽然我觉得即便事态紧急,他也无心去管就是了。

观众如此表现其实也算事出有因。剧组的表演的确乏善可陈,大部分时候都是些狗血却并不有趣的烂片,内容无非鸡毛蒜皮的琐事、对黑帮生活的臆想、烂俗的伦理剧场这几类。譬如今天的剧目:《不忠》。女人的丈夫在黑帮仇杀中死去,故事从他的追悼会开始。前一幕女人靠在棺椁旁哭得痛不欲生,后一幕女人便被前来吊唁的年轻男子挑逗哈哈大笑;他们逛街、游园、赏花,像每对热恋期的情侣所做的那样——待新人情至深处时,男子道出了那个不出所料的真相:他就是杀掉女人丈夫的仇人。男子将几欲跌倒的她扶起,说其实自己是女人丈夫的挚友,只因他已走上绝路,无奈让挚友帮忙了结并将女人托付给自己……一如既往的充斥着莫名其妙的反转的故事。正当我好奇接下来女人会如何抉择,她像一缕天鹅绒缓慢坠落,微微侧过头,凝视着观众方向,任头发散落遮蔽视野,仅留下一寸泛红的眼角和瞳仁折射出的微光。

故事的最后,女人和男子在丈夫墓前告别,她说她已经决定离开杰尔德了,而其实在那个告白的瞬间她袖里藏着一柄匕首,她早就知道丈夫为他所害,只是一直静候寻仇的时机;男子问她既然现在已经真相大白,那为何不遵循逝者的遗言,把握住自己的幸福好好活下去;女人沉默了一会,接着回答道:“我松开匕首时,我突然意识到:‘我放弃复仇的原因,并非是知道了事情的真相,而是发觉我已经爱上你了。’”

女人转身向帷幕后走去,她穿着那日追悼会上的装束,亦是初见年轻男子时的打扮。她没有回头。

观众的哄笑声远去了,连同逐渐消失在帷幕阴影里那个小小的白色身影。

我兀自鼓起了掌。

By ivel

2023/5/15

初恋

「 来自于和徒弟告别时徒弟开的一个玩笑:

“你居然没有谈过恋爱?!真是可惜了这张脸。”

“这没也没谁规定说一定得谈恋爱啊,再说你年轻时好好干混出头,上年纪了组织自然给你安排……”

“停停停,师父你真的……唉,也是。一想到你这没救了的性格,一切又显得很合情合理。”

“也幸好,若是哪个姑娘白瞎了眼看上你,那才是倒了血霉,大好青春就被你这种烂人霍霍……疼疼疼,别揪我耳朵了!” 」

虽然我没谈过恋爱,但我有过初恋——严格意义上说,应该叫初暗恋。

那段记忆在故纸堆深处蒙尘许久,直至昨日午夜蓦地从睡梦中惊醒,我才恍然回忆起那个阳光透过窗棂、洒落在咖啡银匙上的悠远午后。

在年少时的某个清晨,我默默跟在李临川身侧,穿行于杰尔德的朦胧雾霭中。我不时装作不经意地瞟向他清瘦而略微佝偻着的身影,印象里他的脸总是灰蒙蒙的、萦绕着一层永不消散的雾色。我们沿卡西米尔南部的街道向北徐行,那是镇中心的方向。作为上次任务的奖励,他答应带我到镇上看看。

他交给我五个铜板,嘱咐当钟敲五下的时候回到市镇府前的喷泉旁等他。

记忆里镇上的那些招牌都镀着金色,阳光在橱窗边沿色散、折射出彩色连续光谱,橱窗里堆满我从未见过的新奇物件。

我在一家只有黑白和灰色的咖啡馆前驻足,踌躇了许久,终于鼓起勇气推开了门扉。

骤然响起的风铃声和写满未知词汇的招牌让彼时我本就脆弱的自尊顷刻间土瓦解。在我犹豫着缓慢后退,试图在引起店员注意前离开时,一旁的女招待看出少年的窘迫,她向我推荐了最喜欢的咖啡,价格恰巧五个铜板。

我望向她,那是一张年轻干净的脸,在颧骨处分布着淡色雀斑;她看上去并不比我年长几岁,眉眼间写满了少女独有的灵动与神气。

我如她所愿点单,到窗前的座位等候。许久后她端着瓷盘缓步凑前,微微弯腰低头,红色发梢低垂如有微风拂过鼻翼,带来雨后青草的气息。

“请慢用。”

阳光透过窗棂洒落在咖啡银匙上,它光滑如镜的背面反射出咖啡馆的内饰和少女来回忙碌的身影。那日的咖啡非常苦涩,尽管她特意加了双份的糖。

到埋单时,我小心翼翼递上5个铜板,却被店员告知需要支付10%的服务费;在我手足无措的瞬间,少女招待悄无声息靠近前台,排出一枚铜板:“这次我先帮他垫付了。”

我不可置信地看向她,接着不住道谢,直到少女噗嗤一笑,开玩笑道:“小子别高兴太早,下次得双倍还我。”

我匆忙答应、极力掩饰羞得涨红的脸颊,逃也似的离开了。

剩下的时间里我呆坐在市镇府的喷泉前,看形形色色的人流车马往来逡巡,如海潮般涌起复又在黄昏时归于沉寂。

傍晚回村途中,李临川断断续续哼着来自他故乡的歌谣,趾尖与脚跟以一种诡异的节奏敲打石板面,罕见的喜形于色。

他出乎意料地问我午后去向,我一五一十告知,他忽地来了兴致,问我咖啡馆具体所在,确认后轻描淡写道:“真是巧了,下次任务目标正是那家咖啡店的老板,霍华德·格里弗雷。高个子、高鼻梁、红头发,脖子上有一块半径1公分的胎记。对了,那家咖啡店的招待也别忘了处理,蕾妮·格里弗雷,她是店长的女儿,身高和你差不多,红色短发,脸上有雀斑……你今天应该已经碰见过他们了。”

李临川蓦地顿了一下,因为他发觉后边的少年并没有跟上。

他直愣愣地呆站在原地,不知神游到何处。

“这次的目标是霍华德·格里弗雷,咖啡店的老板……和蕾妮·格里弗雷,咖啡店女招待这两人吗。”

“是的。”

“……”

“……齐利斯你想说什么?”

“一定得把他们,他们两个人都处理掉吗?”

李临川顿感诧异,这是他第一次见到齐利斯对任务内容感到犹豫;然而基于他对人心细致入微的体察,片刻后他便理解了一切。他不禁莞尔道:“其实那个小女孩不处理掉也没关系,只要你刺杀霍华德时不留痕迹就行,不过……或许你把她也处理掉,才是更好的选择。”

行将压垮我的沉重暮色霎时变轻了些许,骤然恢复呼吸的权利,我不由得踹了口粗气;彼时的我沉浸在随李临川的应许而来的庆幸中,把其后他说的话都抛诸脑后。

一周后的子夜,我在咖啡馆对侧的巷子里静候良久,女招待早已先行离开,四周也久不见人迹,唯余霍华德·格里弗雷一人在橱柜前一筹莫展。

他在做什么?为什么这么晚了还待在店里?为什么歇业时间过这么久还不打扫卫生?

算了。

我认为时机已到,沿着墙壁边缘无声靠近他身后,捻着准备好的钢绳搭在他脖颈上陡然发力。

他挣扎着从高脚椅上摔倒,连带着将我压倒在地;我虽一惊,却并未放松攥紧钢绳的手指;他的指甲探到脖颈附近,试图扣入钢绳的间隙,将自身的脖颈划得满是血痕,却依旧无济于事。

这样的力量拉锯并未持续太久,尔后他又试图挣扎了几次,而随着双腿一蹬、重重坠到地面,再也没了声息。

我喘着粗气起身,划开拇指取血,准备融化霍华德的尸首。

风铃声和少女的喊声。

“爸爸,我取水回来了。”

接着是木桶坠落,水漫过地面,抵达我脚侧的尸体边沿,与血交融汇成泾渭分明的液面。

我难以置信地向后望去,像做错事等待责罚的小孩那般惶恐;我对上那双被猎枪惊起的小鹿般的眼睛,充斥着恐惧与愤怒。

少女的呐喊与板凳腿一齐向我奔来,我躲闪不及、一个趔趄倒地;她转身从柜台抽出餐刀,反手斩向杀人凶手。

我下意识将她推开,见她像纸片般飞走,撞到柜台角,坠落下去。

我敲遍了每一扇诊所的门,每一扇门都将我拒之门外。

是教会的神父接纳了我,他答应尽其所能治疗。

她活下来了吗?

我不知道。我觉得,她许是死了。

我再也没见过她,那家咖啡馆的风铃再也没有响起。

这是我遗忘了许久的、初恋的故事。

(我并非想要做什么,只是习惯于这么做。)

By ivel

2024/1/12