tidybot
本代码发布配套以下项目:
TidyBot: 基于大型语言模型的个性化机器人助手
Jimmy Wu, Rika Antonova, Adam Kan, Marion Lepert, Andy Zeng, Shuran Song, Jeannette Bohg, Szymon Rusinkiewicz, Thomas Funkhouser
《自主机器人(AuRo) - 特刊:机器人中的大型语言模型》, 2023年
2023年IEEE/RSJ国际智能机器人与系统会议(IROS)
摘要: 为了有效地提供个性化的物理协助,机器人必须学习可以广泛应用于未来场景的用户偏好。在本研究中,我们探讨了家庭清洁机器人的个性化,这些机器人可以通过拾起物品并将其放好来整理房间。一个关键挑战是确定每个物品的适当存放位置,因为人们的偏好可能因个人品味或文化背景而有很大差异。例如,一个人可能喜欢将衬衫存放在抽屉里,而另一个人可能更喜欢放在架子上。我们的目标是构建能够从与特定人的少量先前互动中学习这些偏好的系统。我们展示了机器人可以将基于语言的规划和感知与大型语言模型(LLMs)的少样本总结能力相结合,从而推断出可广泛应用于未来互动的一般化用户偏好。这种方法实现了快速适应,在我们的基准数据集上对未见过的物体达到了91.2%的准确率。我们还在一个名为TidyBot的真实世界移动操作机器人上演示了我们的方法,该机器人在真实世界测试场景中成功地放置了85.0%的物体。
概览
以下是本代码库的组织结构概览:
server
: TidyBot的服务器代码(在GPU工作站上运行)robot
: TidyBot的机器人代码(在移动基座计算机上运行)stl
: 3D打印部件的文件benchmark
: 基准数据集的代码
设置
我们推荐使用Conda环境。我们的设置(在Ubuntu 20.04.6 LTS上测试)使用以下3个环境:
- 服务器上的
tidybot
环境,用于一般用途 - 机器人上的
tidybot
环境,用于一般用途 - 服务器上的
vild
环境,仅用于物体检测
有关详细的设置说明,请参阅server
和robot
目录中的各自README。
TidyBot 快速入门
除非另有说明,应始终使用tidybot
Conda环境:
conda activate tidybot
遥操作模式
我们提供了一个遥操作界面(teleop.py
)来使用拾取、放置或投掷等原语操作机器人。
首先,在服务器(工作站)上运行此命令以启动遥操作界面,其中<robot-num>
是1
、2
或3
,取决于要控制的机器人:
python teleop.py --robot-num <robot-num>
在机器人(移动基座计算机)上,确保便捷停止和移动基座驱动程序都在运行。然后,运行此命令以启动控制器:
python controller.py
一旦服务器和机器人都显示它们已成功相互连接,使用以下控制来遥操作机器人:
- 点击俯视图像以选择路径点
- 按
<Enter>
在机器人上执行选定的路径点 - 按
<Esc>
清除选定的路径点或停止机器人 - 按
0
至5
更改选定的原语 - 按
q
退出 - 如有必要,使用便捷停止来终止控制器
- 如有必要,使用紧急停止来切断机器人的电源(移动基座计算机将保持开启状态)
注意:
- 如果按键没有反应,请确保遥操作界面是活动窗口
- 默认原语(索引
0
)仅用于移动(不使用机械臂)。要使用机械臂,你需要将选定的原语更改为其他选项。查看终端输出以查看所有原语的列表以及当前选定的原语。
要使用占用地图而不是手动点击路径点来生成路径,请使用--shortest-path
标志。
python teleop.py --robot-num <robot-num> --shortest-path
这将加载scenarios/test.yml
中指定的容器作为障碍物,并构建一个占用地图以避免撞到它们。
要额外显示调试可视化,可以使用--debug
标志。
服务器:
python teleop.py --robot-num <robot-num> --debug
机器人:
python controller.py --debug
全自主模式
要在全自主模式下操作机器人,我们使用demo.py
中的演示界面。默认情况下,演示将加载scenarios/test.yml
中的测试场景以及preferences/test.yml
中相应的LLM总结的用户偏好。
要在服务器上启动演示,首先使用vild
Conda环境启动物体检测服务器:
conda activate vild
python object_detector_server.py
然后,在另一个终端中,启动演示界面(使用tidybot
环境):
python demo.py --robot-num <robot-num>
在机器人上,确保便捷停止和移动基座驱动程序都在运行。然后,运行此命令以启动控制器:
python controller.py
以下是用于运行演示的控制:
- 按
<Enter>
启动机器人 - 随时按
<Esc>
停止机器人 - 按
0
进入监督模式(默认模式),在该模式下,机器人将等待人工批准(通过<Enter>
按键)才执行每个命令 - 按
1
进入自主模式,在该模式下,每当按下<Enter>
时机器人将开始执行命令,每当按下<Esc>
时停止移动 - 按
q
退出 - 如有必要,使用便捷停止来终止控制器
- 如有必要,使用紧急停止来切断机器人的电源(移动基座计算机将保持开启状态)
注意:如果按键没有反应,请确保演示界面是活动窗口。
要加载不同的场景(默认为test
),请使用--scenario-name
参数:
python demo.py --robot-num <robot-num> --scenario-name <scenario-name>
例如,要加载scenario-08
并使用机器人#1,你可以运行:
python demo.py --robot-num 1 --scenario-name scenario-08
要额外显示调试可视化,可以使用--debug
标志。
服务器:
python demo.py --robot-num <robot-num> --debug
机器人:
python controller.py --debug
故障排除
移动基座精度
标记检测设置应输出厘米级精度的2D机器人姿态估计。例如,我们的设置可以可靠地从地板上拾取小型乐高得宝积木(32毫米 x 32毫米)。不准确的标记检测可能由多种原因造成,如相机对准不准确或相机设置不佳(例如曝光和增益,参见utils.py
中的get_video_cap
)。另外请注意,移动底座电机应校准(.motor_cal.txt
)以实现更精确的移动。
机械臂精度
3个Kinova机械臂具有可重复性,但零位方向略有不同,因此需要一些补偿以保持一致性。请参见controller.py
中针对不同机械臂的方向补偿。
服务器端口
如果多人使用过服务器,您可能会遇到以下错误:
OSError: [Errno 98] 地址已被使用
要终止所有占用端口的进程,您可以使用clear-ports.sh
脚本(需要sudo权限):
./clear-ports.sh
供参考,以下是此代码库使用的所有端口:
6000
:相机服务器(顶部相机)6001
:相机服务器(底部相机)6002
:标记检测器服务器6003
:物体检测器服务器6004
:机器人1控制器服务器6005
:机器人2控制器服务器6006
:机器人3控制器服务器6007
:机器人1控制6008
:机器人2控制6009
:机器人3控制6010
:机器人1相机6011
:机器人2相机6012
:机器人3相机
相机错误
顶部相机可能偶尔会输出如下错误:
[ WARN:16@1367.080] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/v4l/by-id/usb-046d_Logitech_Webcam_C930e_E4298F4E-video-index0): select() timeout.
[ WARN:16@2049.229] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/v4l/by-id/usb-046d_Logitech_Webcam_C930e_099A11EE-video-index0): select() timeout.
Corrupt JPEG data: 36 extraneous bytes before marker 0xd9
Corrupt JPEG data: premature end of data segment
通常,这些错误可以通过拔插相机来解决。
请务必检查USB延长线的质量和长度,因为USB 2.0不支持超过5米的线缆长度。
引用
如果您发现这项工作对您的研究有用,请考虑引用:
@article{wu2023tidybot,
title = {TidyBot: Personalized Robot Assistance with Large Language Models},
author = {Wu, Jimmy and Antonova, Rika and Kan, Adam and Lepert, Marion and Zeng, Andy and Song, Shuran and Bohg, Jeannette and Rusinkiewicz, Szymon and Funkhouser, Thomas},
journal = {Autonomous Robots},
year = {2023}
}