Month: April 2025
-
具身智能论文和开源系统之-VoxPoser实现思路介绍
这篇文章向大家介绍VoxPoser算法的思路和创新方法。该论文提出了机器人应用中通过开放指令(通用任务)操作开放(通用)物体的一种技术实现方案,实现通过开放语言任务指令到密集的6自由度的终端执行器的任务轨迹合成,为未来日常通用任务机器人的实现提供一种技术思路和发展方向。总体思路和技术途径为:通过大语言模型在基于自由开放的任务指令上的任务理解和任务分解的优势,将自然语言指令转化为系统执行代码。 如图所示为VoxPoser算法流程示意图,一个完整的机器人任务从语言指令下达到路径点轨迹执行的整个过程主要由以下几个部分组成:1、基于代码生成微调后的大语言模型将开放语言指令进行子步骤分解,2、基于每一个步骤的子任务,基于感知模块(后面段落中有具体详细的说明)来构建多种类型的价值地图,过程1和2为如图1中的a部分;3、将各种价值图提供给路径规划算法,路径规划算法首先根据贪心算法找到局部最优的路径点序列,然后基于MPC相关算法来优化运动控制执行参数以驱动机器人执行相应动作,下面就相关过程做一下较为详细的说明。 首先,这篇文章基于LMPS的方法实现机器人通用任务,未来的理想机器人将不限于执行硬编码到系统中固定的操作任务,通过更前瞻的智能模型使得机器人通用操作任务功能成为可能。具体的LMP的原始想法来自于Code as Policies一文[1],这里对相关的多个层级的LMP的分工做一下简要说明(具体实例见引文[2]中的各个类别的LMP的Shots样例说明):1、planner,任务规划,将任务分解为多个子任务;2、composer,根据当前的子任务根据语言参数通过感知模块生成相应的value map LMPs(affordance, avoidance, gripper, rotation等等)。 论文中的感知模块部分pipeline过程较为复杂,包含几个步骤(但代码中并没有给出开源实现,也可以根据实际的物理和机器人部署软硬件环境对感知的pipeline进行自定义):1、基于开放词汇目标检测算法模型(Open-Vocab Detector)来检测特定物体,文中Open-Vocab Detector采用了google提出的OWL-ViT(Open-World Localization via Vision Transformer),该模型可以基于特定目标的语言描述,将图像和文本描述作为输入,输出目标物体的几何信息;2、然后将物体的boundingbox作为SAM(Segment Anything Model)模型的输入获取物体的mask;3、通过视觉跟踪算法对mask进行跟踪;4;跟踪的mask作为RGB-D图像的输入来获取目标物体或(物体的某个部分)的点云信息,在对较为稀疏的点云信息进行smooth插值后获得稠密的地图信息。 价值地图构建(Value Map Composition), 价值地图的结果以(100,100,100,k)形状的张量来表示体素值地图(vox value map),在可供性和约束性地图时k=1,表示cost代价值,在表示旋转地图时,k=4,表示旋转向量。 其次,动作规划(Motion Planner)基于可供性地图和约束性地图构成的价值地图采用贪婪搜索(greedy search)的方法来求解局部最优路径并进行平滑下采样等后处理,然后采用MPC相关算法优化执行参数并驱动硬件执行相关动作,在下一个执行时刻,会基于最新的观测数据重新调用动作规划以保证较高的实时准确性。 图2为相关任务场景和价值地图可视化示例,其中第一行中的“entity of interest”为objects(paper trash和 top drawer handler),可视化轨迹路径为黄色的path线条,下方两行的entity of interest为机械臂的夹爪,轨迹为红色的路径点连接而成的虚线条。 References
-
具身智能论文和开源系统之-Code as Policies实现介绍
这篇文章主要向大家介绍基于大模型的LMPS实现机器人通用任务的方法,该方法名为Code as Policies,这里将向大家介绍其基本的原理和一些实践样例。也将以问答的形式来进行介绍。 问题1:Code as Policies这篇文章的主要思想和实现思路和方法是什么? 回答:基于在代码生成的数据集上微调通用大语言模型增强其生成代码的能力,机器人任务执行的策略代码通过大语言辅助编程得以实现。利用大语言的开放自然语言词汇描述任务,常识知识,推理逻辑等优势为实现机器人通用任务提供了一种概念验证实现,为具身智能的通用智能的实现提供了一种发展方向和路径。 问题2:LMP具有什么样的功能,以及如何通过LLM实现?直接用训练好的通用大模型可以吗? 回答:LMP(language model generated programs)是通过向大模型输入任务描述(用代码生成的数据集微调后的大语言模型)的方式生成可执行的代码。为了使得生成的代码具有面向特定任务,模式和场景,以及特定的感知模块接口,特定的机器人控制等接口的需求,可以采用了few-shot prompting的方法进行In-Context Learning(无需模型再训练更新参数,通过在提示中的样例隐式的推断出满足特定的格式和约束等满足期望的输出),即提供少量的(如5-20个)样例(Examplar/Shots, Prompt Engineering)作为多轮会话大模型的上下文,但它们通常是在实际提问之前一次性提供给模型的,作为初始设定或指令的一部分,以大模型对话历史的格式[2]作为提问prompt的prefix实现特定任务,模式和场景的需求,更多的描述可以参考引文2中问题2的描述。 问题3:LMP在语言生成方面的能力的具体表现有哪些? 回答:LMP在语言生方面的能力具体体现在语言的低层次(low-level)的代码生成上和高层次(high-level)的代码生成上。在low-level的生成能力主要表现为:1、根据语言样例按任务逻辑描述生成特定语言的代码语句的能力;2、特定语言第三方库的使用生成能力,如python的numpy库的一些使用方法;3、应用自定义的接口调用代码生成能力;4、自然语言的推理逻辑在代码中的体现,具体每一方面的语言生成能力示例见引文[2]问题3的第一部分的描述;high-level的生成能力主要表现为:1、语言的控制逻辑的生成,如if-else条件判断,while循环等;2、代码组合的能力和代码嵌套生成的能力等; 问题4:完整的代码组合和嵌套如何在面向机器人领域中用python编程语言进行实现? 回答:这里主要用到了python编程语言的AST 解析功能和exec动态注册延迟执行的特性,使得生成的代码中函数的定义中可以调用其他函数,如引文[2]中的问题4的 lmp_fgen实现了基于LMP的函数生成,该LMP通过AST和exec机制实现了通过不同的LMP实现嵌套子函数的定义以及实现整个代码的生成和执行,详细的机制描述参考引文[2]中的问题4的详细说明。 问题5: Code as Policys论文中的代码生成和问题2中的一般的LMP的代码生成能力有什么不同和特殊性?优势体现在什么地方? 回答:特殊性是使用LMP的原理应用在机器人的策略代码生成这样的领域,其中感知和控制的接口可以作为样例提供给特定的LMP(如调用感知的目标检测的已有算法和API等),以实现约束或背景条件生成。具体更加详细的描述参考引文[2]中的问题4的描述。 References
-
具身智能论文和开源系统之-RLBench简介
本篇文章将向大家介绍RLBench,一个针对机器人研发的基准平台,旨在推动机器人操作常用任务的研发和对比评估。下面将以问答的形式来对RLBench进行介绍(RLBench的安装使用参考引文[1])。 问题1:RLBench和Gym提供的机器人模拟器环境对比,各有什么特色? 回答:RLBench为机器人强化学习等提供了一个基准平台,特别是单臂机器人的常用操作任务提供高保真仿真模拟环境,而gym是强化学习中更加通用的平台,提供了众多基础的物理仿真环境(如小车平衡杆CartPole-v0等,参考引文[2])进行强化学习基础算法实验。RLBench默认使用的是Franka Panda机械臂,也可以支持其他机器人,有人已经移植了UR5等,仿真环境要和真实的机器人尽可能保持一致性(包括外形等几何结构一致性,动力学运动一致性以及仿真控制操作接口一致性),这样Sim2Real时会保持最大限度的兼容,迁移也更为方便和有效。RLBench的源代码里有一个gym.py文件,通过RLBenchEnv Wrapper类将RLBench的物理仿真环境进和Gym仿真环境进行了适配,如果研发人员熟悉了gym的环境,就可以采样gym的接口实现RLBench里定义的任务相关的强化学习等模型的研发。Issac Gym(引文[4])是Nvidia提出的模拟仿真环境,其利用GPU强大的计算能力基于大量并行数据训练人形机器人的运动功能的强化学习模型算法上有较大优势,但CoppeliaSim的仿真度更高,适合高精度操作的工业机器人,更加适合sim2real的实验。具体的更多的信息可以参考引文[3]中的问题1的详细说明。 问题2:RLBench源代码结构及实现上关键点介绍 回答:关于RLBench的核心组件主要有:Scene,Observation,Task,Robot,ActionMode,Enrionment等等。具体每个部分的详细介绍和代码示例请参考引文[3]中的问题2的详细说明。 问题3:具体个性化任务的定义 回答:主要重载Task类中的几个关键函数:init_task,init_episode,variation_count等。具体关于每一个函数的作用及示例介绍请参考引文[3]中问题3的详细说明。 问题4:模拟仿真数据采集过程介绍 回答:主要通过TaskEnvrionment的get_demos函数获取多个episodes的rollout数据,具体的代码可以参考引文[3]中的问题4的详细说明。 References
-
具身智能论文和开源系统之-UniAct实现思路介绍
这篇文章将向大家介绍具身智能通用策略模型UniAct,其主要思想是对异构的具身智能机器人动作空间进行统一表示,然而显示的动作空间在不同的具身智能机器人上面差异较大,这里论文的作者提出了基于隐式的通用动作空间表示方法,认为这些隐式动作元语空间(latent action primitives)中的原子动作(图1中的atomic behaviors)可以通过加权组合成支持多种异构机器人的具体动作。 如图1中的右边部分所示,对于UniAct的结构的解释说明如下:1、多模态大模型Backbone:VLM模型为LlavaOnevisionForConditionalGeneration,支持视觉和自然语言的多模态信息融合(多个模态数据不是进行cross attention计算而是在输入层进行拼接融合);2、universal_actions_codebook为universal action语义信息融合提取层,在这里定义了码本codebook(离散表示空间,如codebook_size=64则表示64个动作元语组成动作元语空间),基于codebook_size=64个latent action primitives的加权和输出universal action embeddings,关于加权和的权重如何通过参数学习可以参考引文[2]中的问题2描述;3、action head,在代码实现中提供了两种head: (1)将universal action embeddings和vision_embedding(vision embedding通过专门的视觉嵌入信息提取模型计算获得)拼接作为三层MLP的输入输出特定的机器人action行为预测(MLP_Decoder);(2)在上面的基础上输入中再多加入本体感知观测数据proprios(ACT_Decoder),具体的描述参考引文[2]中的问题3描述。 论文中进行了较为全面的实验和评估,模型针对真实环境的机器人验证集和模拟环境的机器人数据验证集均做了评估(针对仿真数据做了finetune训练),以及将backbone和codebook的参数进行冻结,来适配新的任务head(如上所述的ACT_Decoder)的模型通用性扩展性验证实验及评估。实验结果说明了模型结构和实验过程的有效性。 References
-
具身智能论文和开源系统之-CrossFormer模型实现代码介绍
本篇文章将向大家介绍支持异构机器人跨模态数据的CrossFormer模型如何实现通用策略模型的模仿学习算法。 在CrossFormer的实现过程中,主要将token区分为task tokens,observations tokens以及readout tokens。依此来实现多模态输入的分词和输出语义的提取。 其中task tokens具体实现时被安排在整个token输入序列的前面(wrapper类为PrefixGroup,the beginning of the token sequence),task的描述规范根据任务不同有不同的定义,如基于抓取动作的任务描述规范一般基于自然语言,而基于导航任务的任务描述规范一般为目标图像(goal image)。基于语言的任务指令描述(language instructions)一般通过FiLM层实现和图像信息的融合,可能是借鉴了RT-1的实现思路,具体的实现可以参考ResNet26FILM类[1]。 observations tokens的wrapper类为TimestepGroup,论文中提到,输入序列中的观测历史长度为k,即为k个时间点的观测数据的集合。 readout的tokens的wrapper类也为TimestepGroup,append到all_timestep_groups的list中,放在observeations的token后面。readout token和BERT的[CLS]特殊token类似,用于提取整个输入的token序列对应的总体语义信息,作为具体的任务head模型组件的输入。但实现时和BERT专门定义的词元[CLS]不同,在Cross Former中以positonal_embedding的形式实现,不同任务readout的tokens个数不同,在生成时将从positonal_embedding中按设定的个数截取即可)。BlockTransformer类的assemble_input_tokens函数实现了将prefix tokens和timestamps tokens进行concatenate形成整体输入。split_output_tokens在transformer架构的backbone的输出张量上做类似于assemble_input_tokens的逆操作逻辑后读取readout对应的张量输出后将其作为输入对接到具体的任务head。 问题1:该开源代码实现中语言指令(language instructions)和图像融合的FiLM代码具体的体现在什么地方? 回答:FiLM的实现可能借鉴了RT-1中的模型中的视觉和语言融合实现的思路,其中具体的实现解释参考引文[3]的问题1及解答。 问题2:不同的观测tokens类型(如图像和本体观测数据)如何实现的融合,是通过一个映射层可学习参数实现不同modality的观测token的融合处理的吗? 回答:get_model_config函数里有定义,针对不同的观测类型有不同的tokenizer,如图像(和自然指令融合)的tokenizer为ImageTokenizer,双臂机器人,四组机器人等的本体感知观测数据的tokenizer为LowdimObsTokenizer。不同类型的tokenizer的词汇表独立,通过线性可学习参数层实现映射到统一的token_embedding_size维度,具体的解释参考引文[3]的问题2及解答。 问题3:readouts的token具体有哪些,如何定义的,和BERT模型的[CLS]类似吗? 回答:在该开源系统的实现中,readouts在实现上以生成位置嵌入的形式存在并concatenate到observations的tokens后面。具体的实现可以参考引文[3]的问题3的回答。 问题4:异构的机器人数据集如何在一起训练,不同horizone窗口的数据对应的tokens输入序列的长度大小不同,是通过padding和mask相结合进行统一处理的吗?以及有什么标记来将transformer的output的embeddings输出给对应的任务head吗? 回答:和一般的LLM模型的批处理方法类似,通过padding和mask实现了不同长度序列的数据的统一训练,可以在generate_attention_mask函数中看一下具体的实现。同时在transformer结构输出时可以根据分组的名称完成split(函数split_output_tokens),和输入时的tokens的组装(assemble_input_tokens)可以看成是互逆的过程,在不同的head进行前向的时候根据不同的readout对应的group的名称的不同,就可以取对应的transformer bacbone输出的output对应的输出(可以类别取BERT的[CLS]位置对应输出的张量)作为对应head的输入进行计算。具体的过程可以参考引文[3]的问题4的回答。 References
-
具身智能论文和开源系统之RLDS及辅助工具库介绍
本篇文章将向大家介绍RLDS数据集格式定义及其提供的辅助工具库的使用,和COCO(Common Objects in Context,上下文中的常见物体,微软开源的计算机视觉任务数据集)数据集的定义和辅助工具cocotools类似。RLDS(Reinforcement Learning Data Schema)为google团队提出的面向强化学习任务的数据集数据模式的定义,本篇文章将简要介绍该数据模式以及相关辅助数据集处理的工具库及关键函数。 具身智能开源数据集OpenX-Embodiment是通过RLDS的格式构建的,将20多种不同的机器人数据进行了综合,由于原先不同数据集的格式存在着较大差异,如Berkeley Cable Routing采用HDFS格式进行存储,Stanford Hydra Dataset采用多个层级的json格式存储actions和观测数据observations等等,RLDS则定义了统一的存储规则即数据模式,同时在实现上以TFRecord进行二进制序列化,并提供了tensorflow_dataset库将其解析为tf.data.Dataset类方便模型训练和验证。 RLDS以层级字典的形式进行标准化的数据格式定义,强化学习的一次完整采样Rollout一般称为trajectory,其数据形式类似于{“steps”:{“observation”:[obs_t1,obst2,…obstn],”action”:[act_t1,act_t2,…act_tn]}}。以下代码为对OpenX-Embodiment的数据集的一个名为fractal20220817_data的子集采用tensorflow_dataset库进行解析的代码示例。OpenX-Embodiment的数据集在google cloud storage(如gs://gresearch/robotics/fractal20220817_data/0.1.0)上采用TFRecord序列化格式进行存储,关于RLDS的数据集的解释请参考文档[5]。 map() 是python的一个内置函数,但在这里tf.data.Dataset类实现了自定义的map函数可以使用在dataset的对象上。tf.data.Dataset类也实现了数据集采样的函数sample_from_datasets,可以从多个数据集按照权重进行采样,具体更加详细的介绍请参见[5]。 在crossfromer代码实现中,采用了dlimp函数库,其对符合RLDS格式的数据集做了进一步的包装,如在处理时去掉了steps[4]层级,数据的表示更加扁平化,具体的更多介绍可以参考[3][6]。 References
-
具身智能论文和开源系统之-CrossFormer实现思路介绍
本篇文章将向大家介绍一篇跨机器人模态的通用策略模型的论文CrossFormer[1]。 在多机器人数据(multi-robot data)上训练单一策略是一个具有挑战的任务,因为机器人的形态,传感器数据,执行器的类别以及相关器件的工作频率等特征多样性使得模型学习到泛化的策略难度增大。这篇文章提出了一个灵活可伸缩的基于Transformer架构的基础策略模型,该模型能够适应接收各种具身机器人(单臂机器人,双臂机器人,轮式机器人,四足机器人,四轴飞行器quadcopters)的异构数据(heterogeneous robot data)作为输入,论文通过充足的实验验证了该模型在性能表现上和针对特定的具身机器人训练的策略模型相当,同时超越了当前最好的跨多种具身机器人学习的模型算法(cross-embodiment learning)。 如图所示,该模型借鉴了之前基于Transformer架构训练多模态数据的一些思路,对观测数据和任务描述规范采用模态专属的分词器进行分词后组合成输入tokens序列。骨干网络为基于Transformer的时序因果解码器架构的自回归模型,输出的嵌入(output embeddings)将作为任务相关的head(如图所示有Quadruped Action Head,Single Arm Action Head,Navigation Action Head,Bimanual Action Head)的输入,通过专属head的计算输出为行为相关特定维度的输出。 观测数据主要有外部环境观测数据(如图像和激光点云)以及机器人本体感知观测数据(本体感知观测,Proprioceptive Observations,指的是机器人对自身状态的感知如关节几何夹爪的姿势和机器人部件的物理状态如加速度,角速度,温度等)将这些数据不同模态的观测数据采用不同的分词器进行分词后通过可学习的线性层映射到统一大小维度的词嵌入空间。一般任务的描述和定义用自然语言或全局图像(如导航任务中)或两者结合,语言和图像多模态数据的融合采用FiLM模块[7](RT-1模型也采用的该组件结构)。 在实验室该模型使用了20种不同的具身机器人的数据,具体详细的信息为:(1)Open Cross-Embodiment数据集的单臂机器人操作数据子集[3],该数据自己在Octo算法中被采用;(2)DROID Franka(DROID Distributed Robot Interaction Dataset)机器人操作数据集[4];(3)来自两个组织的7K个ALOHA机器人的轨迹数据ALOHA-multi-task[5];(4)60小时来自GNM数据集的导航数据[6];(5)25分钟的Go1四组机器人行走数据(通过在模拟环境中训练出的专家模型通过Rollout过程收集收据);(6)在实验过程中通过Franka机器人自行收集的200个轨迹数据。 不同数据集的数据通过转化后如数的tokens的序列长度可能不同,和LLM类似采用padding和mask实现不同的数据集的统一训练,transformer的输出embeddings根据输入的type输入到特定任务的head,实现了多个不同机器人不同任务数据的混合训练,实现了backbone参数共享的统一策略的模型。 关于crossformer的代码实现在后续的文章种将进一步进行较为详细的介绍。 References
-
具身智能论文和开源系统之-AnyGrasp实现思路简介
这篇文章将向大家简要介绍机器人夹爪时空位姿感知方面的一篇论文”AnyGrasp”[1]的实现思路,其也是上篇介绍文章GraspNet[2]的后续研究。 空间几何处理模块基本沿用了类似GraspNet的网络结构,但在输出的维度上做了更新:1、depth加了一个等级;2、有一个stable_score的度量(metric),和现有的graspnet的score采用重参化技巧相结合。 其更多的创新之处在于在空间几何处理模块(左边GSNet部分)的基础之上,添加了一个时间相关的模块(Temporal Association Module)来实现抓取位姿的跟踪功能(grasp pose tracking),该跟踪模块主要组成为(具体可以将解释和图1中的结构图进行对照理解):1、特征提取功能,纹理和颜色可以给tracking提供相关的线索信息,对于种子点的的approaching vector和GSNet中的基于cylinder grouping的特征分组类似的方法对点云的颜色信息进行聚合计算并通过MLP和Pooling后形成颜色特征;2、特征组合功能,和GSNet前向过程形成的相关特征拼接后连接MLP形成M个种子点的夹爪位姿的C个通道的feature输出,并和在时间Buffer里存储的上一帧的夹爪姿态的C个通道特征输出计算相关性(如通过计算特征间的余弦夹角来获取特证间的相似度得分similarity score,形成M*M的对应矩阵correspondence matrix)。在计算loss时,根据上一帧的每一个位姿,将当前帧与其距离在一定小范围内的抓取位姿集合一起计算损失函数,损失函数定义思路为增大相似姿势的相似性抑制距离较大姿势间的相关性,具体可以参考[1]中的公式描述。 其中在训练的过程中,首先训练几何处理模块,待几何处理模块收敛之后,则将其参数进行冻结继续训练连接在后面的时间关联模块。在训练时间模块的时候,对数据集有特殊要求,具体实验时的mini-batch的大小设置为4对点云帧数据,其中每对数据为同一场景下采集时间上连续的点云帧和对应的姿态。 关于代码实现,作者开源了其推理部分的代码,可以参考[3]。 References