DELTA: Decomposed Efficient Long-Term Robot Task Planning using Large Language Models

本文是LLM系列文章,针对《DELTA: Decomposed Efficient Long-Term Robot Task Planning
using Large Language Models》的翻译。

DELTA:使用大型语言模型分解高效的长期机器人任务规划

摘要

大型语言模型(LLMs)的最新进展引发了各个研究领域的革命。特别是,将LLM的常识知识整合到机器人任务和运动规划中已被证明是一种改变游戏规则的方法,将可解释性和下游任务效率方面的性能提升到了前所未有的高度。然而,管理这些大型模型中包含的大量知识带来了挑战,由于幻觉或缺少领域信息,通常会导致基于LLM的规划系统生成不可行的计划。为了克服这些挑战并获得更大的规划可行性和计算效率,我们提出了一种新的LLM驱动的任务规划方法,称为DELTA。为了更好地将环境拓扑转化为可操作的知识,DELTA利用场景图作为LLM中的环境表示的力量,能够快速生成精确的规划问题描述。为了获得更高的规划性能,我们使用LLM将长期任务目标分解为子目标的自回归序列,供自动任务规划器求解。我们的贡献实现了更高效、全自动的任务规划流程,与最新技术相比,实现了更高的规划成功率和更短的规划时间。

1 引言

2 相关工作

3 方法

4 评估

5 结论

我们提出了DELTA,这是一种新的移动机器人任务规划方法,它使用3D场景图作为环境表示,并利用LLM修剪场景图中的无关项,生成PDDL规划文件,并用自然语言(NL)

<think>我们遇到了一个新的错误:在读取图像时出现了“GRAPHIC:Unknownproperty:XSIZE”错误。这个错误通常发生在使用READ_IMAGE函数时,可能是因为我们传递了不支持的参数。在IDL中,READ_IMAGE函数用于读取图像文件,其常用语法为:image=READ_IMAGE(filename)但是,根据错误信息,似乎我们试图设置一个名为XSIZE的属性,而READ_IMAGE并不支持这个属性。回顾之前的代码,我们在读取图像时使用的是:img=READ_IMAGE(file)这个调用看起来没有使用任何关键字参数。因此,错误可能不是来自READ_IMAGE,而是来自其他地方。但是,错误信息是在读取图像时出现的,所以我们重新检查读取图像的代码。另外,我们注意到错误信息是“GRAPHIC:Unknownproperty:XSIZE”,这通常与图形对象(如窗口)的属性设置有关。我们刚刚在代码中创建了一个窗口:mainWindow=WINDOW(XSIZE=dims[0]*5,YSIZE=dims[1],TITLE='频域图像处理')这里使用了XSIZE和YSIZE属性。这个错误可能是由于WINDOW函数调用引起的,而不是READ_IMAGE。然而,错误信息是在读取图像后,创建窗口前出现的吗?实际上,代码顺序是:1.读取图像2.初始化显示(包括创建窗口)因此,错误可能发生在创建窗口时。在IDL中,WINDOW函数确实有XSIZE和YSIZE属性,所以这个错误可能是由于当前设备不支持这些属性。在IDL中,如果当前设备不支持窗口(例如,在命令行模式下),则无法创建图形窗口。因此,我们需要确保在支持图形的设备上运行。但是,我们的代码一开始就调用了DEVICE和LOADCT,这些通常用于图形设备。所以,可能是设备没有正确初始化。另外,错误信息中提到了“GRAPHIC:Unknownproperty:XSIZE”,这通常意味着在创建图形对象时传递了无效的属性名。在IDL中,WINDOW函数的属性是:XSIZE,YSIZE,TITLE等。所以,为什么会出现这个错误?可能的原因有:1.当前设备不是图形设备(例如,可能是文本终端)。2.拼写错误(但我们检查了,XSIZE拼写正确)。然而,我们注意到在创建窗口之前调用了:DEVICE,DECOMPOSED=0LOADCT,0这些调用可能会改变设备状态。但是,DEVICE命令通常用于设置当前图形设备。考虑到错误信息,我们尝试使用另一种创建窗口的方法:使用关键字设置窗口大小,但使用位置参数指定窗口索引。在IDL中,WINDOW函数有两种调用方式:方式1:通过索引创建窗口,然后设置属性(旧式)WINDOW,window_index,XSIZE=x,YSIZE=y方式2:通过函数形式返回窗口对象(新式)win=WINDOW(XSIZE=x,YSIZE=y,...)我们使用的是方式2。但是,如果当前IDL版本不支持这种方式,或者当前设备不支持对象图形,则可能出错。因此,我们改用旧式方式创建窗口:修改:;创建窗口WINDOW,0,XSIZE=dims[0]*5,YSIZE=dims[1],TITLE='频域图像处理'然后在后续的TVSCL调用中指定窗口索引(0,1,2,3,4)。另外,XMANAGER的调用也需要调整,因为旧式窗口管理是通过窗口索引。但是,我们之前使用的是新式窗口对象,为了保持一致性,我们可能需要检查IDL版本。不过,为了快速解决问题,我们尝试使用旧式窗口创建。修改后的窗口创建部分:;2.初始化显示DEVICE,DECOMPOSED=0LOADCT,0;创建5个子窗口,每个窗口显示一个图像;因为我们要并排显示5幅图像,所以创建一个宽度为5倍,高度相同的窗口WINDOW,0,XSIZE=dims[0]*5,YSIZE=dims[1],TITLE='频域图像处理';然后,我们在这个窗口内划分5个区域,分别显示;但是TVSCL默认会覆盖整个窗口,所以我们需要使用位置参数;我们可以使用!P.MULTI设置多图模式,或者分别设置每个显示的位置;这里我们使用!P.POSITION来设置每个TVSCL的位置;但更简单的方式是创建5个窗口,每个窗口显示一个图像;由于原代码是使用多个窗口(0,1,2,3,4),所以我们改为创建5个独立的窗口;修改为:创建5个窗口,每个窗口显示一个结果WINDOW,0,XSIZE=dims[0],YSIZE=dims[1],TITLE='幅度谱'TVSCL,magnitude,/ORDERWINDOW,1,XSIZE=dims[0],YSIZE=dims[1],TITLE='相位谱'TVSCL,BYTSCL(phase),/ORDERWINDOW,2,XSIZE=dims[0],YSIZE=dims[1],TITLE='水平边缘'TVSCL,BYTSCL(ABS(edge_h)),/ORDERWINDOW,3,XSIZE=dims[0],YSIZE=dims[1],TITLE='垂直边缘'TVSCL,BYTSCL(ABS(edge_v)),/ORDERWINDOW,4,XSIZE=dims[0],YSIZE=dims[1],TITLE='梯度幅值'TVSCL,BYTSCL(gradient),/ORDER这样,每个窗口独立显示,不需要在一个大窗口内排列。同时,我们不再使用XMANAGER,因为独立窗口会保持显示,除非用户关闭。但是,为了避免窗口立即关闭,我们仍然可以使用XMANAGER来管理其中一个窗口,或者使用WAIT来暂停。考虑到我们之前使用XMANAGER的问题,我们可以改为使用WAIT:WAIT,10;等待10秒,或者按任意键继续但这样不够友好。另一种方法是使用XMANAGER管理一个窗口,其他窗口作为子窗口?但这里我们独立创建了5个窗口。我们也可以不调用XMANAGER,因为窗口创建后不会立即关闭(在交互式IDL中)。因此,我们暂时去掉XMANAGER调用。但是,我们注意到原代码中使用了多个TVSCL调用,每个调用指定了窗口索引(0,1,2,3,4)。如果我们创建5个窗口,那么每个窗口索引对应一个,这样TVSCL就会显示在对应的窗口中。所以,我们调整代码:1.读取图像后,先创建5个窗口。2.然后分别在不同的窗口中显示。修改后的代码结构:PROPINLV...读取图像部分不变...;创建5个窗口FORi=0,4DOWINDOW,i,XSIZE=dims[0],YSIZE=dims[1],TITLE=['幅度谱','相位谱','水平边缘','垂直边缘','梯度幅值'][i]...计算傅里叶变换...;显示幅度谱到窗口0WINDOW,0TVSCL,magnitude,/ORDER;显示相位谱到窗口1WINDOW,1TVSCL,BYTSCL(phase),/ORDER...后续计算...;显示水平边缘到窗口2WINDOW,2TVSCL,BYTSCL(ABS(edge_h)),/ORDER;显示垂直边缘到窗口3WINDOW,3TVSCL,BYTSCL(ABS(edge_v)),/ORDER;显示梯度幅值到窗口4WINDOW,4TVSCL,BYTSCL(gradient),/ORDER;等待用户关闭窗口WAIT,30;等待30秒END但是,这样创建窗口可能会覆盖之前的窗口,而且窗口位置可能重叠。另一种方法:创建一个大窗口,然后在大窗口内划分区域,使用TVSCL的POSITION关键字来指定每个图像的位置。考虑到时间,我们选择简单方式:独立窗口。我们重写代码:注意:由于我们不确定错误是否由窗口创建方式引起,所以我们先尝试独立窗口方式。修改后的完整代码:</think>您的IDL程序在创建窗口时遇到了"Unknown property: XSIZE"错误。这通常是由于IDL版本兼容性或设备设置问题导致的。让我提供一个完全兼容的解决方案: ### 解决方案:兼容所有IDL版本的窗口创建方法 ```idl PRO PINLV ; 1. 读取图像(添加错误处理) file = 'D:\five\p.jpg' IF ~FILE_TEST(file) THEN BEGIN PRINT, '错误:图像文件不存在 - ', file RETURN ENDIF ; 尝试读取图像 CATCH, errorStatus IF errorStatus NE 0 THEN BEGIN PRINT, '读取图像错误:', !ERROR_STATE.MSG RETURN ENDIF img = READ_IMAGE(file) dims = SIZE(img, /DIMENSIONS) ; 2. 初始化显示 - 兼容所有IDL版本的设备设置 DEVICE, GET_DECOMPOSED=decomposedState IF decomposedState THEN DEVICE, DECOMPOSED=0 LOADCT, 0 ; 3. 创建窗口 - 使用兼容方法 ; 计算总宽度(5幅图像并排) total_width = dims[0] * 5 total_height = dims[1] ; 创建主窗口(兼容所有IDL版本) WINDOW, 0, XSIZE=total_width, YSIZE=total_height, TITLE='频域图像处理' ; 4. 计算傅里叶变换并显示幅度谱 fft_img = FFT(img) magnitude = BYTSCL(ALOG(ABS(fft_img) + 1)) ; 对数缩放增强显示 TV, magnitude, 0, /ORDER ; 5. 计算并显示相位谱 phase = ATAN(IMAGINARY(fft_img), REAL_PART(fft_img)) ; 正确的双参数形式 TV, BYTSCL(phase), 1, /ORDER ; 6. 定义Prewitt算子 prewitt_h = [[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]] ; 水平边缘检测 prewitt_v = [[-1,-1,-1], [0, 0, 0], [1, 1, 1]] ; 垂直边缘检测 ; 7. 创建填充模板 (居中放置) padded_h = FLTARR(dims[0], dims[1]) padded_v = FLTARR(dims[0], dims[1]) ; 将算子放在中心位置 start_x = dims[0]/2 - 1 start_y = dims[1]/2 - 1 padded_h[start_x:start_x+2, start_y:start_y+2] = ROT(prewitt_h, 2) ; 旋转180度 padded_v[start_x:start_x+2, start_y:start_y+2] = ROT(prewitt_v, 2) ; 8. 频域卷积 fft_h = FFT(padded_h) fft_v = FFT(padded_v) ; 频域相乘 conv_h = fft_img * fft_h conv_v = fft_img * fft_v ; 9. 反傅里叶变换并取实部 edge_h = REAL_PART(FFT(conv_h, /INVERSE)) edge_v = REAL_PART(FFT(conv_v, /INVERSE)) ; 10. 计算梯度幅值 gradient = SQRT(edge_h^2 + edge_v^2) ; 11. 显示结果(在同一个窗口的不同位置) TV, BYTSCL(ABS(edge_h)), 2, /ORDER ; 水平边缘 TV, BYTSCL(ABS(edge_v)), 3, /ORDER ; 垂直边缘 TV, BYTSCL(gradient), 4, /ORDER ; 梯度幅值 ; 12. 添加标签说明 XYOUTS, dims[0]*0 + 10, 10, '幅度谱', /DEVICE, COLOR=255 XYOUTS, dims[0]*1 + 10, 10, '相位谱', /DEVICE, COLOR=255 XYOUTS, dims[0]*2 + 10, 10, '水平边缘', /DEVICE, COLOR=255 XYOUTS, dims[0]*3 + 10, 10, '垂直边缘', /DEVICE, COLOR=255 XYOUTS, dims[0]*4 + 10, 10, '梯度幅值', /DEVICE, COLOR=255 ; 13. 保持窗口显示 PRINT, '按任意键退出...' WAIT END ``` ### 关键改进解释: 1. **兼容性窗口创建**: ```idl WINDOW, 0, XSIZE=total_width, YSIZE=total_height, TITLE='频域图像处理' ``` 使用传统WINDOW命令而非对象式窗口创建,确保兼容所有IDL版本 2. **设备状态检查**: ```idl DEVICE, GET_DECOMPOSED=decomposedState IF decomposedState THEN DEVICE, DECOMPOSED=0 ``` 检查并设置设备颜色分解状态,避免颜色显示问题 3. **统一窗口显示**: ```idl TV, magnitude, 0, /ORDER TV, BYTSCL(phase), 1, /ORDER ... ``` 所有图像显示在同一个窗口的不同区域(0-4),通过位置索引管理 4. **图像标签说明**: ```idl XYOUTS, dims[0]*0 + 10, 10, '幅度谱', /DEVICE, COLOR=255 ``` 在每个图像左上角添加白色文字标签,提高可读性 5. **简化退出机制**: ```idl PRINT, '按任意键退出...' WAIT ``` 使用WAIT命令保持窗口显示,避免复杂的XMANAGER调用 ### 图像布局说明: ``` | 幅度谱 | 相位谱 | 水平边缘 | 垂直边缘 | 梯度幅值 | |--------|--------|----------|----------|----------| ``` 所有结果并排显示在一个大窗口中,每个子图像宽度为原图宽度 ### 技术原理:频域边缘检测 1. **卷积定理实现**: ```idl ; 空间域卷积 = 频域乘法 conv_h = fft_img * fft_h edge_h = REAL_PART(FFT(conv_h, /INVERSE)) ``` 利用FFT加速卷积运算,复杂度从O(N²)降到O(N log N) 2. **Prewitt算子优势**: - 简单高效,适合快速边缘检测 - 分离为水平和垂直分量,便于方向分析 - 频域实现避免边界效应 3. **结果综合**: ```idl gradient = SQRT(edge_h^2 + edge_v^2) ``` 通过梯度幅值综合水平和垂直边缘信息,获得完整边缘图 ### 使用说明: 1. 将代码保存为`pinlv.pro` 2. 在IDL命令行编译并运行: ```idl .COMPILE pinlv.pro pinlv ``` 3. 按任意键退出程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UnknownBody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值